14

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

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

4

11 回答 11

10

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

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

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

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

如果一个真正的编程语言看起来有点太低级,解决方案可能不是放弃该语言,而是为您的最终用户提供更高级别的实用功能,以便他们可以使用熟悉的概念操作而不会陷入困境底层语言的杂草。

这允许初级用户在高水平上操作;但是,您和任何对此有诀窍的最终用户(您的超级用户)仍然可以充分利用 Ruby 或 Python 或其他任何东西的强大功能。

于 2010-02-19T16:51:50.770 回答
8

听起来您可能需要为您的用户创建某种领域特定语言 (DSL),这些语言可以松散地构建在目标语言之上。Ruby、Python 和 Lua 在语法方面都有其不同的怪癖,并且在某种程度上可以通过巧妙的函数定义来处理其中的一些怪癖。

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

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

于 2010-02-19T16:43:01.043 回答
1

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

以下是我设想的一些需求——您可能已经涵盖了其中的一些需求:一种将当前头寸、当前和历史报价、以前的业绩数据等获取到应用程序中的方法。定义/回测/发送各种订单(限价/市场/止损,什么交易所,触发器)或选项参数等......您可能需要多个沙箱来测试以及真实的东西。

Quants 希望能够进行矩阵运算、随机微积分、偏微分方程。
如果您想在 python 中执行此操作,那么加载 NumPy 将是一个开始。

您还可以从设计用于进行数学金融研究的专有系统开始,例如基于 Mathematica 或 Matlab 构建的系统。

于 2010-02-19T16:42:46.713 回答
1

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

于 2012-04-14T03:40:10.677 回答
1

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

于 2012-12-22T06:14:24.940 回答
0

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

于 2010-02-19T16:45:00.237 回答
0

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

然而,您所需要的只是“对循环、简单算术、逻辑表达式求值的最低支持”

我不明白这个问题。您只需要一些功能。您提供的语言列表有什么问题?他们实际上提供了这些功能吗?

什么是断线?随时更新您的问题以扩展问题所在。

于 2010-02-19T16:49:00.653 回答
0

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

于 2010-02-19T17:09:42.553 回答
0

首先定义语言——如果可能,使用称为 EBN 的伪语言,它非常简单(参见 Wikipedia 条目)。

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

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

于 2010-02-19T18:12:27.287 回答
0

处理您所追求的复杂程度是否符合您的要求?处理是采用成熟语言 (Java) 并将可用语法减少/简化为仅适用于问题域的子集(问题域 = 处理中的可视化)的一个很好的例子。

这是来自处理文档的一点并排比较。

爪哇:

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

加工:

background(0);

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

于 2010-02-19T18:45:26.510 回答
0

我一直在同一条船上使用自己的软件构建和交易。Java 不是很好,因为您想要像您说的那样更高级别的东西。我使用 eclipse 项目 xtext 取得了很大的成功。http://www.eclipse.org/Xtext它为您完成了构建解析器等的所有工作,并且使用 Eclipse,您可以使用功能编辑器快速生成代码。我建议您在考虑其他选择时对此进行调查。这与 eclipse 建模框架相结合对于快速构建听起来像您需要的 DSL 非常强大。- 邓肯

于 2012-08-05T03:36:24.767 回答