5

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

我计划使用 Amazon Web 服务来承担应用程序的全部负载。

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

  1. 爪哇
  2. C++
  3. C#
  4. 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 服务器上时,是否可以处理这种负载。

非常感谢你们的智慧。

4

7 回答 7

5

选择您最熟悉的语言。如果您对它们都同样了解并且速度是一个真正的问题,请选择 C。

于 2010-06-13T05:49:18.293 回答
5

虽然我是 Python 的忠实粉丝,而且我个人并不是 Java 的狂热爱好者,但在这种情况下,我不得不承认 Java 是正确的选择。

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

对于许多项目,我还认为 Python 将允许您更快地开发解决方案,但在这里我不确定情况是否如此。Java 拥有世界一流的开发工具和一流的企业级框架,用于并行处理和跨服务器部署,而 Python 在这方面有解决方案,Java 显然具有优势。您还拥有 Python 无法比拟的 Java 架构选项,例如 Javaspaces。

我认为 C 和 C++ 为这样的项目带来了太多的开发开销。它们是可行的,因为如果您非常熟悉这些语言,我相信它是可行的,但除了具有更高性能的潜力之外,它们没有其他可以带来的好处。

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

于 2010-06-14T09:01:21.713 回答
4

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

可以考虑在 Iron python 中编写它以利用 .net 中的 clr 和 dlr。然后,您可以利用 .net 4 和并行扩展。如果有任何东西可以提高性能,那将是某种线程的味道,.net 做得非常好。

编辑:

只是想把这部分说清楚。从描述中,听起来并行处理/多线程是大部分性能提升的来源。

于 2010-06-13T06:07:01.323 回答
4

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

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

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

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

于 2010-06-13T08:12:17.003 回答
3

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

于 2010-06-13T10:14:33.620 回答
0

查看数字代码的内部循环很有用。毕竟,您将在此循环中花费大部分 CPU 时间。

如果内部循环是矩阵运算,那么我建议使用 python 和 scipy,但是如果内部循环不是矩阵运算,那么我会担心 python 速度慢。(或者也许我会使用 swig 或 boost::python 将 c++ 包装在 python 中)

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

于 2010-06-14T09:43:27.993 回答
-1

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

于 2010-06-13T06:09:55.653 回答