哪种编程语言用于计算密集型交易组合模拟?

时间:2010-06-13 05:45:43

标签: java python trading

我正在建立一个交易组合管理系统,负责非高频交易组合的生产,优化和模拟(处理1分钟或3分钟的数据条,而不是标记数据)。

我计划使用亚马逊网络服务来承担整个应用程序的负担。

我有四种选择,我正在考虑作为语言。

  1. 爪哇
  2. C ++
  3. C#
  4. 的Python
  5. 这是项目范围极端的范围。这不是它的方式,也许永远不会,但它符合要求的范围:

    • 10,000,000个交易系统的每周模拟。
    • (每个交易系统都有自己的数据挖掘方法,包括特征选择算法,这些算法的计算成本非常高。想象一下使用包装器的500-5000个功能。这些都不是经常运行的,但它仍然是一个考虑因素)
    • 实时生产具有100,000个交易策略的投资组合
    • 从全球每个股票/期货市场(约100,000)收集1分钟或3分钟的数据
    • 投资组合的投资组合优化,最多可达100,000个策略。 (相当密集的算法)

    速度是一个问题,但我相信Java可以处理负载。

    我只是想确保Java CAN能够轻松地处理上述要求。我不想在C ++中使用该项目,但如果需要,我会这样做。

    C#之所以存在,是因为我认为它是Java的一个很好的替代品,即使我根本不喜欢Windows,如果所有的东西都相同,我会更喜欢Java。

    Python - 我读过有关PyPy和pyscho的事情,声称python可以通过JIT编译进行优化,以接近类似C的速度运行......这几乎是它在这个列表上的唯一原因,除了这个事实Python是一种很棒的语言,可能是最令人愉快的编码语言,这对于这个项目来说根本不是一个因素,而是一种振作。

    总结一下:

    • 实时制作
    • 每周模拟大量系统
    • 每周/每月优化投资组合
    • 收集数据的大量连接

    没有处理毫秒甚至第二笔交易。唯一的考虑因素是Java是否可以在分散必要数量的EC2服务器时处理这种负载。

    非常感谢你们的智慧。

7 个答案:

答案 0 :(得分:5)

选择您最熟悉的语言。如果你平等地了解它们并且速度是一个真正的问题,请选择C.

答案 1 :(得分:5)

虽然我是Python的忠实粉丝而且我不喜欢Java,但在这种情况下,我必须承认Java是正确的方法。

对于许多项目来说,Python的性能不是问题,但在您的情况下,即使是轻微的性能损失也会非常快。我知道这不是一个实时模拟,但即使是批量处理,它仍然是一个需要考虑的因素。如果事实证明一个虚拟服务器的负载太大,那么实现速度提高一倍的实施将使虚拟服务器成本减半。

对于许多项目,我也认为Python可以让你更快地开发解决方案,但在这里我不确定是不是这样。 Java拥有世界一流的开发工具和顶级的企业级框架,用于并行处理和跨服务器部署,虽然Python在这方面有解决方案,但Java显然具有优势。您还拥有Python无法匹配的Java架构选项,例如Javaspaces。

我认为C和C ++对这样的项目施加了太多的开发开销。它们是可行的,如果你非常熟悉这些语言,我相信它是可行的,但除了可能提高性能之外,它们没有别的东西可以带到桌面上。

C#只是Java的重写。如果你是Windows开发人员并且如果你更喜欢Windows,我会使用C#而不是Java,这不是一件坏事,但如果你不关心Windows,就没理由关心C#。

答案 2 :(得分:4)

用您的首选语言书写。对我来说听起来像蟒蛇。当您开始运行系统时,您可以对其进行分析并查看瓶颈所在。一旦你做了一些基本的优化,如果仍然不能接受你可以重写C中的部分。

考虑可能是在铁蟒中写这个以利用.net中的clr和dlr。然后,您可以利用.net 4和并行扩展。如果有什么能让你的性能提升,那么.net的表现就会非常好。

编辑:

只是想让这部分清楚。从描述中可以看出,并行处理/多线程是大多数性能提升的来源。

答案 3 :(得分:4)

我会选择Java来完成这项任务。就RAM而言,Java和C ++之间的区别在于,在Java中,每个Object的开销为8字节(使用Sun 32位JVM或带有压缩指针的Sun 64位JVM)。因此,如果您有数百万个物体飞来飞去,这可能会有所不同。就速度而言,Java和C ++在这个规模上几乎相等。

所以对我来说更重要的是开发时间。如果你在C ++中犯了一个错误,就会出现分段错误(有时你甚至没有得到它)​​,而在Java中,你会得到一个带有堆栈跟踪的漂亮异常。我一直都喜欢这个。

在C ++中,您可以拥有原始类型的集合,而Java则没有。您必须使用外部库来获取它们。

如果您有实时要求,Java垃圾收集器可能会令人讨厌,因为收集20 GB堆需要几分钟,即使在具有24个核心的计算机上也是如此。但是如果你在运行时没有创建太多的临时对象,那也应该没问题。这只是你的程序可以在你不期望的时候暂停垃圾收集。

答案 4 :(得分:3)

为什么系统只使用一种语言?如果我是你,我将用Python构建整个系统,但C或C ++将用于性能关键组件。通过这种方式,您将拥有一个非常灵活且可扩展的系统,具有足够快的性能。您甚至可以找到自动生成包装器的工具(例如SWIG,Cython)。 Python和C / C ++ / Java / Fortran互不竞争;他们是补充。

答案 5 :(得分:0)

查看数字代码的内部循环很有用。毕竟,你将把大部分CPU时间花在这个循环中。

如果内循环是一个矩阵运算,那么我建议python和scipy,但如果不是矩阵运算的内循环,那么我会担心python变慢。 (或者我可能会使用swig或boost :: python在python中包装c ++)

python的好处是它易于调试,并且您不必一直编译就节省了大量时间。这对于您花费大量时间编写深层内部结构的项目尤其有用。

答案 6 :(得分:-1)

我会选择pypy。如果没有,http://lolcode.com/