火曜日の08:00 UTC、ある暗号資産取引所で、中価格帯の無期限契約のティックサイズが変更されました。私たちのベーシス戦略はそれに気づきませんでした。シグナルが見ている現物と先物のスプレッドは変わらず、リスク上限もそのままで、バックテストも同じ結果を出し続けていました。
ペーパートレードはその変化に気づきました。注文アダプターが買い指値を、許容される直近の価格まで切り下げたのです。その結果、注文価格はバックテストで想定していた水準より1ティック低くなりました。市場価格は以前の価格に達し、シミュレーション上の注文は約定しましたが、ペーパー注文は未約定のままでした。昼までには、戦略の保有ポジションが偏っていました。
この問題は、単純な丸めの不具合に見えました。実際にはモデルの境界に関する問題でした。戦略は価格を認識していましたが、バックテストは取引所の価格刻みを認識していなかったのです。
私たちは、先物プレミアムがしきい値を超えて拡大したときに現物を買い、無期限先物を売る、シンプルなベーシスシグナルを取引していました。想定されるベーシスの優位性が小さいため、注文はパッシブでした。数ティックの違いで、エントリーが手数料と最終的な決済コストをまかなえるかどうかが決まることもあります。
ティックサイズが変わると、何が変わるのでしょうか?
更新前、無期限契約の価格刻みは0.01でした。更新後、該当する価格帯では0.05刻みになりました。シグナルが算出した売り目標価格は42,318.03で、旧ルールでは有効な価格でした。新ルールでは無効です。
取引所は無効な価格を拒否していましたが、私たちのアダプターには代替処理がありました。売り価格を切り下げて42,318.00にしたのです。それでも無効でした。2つ目の代替処理ではさらに丸め、今度は42,318.05にしました。この価格は有効でしたが、売り手にとってはより積極性の低い価格です。注文はモデル上の価格では売れなくなりました。このコード経路は別の市場向けに書かれており、拒否をひそかに価格変更へと置き換えていました。
この1件の注文には、異なる2つの問いが含まれていました。1つ目は、取引所がどの価格を受け付けるか。2つ目は、希望価格が価格刻みに合わないとき、戦略はどう対応するか。1つ目に答えるのは取引所です。2つ目には、戦略または執行ポリシーが答えなければなりません。
| 注文の意図 | 価格刻みのルール | 一般的な丸めの方向 | 変わりうること |
|---|---|---|---|
| 買い指値 | 価格はティックの倍数であること | 指値以下に保つため切り下げる | 約定確率の低下 |
| 売り指値 | 価格はティックの倍数であること | 指値以上に保つため切り上げる | 約定確率の低下 |
| 成行可能な指値注文 | 価格制限も守る必要がある | 許容できる最高価格による | スプレッドを跨ぐかどうか |
どんな場合にも正しい丸め方というものはありません。買い価格を切り下げれば買い手の価格制約は守れますが、約定しにくくなる可能性があります。切り上げると成行可能な注文になり、手数料や価格インパクトが変わることがあります。私たちのパッシブなベーシスエントリーでは、注文価格をひそかに動かすのは誤った対応でした。戦略が目標を決めたのに、アダプターがその経済性を変えてしまったのです。
バックテストの結果が良好に見え続けたのはなぜでしょうか?
私たちの過去データ用注文シミュレーターは、指値を連続値として扱っていました。バーの安値が買い価格に達するか、高値が売り価格に達すれば、約定として数えていました。これはパッシブ注文に対してかなり楽観的な近似です。指値で取引が成立したからといって、キュー内の順位がわかるわけではないからです。しかし、ティックサイズの変更で、さらに根本的な問題が明らかになりました。その価格では注文自体を出せなかったのです。
有効時刻から新しい価格刻みを適用して、同じ判断を再生しました。いくつもの約定が消えました。一部の注文はスプレッドを跨ぐ価格に丸められ、maker手数料ではなくtaker手数料が発生しました。その結果、ポジションの推移が分岐し、後続のヘッジや決済も変わりました。メタデータに見えたルールが、取引シーケンス全体を変えていたのです。
この変更は、チャートの裏に隠れていて予測できなかったわけではありません。取引所は、適用開始時刻を含めて銘柄ルールの変更を公表していました。私たちは市場データを慎重に保存していましたが、銘柄メタデータは起動時に更新するキャッシュに入っていました。バックテストは過去のすべての日付に今日のルールを使い、ペーパートレードはプロセスを再起動するまで古いルールを使っていました。どちらの環境も、それぞれの時点で取引所が許可していた内容を再現できていませんでした。
バックテストでは、ティックサイズの変更をどうモデル化すべきでしょうか?
他のポイントインタイム入力と同様に、有効期間を付けて銘柄ルールをバージョン管理します。最低限、有効時刻と注文の検証に必要なルール値を保持します。たとえば、ティックサイズ、数量刻み、最小数量、価格帯です。シミュレーターは、シミュレーション上の判断時刻に適用されていたルールセットを読み込む必要があります。
次に、注文処理を明示します。目標価格が無効なら、注文を拒否するか、文書化されたポリシーに従って丸めるか、価格刻みに合わせて目標を再計算します。どの処理を行ったかも記録します。すべての注文を自動修正するバックテストは、特定の執行ポリシーを推定する用途には役立つかもしれません。しかし、そのポリシーを取引所での約定として見せかけてはいけません。
パッシブ注文では、価格刻みに合った価格は約定の最初の条件にすぎません。市場が自分の価格を通過して取引したか、自分の前にどれだけのキューがあったか、キャンセルがどう発生したか、どの手数料ティアが適用されたかもモデル化する必要があります。
私たちは2つのチェックを追加しました。1つ目は、生成したすべての注文をポイントインタイムの銘柄ルールで検証し、価格や数量が無効なら明確にエラーにします。2つ目は、バックテストとペーパートレードのアダプターが最終的に正規化した注文を比較します。比較項目は、売買サイド、価格、数量、time-in-force、手数料の意図です。一致しなければ、その実行を比較可能とはみなしません。
その後、火曜日の変更を再生しました。グリッド更新後に42,318.03で約定したとバックテストが主張することはなくなりました。ペーパートレードとシミュレーションは、無効な目標ごとに同じ判断を下しました。その判断が注文の見送りであっても、結果は一致しました。
シグナルに問題はありませんでした。取引可能な対象についての前提が古くなっていたのです。新しいティックサイズにも戦略は対応できます。ただし、リサーチシステムが取引所ルールをシミュレーション対象の市場の一部として扱う必要があります。
← 記事一覧


