5

私は、非高頻度取引ポートフォリオの作成、最適化、およびシミュレーションを担当する取引ポートフォリオ管理システムを構築しています(ティックデータではなく、1分または3分のデータバーを処理します)。

アマゾンウェブサービスを利用して、アプリケーションの全負荷を引き受ける予定です。

言語として考えている選択肢は4つあります。

  1. Java
  2. C ++
  3. C#
  4. Python

これがプロジェクトスコープの両極端のスコープです。これは、おそらくこれまでの方法ではありませんが、要件の範囲内です。

  • 10,000,000の取引システムの毎週のシミュレーション。
  • (各トレーディングシステムには、計算コストが非常に高い特徴選択アルゴリズムなど、独自のデータマイニング手法が必要です。ラッパーを使用した500〜5000の特徴を想像してみてください。これらは決して頻繁に実行されることはありませんが、それでも考慮事項です)
  • 100,000のトレーディング戦略によるポートフォリオのリアルタイム生産
  • 世界中のすべての株式/先物市場から1分または3分のデータを取り込む(約100,000)
  • 最大100,000の戦略を持つポートフォリオのポートフォリオ最適化。(かなり集中的なアルゴリズム)

速度が問題ですが、Javaで負荷を処理できると思います。

Javaが上記の要件を快適に処理できることを確認したいだけです。プロジェクトをC++で実行したくありませんが、必要に応じて実行します。

C#が存在する理由は、Windowsがまったく好きではなく、すべてが同じであればJavaを好むにもかかわらず、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のパフォーマンスは問題ではありませんが、あなたの場合、わずかなパフォーマンスのペナルティでさえ非常に迅速に加算されます。これはリアルタイムシミュレーションではないことは知っていますが、バッチ処理の場合でも、考慮すべき要素です。1つの仮想サーバーに対して負荷が大きすぎることが判明した場合、2倍の速度で実装すると、仮想サーバーのコストが半分になります。

多くのプロジェクトでは、Pythonを使用するとソリューションをより迅速に開発できると主張しますが、ここではそれが当てはまるかどうかはわかりません。Javaには、並列処理とクロスサーバー展開のためのワールドクラスの開発ツールと一流のエンタープライズグレードのフレームワークがあり、Pythonにはこの分野のソリューションがありますが、Javaには明らかに優位性があります。また、Javaspacesなど、Pythonでは対応できないJavaのアーキテクチャオプションもあります。

CとC++は、このようなプロジェクトに多くの開発オーバーヘッドを課していると私は主張します。あなたがそれらの言語に非常に精通していればそれは実行可能であると私は確信しているという点でそれらは実行可能ですが、より高いパフォーマンスの可能性を除いて、それらはテーブルにもたらすものが他にありません。

C#はJavaの単なる書き直しです。あなたがWindows開発者であり、Windowsを好むなら、私はJavaではなくC#を使用しますが、Windowsを気にしないのであれば、C#を気にする理由はありません。

于 2010-06-14T09:01:21.713 に答える
4

お好みの言語で書いてください。私にはそれはPythonのように聞こえます。システムの実行を開始すると、システムのプロファイルを作成して、ボトルネックがどこにあるかを確認できます。それでも受け入れられない場合は、いくつかの基本的な最適化を行った後、Cで部分を書き直すことができます。

.netのclrとdlrを利用するために、これをironpythonで記述することを検討してください。次に、.net4と並列拡張機能を活用できます。パフォーマンスが向上するものがあるとすれば、それは.netが非常にうまく機能するスレッドのフレーバーになります。

編集:

この部分を明確にしたかっただけです。説明から、並列処理/マルチスレッドは、パフォーマンスの向上の大部分がもたらされるところのように聞こえます。

于 2010-06-13T06:07:01.323 に答える
4

このタスクにはJavaを選択します。RAMに関しては、JavaとC ++の違いは、Javaでは各オブジェクトに8バイトのオーバーヘッドがあることです(圧縮されたポインターを持つSun32ビットJVMまたはSun64ビットJVMを使用)。したがって、何百万ものオブジェクトが飛び回っている場合、これは違いを生む可能性があります。速度に関しては、JavaとC++はその規模でほぼ同じです。

ですから、私にとってより重要なことは開発時間です。C ++でミスをすると、セグメンテーションフォールトが発生します(場合によってはそれが発生しないこともあります)が、Javaではスタックトレースで優れた例外が発生します。私はいつもこれを好みました。

C ++では、Javaにはないプリミティブ型のコレクションを作成できます。それらを取得するには、外部ライブラリを使用する必要があります。

リアルタイムの要件がある場合、24コアのマシンでも、20 GBのヒープを収集するのに数分かかるため、Javaガベージコレクターは厄介なものになる可能性があります。ただし、実行時にあまり多くの一時オブジェクトを作成しない場合は、それでも問題ありません。あなたのプログラムがあなたがそれを予期しないときはいつでもそのガベージコレクションを一時停止させることができるということだけです。

于 2010-06-13T08:12:17.003 に答える
3

システムに1つの言語しかないのはなぜですか?私があなたなら、システム全体を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 に答える