交易策略开发的脚本语言

14

我目前正在开发一款交易产品的组件,允许量化分析师或策略开发者编写自己的定制化策略。显然,我不能让他们使用本地编译语言(甚至是编译成字节码在虚拟机上运行的语言),因为他们的开发/测试周期必须在几分钟内完成。

到目前为止,我已经尝试了lua、python、ruby,并且非常喜欢它们,但仍然觉得这些语言对于我的目标用户来说有点“低级”。那么,我需要编写自己的解析器和解释器来支持一种最基本的循环、简单算术和逻辑表达式求值的语言吗?还是你们中的其他人有其他建议?感谢您的帮助。


1
你的编程语言是否需要是图灵完备的,或者你只需要确保它能停机? - Earlz
11个回答

10

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

当人们制作类似于这个模板模块时,他们几乎总是会首先发明一种专门的语法来进行替换。例如,他们构建它,使得像%%VAR%%这样的字符串将被$VAR的值替换掉。然后他们意识到需要额外的格式化,于是他们加入了一些用于格式化的特殊语法。然后他们需要循环,于是他们发明了一个循环语法。很快,他们就有了一个新的小型模板语言。

这种方法有两个问题:首先,他们的小语言是残缺的。如果您需要做一些作者没有想到的事情,那么您就会失败。第二个问题:谁想学另一种语言呢?

如果你编写自己的小语言,你可能会陷入相同的困境——维护一个由设计上存在缺陷的工具的语法和解析器。

如果真正的编程语言看起来有点过于底层,那么解决方案不是放弃该语言,而是为你的最终用户提供更高级别的实用函数,这样他们可以使用熟悉的概念操作,而不会陷入底层语言的细节。

这允许初学者在高水平上操作;然而,您和任何具备此能力的最终用户——即超级用户——仍然可以利用Ruby或Python等完整的功能。


8
似乎您需要为用户创建某种特定领域语言(DSL),该语言可以松散地构建在目标语言之上。Ruby、Python和Lua都有各自的语法怪癖,通过巧妙的函数定义可以在一定程度上解决其中一些问题。
一个相当强大的DSL示例是Cucumber,它通过一系列应用于输入数据的正则表达式将用户指定的措辞转换为实际可执行代码。
另一个选择可能是JavaScript,或者某种到JavaScript的DSL桥接,因为这样可以使策略在客户端或服务器端运行。由于客户机通常比负载较重的服务器具有过剩的计算能力,因此这可能有助于扩展您的应用程序。

3
Ruby 对于编写领域特定语言 (DSLs) 特别擅长(可选的圆括号和块有助于这一点)。请查看 Martin Fowler 关于 Ruby 的 Rake 的文章:http://martinfowler.com/articles/rake.html。 - horseyguy

1
无论您选择什么,都需要定制模块来定义公司的高级结构。
以下是我预见到的一些需求 - 您可能已经涵盖了其中的一些:将当前位置、当前和历史行情、以前的绩效数据等等...导入应用程序。定义/回测/发送各种订单(限价/市价/止损、交易所、触发器)或期权参数等等... 您可能需要多个沙盒进行测试以及真实操作。
量化分析师希望能够进行矩阵运算、随机微积分、偏微分方程等等。
如果您想在Python中完成这项工作,那么加载NumPy将是一个好的开始。
您也可以从专为数学金融研究设计的专有系统开始,例如基于Mathematica或Matlab构建的系统。

1

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


1

0

你的目标是类似于Processing的复杂度水平吗? Processing是一个很好的例子,它将完整的语言(Java)简化为仅适用于问题域(在Processing的情况下是可视化问题域)的子集。

这里是来自Processing文档的一个小小的并排比较。

Java:

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

处理中:

background(0);

正如其他人所建议的那样,您可以编写足够多的高级函数,以便大部分复杂性对用户隐藏,但在必要时仍保留执行更低级别操作的能力。 Arduino 的Wiring语言采用这种策略,在C语言的基础上使用薄层高级函数,以使其更易于非程序员和爱好者使用。

0

这可能有点简单化,但很多量化用户习惯于使用Excel和VBA宏。像VBScript这样的东西是否可用,因为他们可能在这个领域有一些经验。


0

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

然而,你只需要“最基本的循环支持、简单算术、逻辑表达式求值”。

我不明白问题出在哪里。你只需要几个功能。你提供的语言列表有什么问题吗?它们实际上提供了这些功能?

是什么导致了这种脱节?请随时更新您的问题以扩展问题所在。


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

0

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

然后选择语言。几乎可以肯定地说,您会想使用DSL。在我看来,Ruby和Lua都非常擅长这方面。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接