哪个编程语言适合计算密集型交易组合模拟?
我正在建立一个交易组合管理系统,这个系统负责生产、优化和模拟非高频交易的组合(处理的是1分钟或3分钟的数据,而不是逐笔交易的数据)。
我打算使用亚马逊的云服务来承载整个应用程序的负载。
我考虑了四种编程语言。
- Java
- C++
- C#
- Python
下面是项目范围的一些极端情况。这并不是说项目一定会这样,但这是需求范围内的一部分:
- 每周模拟10,000,000个交易系统。
- (每个交易系统预计会有自己的数据挖掘方法,包括特征选择算法,这些算法计算量非常大。想象一下有500到5000个特征使用包装器。这些算法并不是经常运行,但仍然需要考虑)
- 实时生成包含100,000个交易策略的组合
- 从全球每个股票/期货市场获取1分钟或3分钟的数据(大约100,000个市场)
- 对最多100,000个策略的组合进行优化。(这需要相当复杂的算法)
速度是一个问题,但我相信Java可以处理这个负载。
我只是想确认Java是否能够轻松应对上述要求。如果必须的话,我不想用C++来做这个项目,但我会考虑。
C#之所以在考虑之列,是因为我觉得它是Java的一个不错替代品,尽管我一点也不喜欢Windows,如果条件相同,我更倾向于使用Java。
关于Python,我读过一些关于PyPy和pyscho的资料,声称Python可以通过JIT编译优化到接近C语言的速度……这几乎是它在这个列表上的唯一原因,除此之外,Python是一种很棒的语言,编程起来可能是最愉快的语言,虽然这对这个项目来说并不是一个决定性因素,但也是个额外的好处。
总结一下:
- 实时生产
- 每周对大量系统进行模拟
- 每周/月对组合进行优化
- 需要连接大量的数据源
这里不涉及毫秒或甚至秒级的交易。唯一需要考虑的是,Java是否能在分布在必要数量的EC2服务器上时,处理这样的负载。
非常感谢大家的智慧。
7 个回答
虽然我非常喜欢Python,个人上也不太喜欢Java,但在这种情况下,我得承认Java是更合适的选择。
对于很多项目来说,Python的性能并不是问题,但在你的情况下,即使是小的性能损失也会迅速累积。我知道这不是实时模拟,但即使是批处理,也还是需要考虑这个因素。如果发现一个虚拟服务器的负载太大,那么一个速度快两倍的实现可以把你的虚拟服务器成本减半。
对于很多项目,我也会说Python能让你更快地开发解决方案,但在这里我不确定是否适用。Java有世界级的开发工具和顶尖的企业级框架,适合并行处理和跨服务器部署,虽然Python在这方面也有解决方案,但Java显然更强。Java还有一些Python无法比拟的架构选项,比如Javaspaces。
我认为C和C++对这样的项目来说开发负担太重。如果你对这些语言非常熟悉,当然可以做到,但除了可能更高的性能,它们没有其他优势。
C#其实就是Java的重写。如果你是Windows开发者,这并不是坏事,如果你更喜欢Windows,我会建议用C#而不是Java,但如果你不在乎Windows,那就没有必要关注C#。
选择你最熟悉的编程语言。如果你对所有语言都差不多了解,但速度是个重要问题,那就选择C语言。
我会选择Java来完成这个任务。在内存方面,Java和C++的区别在于,Java中的每个对象都有8个字节的额外开销(使用的是Sun的32位或64位JVM,且启用了压缩指针)。所以如果你有成千上万的对象在运行,这个开销就会变得很重要。在速度上,Java和C++在这个规模上几乎是一样的。
对我来说,更重要的是开发时间。如果你在C++中犯了错误,可能会出现“段错误”(有时候甚至连错误提示都没有),而在Java中,你会得到一个友好的异常提示和调用栈信息。我一直更喜欢这种方式。
在C++中,你可以使用基本数据类型的集合,而Java没有这个功能。你需要使用外部库来实现这个功能。
如果你有实时性要求,Java的垃圾回收机制可能会让人头疼,因为即使在24核的机器上,清理20GB的内存也可能需要几分钟。不过,如果你在运行时不创建太多临时对象,这个问题也可以忽略。只是你的程序可能会在你意想不到的时候暂停来进行垃圾回收。