バックテストで最も危険なタイミングのバグは、タイムスタンプを完璧に監査しても見つからないことがあります。2つのイベントがどちらも10:00:00.000と記録されていても、実際の順序をシミュレーターが推測している可能性があります。
これは、完了したバーだけでなく、気配値の更新、約定、ファンディング通知、取引所のステータス変更、自分の注文への確認応答などに反応する戦略で重要になります。タイムスタンプが示すのは、イベントに付けられた時刻です。そのイベントを戦略がいつ利用できたかまでは示さないことがあります。
イベントの順序で何が変わるのか?
最良売気配が$100.00を下回ったら買う戦略を考えてみましょう。同じミリ秒に、フィードには売気配が$99.99に更新された記録と、$99.99での約定が記録されています。バックテストで約定を先に処理し、その後に気配値を処理すると、戦略は新しい売気配を見て注文を出します。気配値を先に処理する場合も、そのイベントが実際に利用可能だったなら問題ありません。しかし、注文が届く前に約定によって表示流動性が消費されていたなら、$99.99での約定は作り話です。
タイムスタンプだけで行を並べると、同時刻のイベントの順序をシミュレーターが選ぶことになります。ファイル内の順序、銘柄の順序、データベースのクエリ実行計画が、意図しない約定ルールになりかねません。元データが同じでも、損益曲線が変わることがあります。
どれほど恣意的になり得るかを知る簡単な方法があります。同時刻のイベントを到着順ではなく銘柄名で並べてみるのです。するとマルチアセット戦略の挙動が、あるティッカーが別のティッカーより先に並ぶというだけで変わることがあります。
バックテストではどの時計を保持すべきか?
市場データや注文処理には、異なる複数の時刻が関わることがよくあります。データソースが提供するフィールドを保持し、それぞれの意味を正確に示しましょう。多くのフィードでは、取引所のタイムスタンプとローカルでの受信時刻がどちらも役立ちます。ただし、どちらもすべての参加者が何を見たかを示す絶対的な基準ではありません。
| 時刻 | 記録される内容 | それだけでは証明できないこと |
|---|---|---|
| 取引所イベント時刻 | 取引所がイベント発生時刻として示す時刻 | 別のフィードや自分のプロセスがイベントを認識した順序 |
| 受信時刻 | 収集システムがメッセージを受信した時刻 | 戦略が処理を終えた時刻 |
| 判断時刻 | コードがシグナルを評価した時刻 | 表示価格がその時点でも有効だったこと |
| 注文到着時刻 | 取引所が注文を処理できるようになった時刻 | マッチング規則と流動性が裏付けない限り、約定したこと |
受信時刻のない過去データを使う場合は、どのような仮定を置くか明記しましょう。たとえば、バックテストでは取引所イベントを順番に処理し、判断から注文到着までに一律5 msの遅延を加えることがあります。これはモデルであり、過去の状況を復元したものではありません。同時刻の取引所イベントにシーケンス番号がなければ、同時刻イベントの順序を決めるルールも仮定です。
同時刻のイベントはどうモデル化すればよいか?
まず、データソースにシーケンス番号がある場合は保持しましょう。シーケンス番号があれば、同じフィード内の順序をタイムスタンプより確実に判断できます。ただし、チャネルや商品が異なれば、シーケンス番号の体系も別々の場合があります。
次に、シミュレーターの処理ルールを明確にします。それぞれのイベントについて、戦略の情報を更新するのか、利用可能な流動性を変えるのか、注文を発生させるのか、注文への確認応答を行うのかを決めます。これらはそれぞれ別の処理です。すべてを「行を処理する」にまとめると、あり得ない約定が紛れ込みます。
- 戦略の判断時刻までに届いた市場情報だけを反映する。
- 注文を生成してから、モデル上の取引所到着時刻まで進める。
- 到着後に、注文タイプごとの約定仮定に沿って、適格な流動性に対する執行だけを認める。
- シミュレーション上の約定ごとに、入力、イベント順序、使用した遅延を記録する。
バーを基準にする戦略なら、ここまでの仕組みは問いに対して過剰かもしれません。シグナルが完了した1-minuteバーを使い、保守的なコストモデルのもとで次のバーの始値で約定するなら、ミリ秒未満の順序がリサーチの結論を変える可能性は低いでしょう。大切なのは、バックテストが示す主張に見合ったタイミングの細かさを選ぶことです。
到着時刻のデータがなくても、バックテストを信頼できるか?
利用することはできますが、その限界を明示しましょう。取引頻度が低く、リスク許容幅が広い戦略なら、数ミリ秒の差は重要でないかもしれません。一方、すぐ消える気配値に反応する戦略、キュー順位を争う戦略、取引所間のリード・ラグシグナルに依存する戦略では、到着時刻がないことが結果を左右し得ます。
正確なイベント時刻が見せかけの精密さにつながるという批判はもっともです。過去のフィードは不完全で、時計はずれ、取引所のタイムスタンプからはすべてのネットワーク経路が分かるわけではありません。ナノ秒単位のフィールドがあるシミュレーターでも、約定の仮定が粗雑なことはあります。
確実だと言い切るのではなく、感度を検証しましょう。妥当なイベント順序の決め方や注文遅延を使ってリプレイし、取引回数、約定価格、どのシグナルが残るかを比較します。データから確定できない順序に結果が左右されるなら、その依存関係をリサーチ報告書に記載しましょう。時計が不完全でも、バックテストは役に立ちます。実際に分かっている時刻の範囲を明らかにすればよいのです。
← 記事一覧


