为什么对冲基金和金融服务公司经常使用OCaml?

29

与一些量化分析师/对冲基金交谈后,我得出结论:他们中的大多数似乎在许多任务中使用自制语言或OCaml。但其中许多人无法回答为什么。

我当然可以理解为什么他们大多不想使用C++,但相比其他脚本语言,比如Python、Ruby等,为什么OCaml在这些用途上更卓越?


7
除了简街资本外,我不知道还有哪些对冲基金或金融服务机构使用OCaml。 - Jackson Tale
除了C++或Java之外,如果不使用OCaml,他们会使用什么? - liang
GS使用一种专有语言称为Slang https://www.efinancialcareers.com/news/2017/05/slang-goldman-sachs 将其视为Perl的可怕版本。 - Dwight J. Browne
9个回答

27
尝试阅读Yaron Minsky和Stephen Weeks的Caml trading - experiences with functional programming on Wall Street(抱歉,虽然此文章曾经在Jane Capital免费托管,但现在已不再提供,因此我留下ACM链接供参考)。他们详细介绍了他们认为OCaml的优点和缺点,尽管他们大多数情况下认为它比他们考虑过的大多数其他选项更好(即没有与C ++,Python等进行直接比较)。
作者在投资了大量OCaml代码的Jane Street Capital工作。 更新:另请参见What programming language(s) is algorithmic trading software written in?线程。其中一条comments提到Yaron Minsky在CMU上关于Jane Street Capital使用Caml的演讲。约一个小时长,非常有趣。 更新二:Yaron还撰写了另一篇概述,这次是为ACM Queue撰写的,名为OCaml for the Masses

Caml交易论文的链接已失效。你有完整文本的链接吗?我搜索的每个地方都需要付费获取期刊访问权限。 - Petrus Theron
抱歉,看起来Jane Capital不再托管它了。我尝试在其他地方找到它,但只有ACM有。我会留下那个链接给能够访问它的人。奇怪的是,StackOverflow的链接也失效/丢失了。有人知道它们发生了什么或如何恢复它们吗? - Don Wakefield
3
这个链接的帖子和相关评论已经失效,但是讨论在这里:https://youtu.be/hKcOkWzj0_s - Jon Church

15

例如,可以查看编程语言大赛以进行速度比较:

现在,我们都听说过“谎言、该死的谎言和统计数字”,因此建议持有怀疑态度——但这是一个相当不错的比较。归根结底,重要的是使用自己的问题和数据完成工作。


2
+1!这就是他们渴望的速度,拥有函数作为一等对象和多个尾递归。 - wheaties
http://shootout.alioth.debian.org/u64q/benchmark.php?test=all&lang=ocaml&lang2=python&box=1 看起来并不是针对 OCaml vs Python,而是针对 OCaml vs Haskell - Jackson Tale

12
首先要记住的是,尽管OCaml有REPL和清晰、简洁的语法,它不像Python或Ruby一样是一种动态语言。它具有静态类型,并编译成本机代码。
对于量化分析,脚本语言更加方便。您可以访问许多库,很容易快速处理信息和构建小到中型程序,即使您不是程序员。
对于创建实际参与交易的算法和系统,您需要像OCaml这样的东西。 OCaml的主要优点是其功能性质,可读性(它几乎像Python这样的动态语言一样易读),可靠性,但最重要的是速度。OCaml比大多数人想象的要快得多 - 它比C快(实际上比C略慢,但比动态语言快得多)。 OCaml足够快,可以创建一个HFT系统,而对于Python或Ruby,则无法做到这一点。
此外,请记住,Jane Street(最强烈的OCaml鼓吹者)在Scala和Clojure出现之前就采用了OCaml。

我意识到,高频交易(HFT)不再像你在2012年写这个回答时那样热门,但你是否知道有哪些用OCaml编写的HFT系统? - Ellie Kesselman
我意识到,高频交易(HFT)在您于2012年写下这个答案时已经不再像以前那样重要了,但您是否知道有没有用OCaml编写的任何HFT系统? - undefined

9
作为一种函数式语言,OCaml 从本质上讲是数学的,这可能非常适合这些公司需要解决的问题类型。正如其他人指出的那样,它具有良好的性能特征。或许这就是为什么微软采用 OCaml 开发 F# 的原因。

5

因为它非常快(比C++更简洁)。


3
跟随唐的帖子,Jane Street Captial甚至有一个专门用于OCaml的页面,还有进一步链接到他们的OCaml参与(包括一个博客)。 - OCaml的性能通常是一个很大的争议点,但我认为“量化交易员”也喜欢它,因为函数式编程范式非常适合他们的分析工作,所以我认为他们是早期采用者。然后公司发现它同样适用于系统编程。
更新:链接大多已经失效,而且很难更新。目前Jane Street似乎对他们仍然存在的OCaml参与变得不太公开。

2

我不在那样的地方工作,所以以下只是我在他们的位置可能会这样做的猜测:

相比于像 Ruby 和 Python 这样的语言,它通常要快得多,并且作为一种静态类型的函数式语言,通常更容易推理代码并知道它不包含微妙的错误。 (是的,单元测试也应该有助于捕获这些错误,但额外的保证您的财务数字没有被搞砸是很好的。)此外,函数式编程与数学密切相关,比大多数高级语言范例更加紧密(例如,没有面向对象的数学分支),因此它擅长建模他们实际在做什么。


你不能说范畴论是数学的面向对象分支,因为有许多函数式建模范畴论的方法。 - JasonTrue
如果范畴论是数学的面向对象分支,那么Haskell就是一种面向对象的语言。我不认为面向对象的语言比任何其他具有类型系统的语言更努力地成为范畴论的计算机近似。 - Chuck
我想是的,但是对象系统理论的相当一部分来自范畴论。当然,一旦转化为面向对象语言,这些思想就不那么抽象了,它们看起来也不太相似。 - JasonTrue

1

相比Python/Ruby,F#的平凡并行化更容易实现。虽然Caml/OCaml的原因不同,但也应该是如此。

尽管我很喜欢Ruby,但它不是我处理大量数学或聚合任务的首选,而且Python和Ruby都没有真正支持多线程。

模式匹配的简洁性以及对不可变性的偏好(在Ruby中难以强制执行,在Python中略微容易但仍然比基于ML的语言难)对于大数据集的计算非常有价值。


1
在OCaml中,并行处理实际上有点棘手 - 整个语言具有全局锁定,因此一次只能有一个线程执行OCaml代码。您必须分开其他进程以使用多个核心或CPU。 - Chuck
哇,真遗憾。我想这意味着它与 Python 处于大致相同的地位,除了所有漂亮的模式匹配和更普遍的不可变性。 - JasonTrue
3
@Chuck:您现在可以使用多核Ocaml了:https://github.com/ocamllabs/compiler-hacking/wiki/Multicore-OCaml - Igor Chubin
Multicore OCaml即将到来,但我也希望看到OCaml采用Libuv库,这样我们就可以创建类似Node.js的事件驱动服务器,详情请见:https://github.com/fdopen/uwt - Alexander Mills

0
在我的量化交易经验中,使用的是VBA(即Excel)与C#或F#。我个人不知道有任何量化交易员使用Caml...

是的,我认为在绝大多数情况下这是正确的,但也似乎有相当数量(增长?)的情况下,其他语言/设置被用于更复杂的处理... - oneAday

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