先週、ノートブックを送ってくれた。同じシグナル、同じユニバース、同じ14か月分のBTCUSDT perpデータ。変わったのは執行だけだ。スプレッドをクロスするのをやめて、1ティック内側に買い指値を待機させるようにしたら、Sharpeは0.42から2.14になった。本物なのか、それとも何か壊したのか、と聞いてきた。
何か壊している。どこが壊れているかを正確に辿りたい。バグは1行だが、その下にある教訓は、その1行よりずっと大きいからだ。
エンジンから抜き出した、あなたの約定ルールがこれだ。
if bar.low <= limit_price: fill(limit_price)
このルールが言っているのは、この1分のあいだに自分の価格以下で約定がプリントされたなら、自分の価格で約定した、ということだ。だが実際に表しているのは、価格があなたの水準に触れたということだけである。触れることは約定ではない。そのあいだにはキューがあり、あなたはそのキューを空としてモデルしている。
あなたの前に並んでいるもの
BTCUSDT perpで84,120.0に買い指値を出すと、すでにそこに待機している注文の最後尾に並ぶ。この銘柄のベストビッドでは、時間帯にもよるが通常4〜30 BTCのあいだ。あなたのサンプル期間の中央値はおおよそ12 BTCだ。注文サイズは0.4 BTC。あなたが約定するには、売り手がその水準を、あなたより先に到着した全員を消化するだけの合計サイズで叩く必要があり、しかも水準が足元からキャンセルされるか、相場が上に離れるより前にそれが起きなければならない。
だからバックテストが問うべきなのは「価格は84,120.0に達したか」ではなく、「自分の注文がそこにいるあいだに、少なくとも12.4 BTCの成行売りが84,120.0で約定したか」だ。これはまったく別のイベントである。あなたのデータでは、両者はおよそ3倍違う。
3つの約定ルール、3つの異なる戦略
同じエントリーと3つの執行モデルで、あなたのシグナルを再実行した。アルファも手数料もファンディングも同じ。変わったのは約定ロジックだけだ。
| 約定ルール | 約定数 | 約定後60秒の平均エッジ | Sharpe |
|---|---|---|---|
タッチ: low <= limit | 4,180 | +2.6 bp | 2.14 |
厳格な貫通: low < limit - 1 tick | 1,712 | +0.4 bp | 0.61 |
| 水準出来高のキューシミュレーション | 1,306 | +0.9 bp | 0.77 |
真ん中の行は、誰もが最初に手を出す粗い修正だ。相場が自分の価格を厳密に貫通して取引した場合だけ約定と数える。向こうまで行ったなら自分も飲み込まれたはずだ、という理屈である。方向としては正しく、ファンタジーの大半は消える。だが性質の悪いバイアスも乗っており、それについては後で述べる。
一番下が、あなたが組むべきものだ。L3フィードも、注文単位の再構築も要らない。必要なものの大半は、すでに手元にある。
aggTradesから組めるキューシミュレーション
klinesではなく集計約定ストリームを取れ。各プリントには価格、数量、タイムスタンプ、maker側フラグが付いており、アグレッサーが買いだったか売りだったかがわかる。自分のパッシブ注文を実用レベルでシミュレートするには、それで足りる。
- 注文を出した瞬間に、自分の価格の待機サイズをスナップショットする。100msの板フィードしかなくても、直近のスナップショットを使えばよい。今直している誤差に比べれば、その誤差は小さい。
queue_ahead = resting_sizeをセットする。悲観的に、自分は最後尾だと仮定せよ。水準を自分で作っているのでなければ、実際そうだ。- 約定ストリームを順に辿る。自分の価格以下の売りアグレッサーのプリントは、その数量だけ
queue_aheadを減らす。負になった時点で、そのタイムスタンプ、自分の価格で約定する。 - 価格が1ティック離れたら、キューをゼロにリセットしてはいけない。減衰させよ。水準が古くなると、前方の注文の一部はキャンセルされ、一部は残る。タッチから完全に1秒外れるごとに30-40%減衰させる方が、どちらの極端よりも私の再構築に合っていた。
- 戦略がキャンセルして再発注するなら、再発注は新しい水準の最後尾への新規注文としてモデルせよ。人が飛ばすのがこのステップで、残っているファンタジーはここに潜む。
ステップ2で、私に反論したくなるだろう。たしかに、水準ができた瞬間に出していれば先頭近くにいることもある。構わない — 仮定するな、計測せよ。発注時点の待機サイズをログし、本当に早い注文がどの割合かをデータに語らせろ。あなたの戦略では11%だった。シグナルが値動きの後に発火するからだ。つまり、並ぼうとしている水準はすでに存在し、すでに人が群がっている。
取れる約定は、取りたくなかった約定だ
ここからが本当に重要な部分であり、厳格な貫通ルールがバイアスを持つ理由だ。
買い指値が完全に消化されるのはいつか、考えてほしい。売り圧力が水準全体を食い尽くすほど大きいときだ。つまり定義上、相場が自分の価格を下に突き抜けている瞬間である。最も確実だと言える約定は、直後にオフサイドになる約定だ。
約定を発生の仕方で分け、60秒のマークアウトを測れ。
| 約定タイプ | 約定に占める割合 | 60秒時点のマークアウト |
|---|---|---|
| 水準は取引され、価格は上に反発 | 38% | +3.1 bp |
| 水準は取引され、価格は横ばい | 21% | +0.2 bp |
| 価格が2ティック以上貫通して取引 | 41% | −2.4 bp |
素朴なバックテストは3つのバケット全部を渡し、どれもタダとして値付けしていた。厳格な貫通ルールが渡すのはほぼ第3バケットだけであり、だからエッジはキューシミュレーションよりさらに崩れた。どちらも正しくない。キューシミュレーションは現実的なミックスを返し、そのミックスこそが勝負のすべてだ。パッシブ執行はスプレッドを稼ぎ、逆選択で払い戻す。その2つの比率が、あなたの本当の戦略である。
昔の株式デスクの枠組みは今も通用する。maker注文とは、市場に対して売った無料のオプションだ。誰かが、行使する価値があるときに行使する。あなたのバックテストはプレミアムを回収しながら、オプションにペイオフの脚があることを忘れていた。
取れなかったトレードは、コストだけでなく戦略を変える
いちばん腰を据えて考えてほしいのがここだ。taker執行のモデルが雑だと、正しいトレードを間違った価格で取ることになり、手数料の補正で大方は直る。maker執行のモデルが雑だと、まったく別のトレード集合を手にすることになる。4,180件のエントリーのうちおよそ2,900件は、そもそも起きていない。その一部は最良のシグナルで、スパイクして貫通し、反転したローソクの上にあった。相場が自分を置いて逃げた、まさにその形である。
だから未約定の分岐には、本物のロジックが要る。シグナルが古くなるまでにエントリーが埋まらなかったら、戦略は何をするのか。taker注文で追いかけてスプレッドとインパクトを払うのか。下に再発注して別のエントリー価格を受け入れるのか。トレードを見送ってフラットでいるのか。どれを選ぶかでエクイティカーブは実質的に変わり、どれも「約定したことにする」ではない。私たちのランでは、正直な追いかけルール(20秒未約定ならクロス、スリッページは3 bp上限)を足すと、欠けたトレードのおよそ3分の1と、素朴なSharpeとキューシミュレーションのSharpeの差のおよそ半分が戻った。これは本当に面白い結果であり、約定モデルが問いを意味のあるものにできるほど現実的になって初めて現れる。
手軽な健全性チェック、10分: 同じ期間のライブペーパー取引ログとバックテストを取れ。比較するのはPnLではなく約定率だ。バックテストが待機注文の100%を約定させ、ペーパーが34%なら、戦略の比較ではなく、約定モデルのバグだ。リターンの数字を1つでも見る前に、それを直せ。
ついでに、もう2つ小さい話
Post-onlyのリジェクト。maker手数料帯を保証するためにpost-onlyを使っていて、判断と取引所のackのあいだに板が動くと、注文は待機せずリジェクトで返ってくる。私たちのペーパーログでは、通常時間帯のBTCUSDTで試行の3-6%、米国CPI発表直後の1分では15%超だ。リジェクトされた注文は約定でもなければ、未約定の待機注文でもない。存在しなかったトレードであり、バックテストにその状態がなければ、いちばん気にしている局面でまさにトレード数が水増しされる。
自己約定防止と、自分自身のフットプリント。0.4 BTCではBTCUSDTは動かないから、無視してよい。だが、ベストの名目がしばしば$15kを下回るミッドキャップのアルトperpで回したい、と言っていた。そこでは、あなたの注文はキューの意味のある割合である。スナップショットした前方キューの数字には、直前の自分の注文の存在がすでに入っている。サイズが待機水準のおよそ10%を超えたら、シミュレーションは他の参加者が自分に反応するという事実を織り込む必要がある。正直なところ、そこまで来たら、あなたや私が書けるどんなシミュレーションよりペーパー取引を信じる。
キューシミュレーションで再実行し、約定タイプ別に分けたマークアウト表を送ってほしい。跳ね返りバケットがまだエッジの大半を担い、貫通バケットが全部を食い尽くしていないなら、ペーパーに載せる価値があるかもしれない。全部が、そもそも取れなかった2,900件の約定だったなら、ノートブックが約束した動きをペーパー口座が4週間やらないのを眺めたあとより、今知った方がいい。
← 記事一覧


