交易策略开发的脚本语言

时间:2010-02-19 16:31:00

标签: python ruby scripting dsl trading

我目前正在研究交易产品的一个组件,它允许量化或策略开发人员编写自己的自定义策略。我显然不能让他们用本机编译的语言编写这些策略(甚至是编译为在vm上运行的字节码的语言),因为他们的开发/测试周期必须是几分钟。

到目前为止,我已经看过lua,python,ruby并且真的非常喜欢它们,但仍然发现它们对我的目标用户来说有点“低级别”。我是否需要以某种方式编写自己的解析器+解释器来支持最少支持循环,简单算术,逻辑表达式评估的语言,或者您是否还有其他建议?提前致谢。

11 个答案:

答案 0 :(得分:10)

Perl的Text::Template模块的作者Mark-Jason Dominus提供了一些可能相关的见解:

  

当人们制作模板模块时   像这样,他们几乎总是如此   首先要发明一种特殊的语法   换人。例如,他们   构建它,以便像%% VAR %%这样的字符串   被替换为$ VAR的值。   然后他们意识到需要额外的   格式化,所以他们放入一些   格式化的特殊语法。然后   他们需要一个循环,所以他们发明了一个   循环语法。他们很快就有了   新的小模板语言。

     

这种方法有两个问题:第一,   他们的小语言瘫痪了。如果   你需要做一些作者   没有想到,你输了。第二:   谁想学习另一种语言?

如果你编写自己的迷你语言,你可能会陷入同样的​​困境 - 维护语法和解析器,使其成为一种因设计而瘫痪的工具。

如果真正的编程语言看起来有点过于低级,那么解决方案可能不是放弃语言,而是为最终用户提供更高级别的实用功能,这样他们就可以使用熟悉的概念进行操作而不会陷入困境在基础语言的杂草中。

这允许初级用户在高级别操作;但是,您和任何具有诀窍的最终用户 - 您的超级用户 - 仍然可以充分利用Ruby或Python的全部功能。

答案 1 :(得分:8)

听起来您可能需要为您的用户创建某种特定于域的语言(DSL),这些语言可以在目标语言之上松散地构建。 Ruby,Python和Lua都有各种关于语法的怪癖,在某种程度上,其中一些可以通过巧妙的函数定义进行按摩。

一个相当强大的DSL的例子是Cucumber,它实现了一个有趣的策略,即通过应用于输入数据的一系列正则表达式将用户指定的词汇转换为实际的可执行代码。

另一个候选者可能是JavaScript,或某种DSL到JavaScript桥接器,因为这将允许策略在客户端或服务器端运行。这可能有助于扩展您的应用程序,因为与负载很重的服务器相比,客户端计算机通常具有过剩的计算能力。

答案 2 :(得分:1)

无论您选择什么,都需要定制模块来定义您公司的高级构造。

以下是我设想的一些需求 - 您可能已经涵盖了其中的一些:将当前位置,当前和历史报价,之前的性能数据等提供到应用程序中的方法。定义/回测/发送各种订单(限制/市场/停止,交换,触发器)或选项参数等...您可能需要多个沙箱进行测试以及真实的东西。

Quants希望能够进行矩阵运算,随机微积分,偏微分方程 如果你想在python中这样做,加载NumPy将是一个开始。

您还可以从专门的系统开始,该系统旨在进行数学金融研究,例如在Mathematica或Matlab之上构建的东西。

答案 3 :(得分:1)

我一直在研究Python算法交易库(实际上是用于回溯测试,而不是用于真实交易)。您可能需要查看它:http://gbeced.github.com/pyalgotrade/

答案 4 :(得分:1)

使用MATLAB作为脚本语言,查看http://www.tadeveloper.com的回测框架。 MATLAB的优势在于它非常强大,但您无需成为程序员即可使用它。

答案 5 :(得分:0)

这可能有点简单,但很多量子用户习惯使用Excel& VBA宏。像VBSCript这样的东西可以使用,因为他们可能在这方面有一些经验。

答案 6 :(得分:0)

现有语言对我的目标用户来说“有点”低级别。“

然而,你所需要的只是“对循环,简单算术,逻辑表达式评估的最小支持”

我没有遇到问题。您只需要一些功能。您提供的语言列表有什么问题?他们实际上提供这些功能?

断开了什么?随意更新您的问题以扩展问题所在。

答案 7 :(得分:0)

我会使用Common Lisp,它支持快速开发(您有一个正在运行的图像,可以编译/重新编译单个函数)并为您的域定制语言。您将提供函数和宏作为表达策略的构建块,并且用户可以使用整个语言来组合这些。

答案 8 :(得分:0)

首先定义语言 - 如果可能,使用名为EBN的伪语言,它非常简单(参见维基百科条目)。

然后,一旦你有了,选择语言。几乎可以肯定你会想要使用DSL。 Ruby和Lua都非常擅长,IMO。

一旦你开始工作,你可能会发现你回到你的定义并进行调整。但我认为这是做事的正确顺序。

答案 9 :(得分:0)

你所拍摄的复杂程度是Processing的某些内容吗?处理是一个很好的例子,可以使用完整的语言(Java)并将可用语法简化或简化为适用于问题域的子集(问题域=处理时的可视化)。

这是与Processing docs的一点点并列比较。

爪哇:

g.setColor(Color.black)
fillRect(0, 0, size.width, size.height);

处理:

background(0);

正如其他人所建议的那样,您可以简单地编写足够的高级函数,以便大部分复杂性对用户隐藏,但您仍然可以在必要时保留更多低级别的功能。 Arduino的布线语言遵循这样的策略:在C之上使用薄层高级函数,以使非程序员和业余爱好者更容易访问。

答案 10 :(得分:0)

我一直在同一艘船上建造并使用我自己的软件进行交易。 Java并不是很好,因为你想要像你说的更高级别的东西。我使用eclipse项目xtext取得了很大的成功。 http://www.eclipse.org/Xtext它为您构建解析器等的所有管道并使用eclipse,您可以使用功能编辑器快速生成代码。我建议您在考虑其他选项时也要考虑这个问题。结合eclipse建模框架非常强大,可以快速构建听起来像你需要的DSL。 - 邓肯