昨夜、あなたのペーパートレード用プロセスがクラッシュしたと聞きました。次の判断の前に再起動し、エラーが出なかったので、中断したところから再開できたと思ったそうですね。ところが、すでに保有している資産を買う注文を出してしまった。ストラテジーにバグがあるのか知りたい、ということでした。
その可能性はあります。ただ、まず確認すべきなのは、再起動したプロセスがペーパー口座と同じ状態を把握しているかどうかです。再起動時の課題は状態の復旧です。ポジション、現金、未決済注文、そして次の判断に影響するストラテジーの記憶が、すべて一致していなければなりません。コードを再び動かすのは簡単な部分です。
クラッシュ前、ストラテジーはどんな状態だと思っていたでしょうか?
プロセスが停止する直前に行った最後の判断を書き出してください。取引する銘柄ごとに、意図したポジション、口座上の実際のポジション、未処理の注文、次のアクションに影響するシグナル状態を記録します。そうした記録がなければ、再起動で状態が復元されたのか、それともストラテジーが初期化されただけなのか判断できません。
たとえば、トレンドシグナルがプラスに転じたら1単位を買い、マイナスに転じるまで保有する時間足ストラテジーがあるとします。プロセスは14:00に買い注文を出しますが、注文が受理されたと記録する前にクラッシュします。ペーパー取引所では注文が約定します。再起動時、ストラテジーには記録済みのポジションがなく、シグナルはまだプラスなので、もう一度買い注文を出してしまいます。シグナルの動作には一貫性があります。口座の保有状況に関する記憶が古いのです。
だからこそ、新しい注文を出す前に、口座の現在のポジションと保存済みのストラテジー状態を照合する必要があります。ローカルのスナップショットも役立ちますが、実際に約定した内容を確定するのは口座または取引所です。
再起動後も保持すべき状態は何でしょうか?
まず、次の注文を変えうる状態から確認しましょう。更新ごとにタイムスタンプとバージョンを付けて、永続的に記録します。復旧ロジックを変更する前にコピーを作っておけば、あとから障害を再現できます。
| 状態 | 重要な理由 | 復旧時の確認 |
|---|---|---|
| ポジションと現金 | エクスポージャーと利用可能な購買余力を決める | 保存済みの値をペーパー口座と照合する |
| 未決済注文 | プロセス停止中に注文が約定している可能性がある | 注文状況を照会し、部分約定を照合する |
| シグナルの記憶 | クロス、クールダウン、保有期間が複数の判断にまたがることがある | 最後に確定した判断の入力値を復元する |
| 最後に処理したイベント | ストラテジーがどこからデータの取り込みを再開するかを決める | その時点以降のイベントを、二重適用せずに再生する |
シグナルの記憶は見落としがちです。クロスで取引するストラテジーでは、新しいクロスを検出するため、前日の指標値を保存していることがあります。値が空の状態で起動すると、すでに成立している条件を新しいイベントと誤認しかねません。クールダウンタイマーも同様です。再起動によって、本来維持されるはずのルールが知らないうちにリセットされてはいけません。
復旧を再現可能にするには?
各注文には、それが生じたストラテジー実行と判断から生成した、変わらないクライアントIDを割り当てます。タイムアウト後にプロセスが再試行しても、その判断ですでに注文が作られていないか確認できるため、重複注文を防げます。状態変更は対応する口座イベントを確認してから記録し、変更の根拠となる注文IDと約定IDも保存します。
次に、今回の障害が起きた境界条件をテストします。ストラテジーに判断を行わせて状態を保存し、停止させたあと、ペーパー口座のポジションと注文履歴を使って復元します。再開後の判断と注文を、停止せずに実行した場合と比較します。部分約定した注文がある場合や、注文送信から受領確認までの間にクラッシュした場合も繰り返し確認してください。再開後に新しいポジションを作り出したり、完了済みのアクションを繰り返したりしてはいけません。
復旧ログには、最後に処理したイベント、口座スナップショットの時刻、未決済注文の状況、復元したストラテジーのバージョン、再起動後の最初の判断を記録します。これにより、「再起動した」だけの状態を、監査できる記録に変えられます。
再起動後、何を信頼すべきでしょうか?
口座とストラテジーの状態が一致し、未決済注文の状況が把握でき、次の判断が連続稼働時に予想されるものと一致してから、プロセスを信頼してください。不一致の理由を説明できない場合は、ペーパー注文の送信を一時停止し、イベントの記録を調べます。プロセスが動いていることは、ストラテジーが正常に復旧した証拠にはなりません。
今回のクラッシュから、すでに大切なことが分かっています。普段の稼働では向き合わずに済んでいた前提が、表面化したのです。再起動を再現可能なシナリオにすれば、再び取引させる前に、ストラテジーが何を記憶しているのか把握できます。
← 記事一覧


