バックテスト検証 · 定量リサーチ
CopyTradeAudit
自分の結果を壊すために作ったバックテスト基盤と、そこから出た正直な「否定的結果」。
- Python
- FastAPI
- pytest
- SQLite
- uv
課題
同じ発想を売る製品は数多くあります。予測市場は全取引を公開しており、一部のトレーダーは安定して利益を出している、だから追随すれば儲かる、と。この発想はバックテストで検証しやすく、そして同じくらい簡単に「誤って」検証できます。未来情報の混入がひとつあるだけで、あるいは相関した五十の市場を五十の独立した観測として数えるだけで、結果は見事に見えながら何も意味しなくなります。
対象
判断がバックテストの上に乗っているすべての人へ。本番投入直前の戦略、取引先の実績、良すぎて反論しづらい数字。
できること
Python による決定論的なリサーチ基盤(約 3,500 行、103 のテストで担保)を、370 市場・134,000 件の実取引・46 の独立イベントに対して検証しました。結論は「測定可能な優位性なし」。コピー対象として選ばれた取引は価格帯 0.95 超で 1 株あたり +0.0200、一方トレーダーを一切介さず同じ価格帯を機械的に買った場合は +0.0211 でした。
主要な判断
- 設計段階から未来情報を遮断:各シグナル時点で、トレーダーの実力はその時点までに決済済みの市場だけから算出し、その後に起きたことは一切使いません。
- イベント単位でクラスタリングしたブートストラップ信頼区間。ひとつのイベント内で相関する五十の市場は、五十ではなく一つの観測として数えます。
- 実際の板に対して、手数料・スリッページ・部分約定を含めて執行をシミュレーション。仲値で約定したという仮定は置きません。
- 都合の良い結果ではなく否定的な結果を公開し、モデルではなく測定側が壊れていた一戦略は INCONCLUSIVE と明記しました。
学んだこと
自分の方法論の中に四つのバグを見つけました。そのいずれもが、すでに「自信のある偽陽性」を生み出していました。中には 36 取引で勝率 100% を示しながら、機械的なエントリーに対する実質的な優位が 0.8% しかなかった戦略もあります。勝率でトレーダーを並べても実力は見つかりません。見つかるのは、98 セントでほぼ確実なものを買っている人です。自信を伴った誤答は、答えがないことよりも高くつきます。
次の展開
混入とクラスタリングの検査を、他人のバックテストに向けられる検証台へ仕上げること。自分が書いていない戦略にも同じ厳しさを適用するためです。
紙上のみ — 実取引も実資金もなし。これは意図した設計です。