ポジション上限、証拠金、fat-finger の上下限、kill switch は、注文がゲートウェイを出る前に毎回答えを返さなければならない。ここでは、それらのチェックを経路の脇ではなく注文経路の内側に置く方法を扱う。どの状態をメモリに置き、何を差分で再計算し、再起動後に何が起きるか。まずは制約から。
注文がゲートウェイに届く。取引所へ出す前に、そのアカウントが送ってよいかを何かが判断しなければならない。その判断は、まったく問題のない圧倒的多数を含むすべての注文で走る。つまりそのコストは、拒否される注文だけでなく通常のトラフィック全体が負担する。
まず名指しすべき制約はそれだ。注文経路に置かれたリスクチェックは、発注にかかる税金である。技術的な問いは、チェックをいかに賢くするかではない。トレーダーが感じない程度に小さく、それでも拒否すべき注文はきちんと拒否できるだけ正直に作るにはどうするか、である。
ホットパスが答える問いはひとつだけだ。このアカウントについて今分かっていることを踏まえて、この注文を今すぐ送ってよいか。その問いに答えるチェックは中に残る。別の問いに答えるチェックは外へ出す。
それ以外はすべて経路の脇で、同じ状態の上で、注文を止めずに走る。ホットパスが強制する上限値に情報を与えはするが、トレーダーと取引所の間には座らない。
境界線はカテゴリではなく問いである。経路の内側 ― この注文を出してよいか。経路の脇 ― 上限値はいくつであるべきか。2つ目の問いに答えながら注文を止めるものは、そのチェックがどれほど重要でも設計上の誤りだ。
pre-trade チェックが必要とする状態 ― 現在のポジション、有効注文、使用済みおよび利用可能な証拠金、上限の設定 ― は、その判断を下すプロセスのメモリの中にある。データベースの前のキャッシュでもなければ、ネットワーク越しでもない。プロセスの中だ。
理由は速度だけではない ― もっとも、クエリはローカル配列の参照より桁違いに高い。理由は正しさだ。データベースは書き込まれた時点のポジションを持つ。リスクチェックが必要とするのは、直前に送ってまだ約定も確認応答も永続化もされていない注文を含めたポジションである。ストレージから読めば、自分自身のフローがすでに追い越した過去に対して照合することになる。
実際のところ、それは低 latency のコンポーネントが一般にそうであるように、プロセスの形を決める:
データベースはポジションが記録される場所だ。ポジションが分かる場所ではない。
アカウントのエクスポージャーと証拠金を完全に再計算すると、すべてのポジションとすべての有効注文をたどることになる。そのコストは板の大きさとともに増えるため、最も多く取引する顧客ほどリスクチェックが遅くなる。だからホットパスは再計算しない。差分を適用する。
アカウントは走行中の集計値を持つ ― 銘柄別・グループ別の純および総エクスポージャー、使用証拠金、発注中の想定元本。入ってきた注文はその集計値に小さな変化をもたらし、変わった値を上限と比べ、注文は受理されるか拒否される。仕事量はポートフォリオではなく注文に比例する。
完全な再計算は依然として行われる ― 定期的に、証拠金パラメータが変わったとき、そして差分計算の結果に対する定期的な自己点検として。それは経路の外でコピーの上を走り、その結果は差し替えられるか、不一致として報告される。真の状態から黙って乖離していく差分状態は、チェックが無いよりたちが悪い。だからこの比較は任意ではない。
我々が作るリスク経路での実測では、pre-trade チェック自体は <1 ms で完了する。この数字はメモリ上の状態に対する判断を指すもので、クライアントから取引所へ往復する注文の全行程ではない。
kill switch は、すでに何かが壊れているときにこそ使われる。だからこそ、壊れている当の仕組みの上に載せて作ることはできない。それ自身のルールを持つ、独立した経路である。
新規注文を止めるのは簡単なほうの半分だ。難しいのは、すでに取引所に置かれている注文にスイッチが何をするかである。送信経路を止めたままで、クオートの引き上げと有効注文のキャンセルができなければならない。そのキャンセル経路には専用のテストが要る。使われるのは平常時ではなく、最悪の日だからだ。
メモリ上の状態は、永続的な記録から導かれたビューである。だからこそ再起動を生き延びられる。リスク状態を変えるすべての事象 ― 注文の受理、予約の解放、約定の反映、上限値の変更、スイッチの作動 ― は、下流で実行される前にローカルマシンのジャーナルへ追記される。
復旧時間は板の大きさではなく、ジャーナルの長さと drop copy の可用性で決まる。そして不明点があったときの振る舞いは常に同じ ― そのアカウントの取引を拒否する。
限界は率直に述べておく価値がある。このアーキテクチャがそもそも合うかどうかを決めるのはそこだからだ:
amBrain はこの種の pre-trade リスク経路を、ブローカーや自己勘定業者向けに、ホットパスを Rust で書いて構築している。チームは2019年からアルメニア・エレバンでトレーディング基盤に取り組んできた。
当社のエンジニアリングチームはFinTechソリューションを専門としています。プロジェクトの実現方法についてご相談ください。