まず、1ミリ秒はHFTの永遠です。そうでない場合は、ドメインについてもう少し読んでおくとよいでしょう。(交換所から100マイル離れているようなものです。)基本的な待ち行列理論の教科書にある公式が示すように、スループットと遅延は深く絡み合っています。同じ式でジッター値が示されます(ネットワークファブリックが正しく、十分なコアを構成していない場合は、CPUキュー遅延の標準偏差が支配的であることがよくあります)。
HFTアービトラージの問題の1つは、スプレッドを取得することを決定すると、利益を実現するために2つ(またはそれ以上)のレッグがあることです。すべての足を打つことができなかった場合、あなたは本当に望まないポジション(そしてその後の損失)を残す可能性があります-結局のところ、あなたは投資せずに裁定取引をしていました。
あなたの戦略が(非常に短期的な!!!)将来を予測していない限り、あなたはポジションを望んでいません(そしてこれは、信じられないかもしれませんが、非常にうまくいきます)。取引所から1ミリ秒離れている場合、注文のかなりの部分が実行されず、必要なものが選択されます。ほとんどの場合、片足を実行したものは敗者になるか、少なくとも利益を生まないでしょう。
あなたの戦略が議論のために何であれ、それが55%/ 45%の勝ち/負けの比率になるとしましょう。勝敗率のわずかな変化でさえ、収益性に大きな変化をもたらす可能性があります。
re:「数十(数百)も実行」は桁違いに見えます20000ティックを見ても、1秒は低いように見えますが、これは彼が見ている機器セットの1日中の平均かもしれません。
任意の秒で見られるレートには大きな変動があります。例を挙げましょう。私のテストのいくつかでは、このストリームの1秒あたりのレートが0 mps(非常にまれ)からピーク秒あたりほぼ2000の相場と取引。(上記の20000が低いと思う理由を参照してください。)
私はこのドメインのインフラストラクチャと測定ソフトウェアを構築しており、私たちが話している数は1秒あたり100000と数百万です。私はC++プロデューサー/コンシューマーインフラストラクチャライブラリを持っており、プロデューサーとコンシューマーの間で1秒あたり約5000000(500万)メッセージをプッシュできます(32ビット、2.4 GHzコア)。これらは、プロデューサー側でnew、construct、enqueue、synchronizeを使用し、同期、デキュー、すべてのバイトにタッチ、仮想デストラクタを実行、無料の64バイトメッセージです。消費者側で。確かに、これは、エンドポイントパイプステージのエンドポイントの場合のように、ソケットIOがない(そしてソケットIOが醜い可能性がある)単純なベンチマークです。これは、空の場合にのみ同期するすべてのカスタム同期クラス、カスタムアロケータ、カスタムロックフリーキューとリスト、ときどきSTL(カスタムアロケータを使用)ですが、多くの場合、カスタム侵入型コレクション(重要なライブラリがあります)です。この分野のベンダーに、ソケットエンドポイントでのバッチ処理を増やすことなく、スループットを4倍(およびそれ以上)にしたことが何度もあります。
私はOrderBookとOrderBook::Universeクラスを持っており、22000を超える楽器の平均で、新規、挿入、検索、部分塗りつぶし、検索、2番目の塗りつぶし、消去、削除シーケンスに2us未満かかります。ベンチマークは、挿入の最初の塗りつぶしと最後の塗りつぶしの間で22000のすべての機器を順番に繰り返すため、安価なキャッシングトリックは必要ありません。同じ本への操作は、22000の異なる本へのアクセスによって分離されています。これらは、実際のデータのキャッシュ特性ではありません。実際のデータは時間的にはるかにローカライズされており、連続した取引は頻繁に同じ本にヒットします。
この作業はすべて、使用されるコレクションのアルゴリズムコストのいずれかで定数とキャッシュ特性を慎重に検討する必要があります。(K O(n)K O(n * log n)などのKが少し見苦しく却下されているように見えることがあります)
私は物事のMarketdataインフラストラクチャ側で働いています。この作業にJavaまたは管理された環境を使用することを考えることさえ考えられません。そして、C ++でこの種のパフォーマンスを得ることができ、管理された環境で100万以上/ mpsのパフォーマンスを得るのは非常に難しいと思う場合)重要な投資銀行やヘッジファンド(250000ドルの給与一流のC++プログラマーは何もありません)C++を使用していません。
管理された環境から2000000+/ mpsのパフォーマンスを実際に得ている人はいますか?私はこの分野の何人かの人々を知っています、そして誰も私にそれについて自慢しませんでした。そして、管理された環境での2mmには、自慢できる権利があると思います。
あるメジャープレーヤーのFIXオーダーデコーダーが12000000フィールドデコード/秒を実行していることを知っています。(3Ghz CPU)それはC ++であり、それを書いた人は、その半分の速度でさえある管理された環境で何かを思い付くようにほとんど誰にでも挑戦しました。
技術的には、楽しいパフォーマンスの課題がたくさんある興味深いエリアです。原資産のセキュリティが変更されたときのオプション市場を考えてみてください。たとえば、有効期限が3つまたは4つの異なる6つの未払いの価格ポイントがある可能性があります。今、各取引について、おそらく10-20の見積もりがありました。これらの見積もりは、オプションの価格変更を引き起こす可能性があります。したがって、取引ごとに、オプションの見積もりに100または200の変更がある可能性があります。これは大量のデータであり、大型ハドロン衝突型加速器のような量のデータではありませんが、それでも少し難しい問題です。キーストロークの処理とは少し異なります。
FPGAについての議論さえ続いています。多くの人々は、3GHZコモディティHWで実行される適切にコーディングされたパーサーが500MHzFPGAを打ち負かすことができるという立場を取っています。ただし、FPGAベースのシステムは少し遅い(そうではないとは言えませんが)場合でも、遅延分布が狭くなる傾向があります。(「傾向」を読んでください-これは包括的なステートメントではありません)もちろん、Cfrontを介してプッシュし、FPGAイメージジェネレーターを介してプッシュする優れたC ++パーサーがある場合は、別の議論があります...