【要約】バックテストで作った『回収率118%』がフォワードテストで崩れた話 — 個人開発の競馬予想MLで観測した4つの構造劣化 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
個人開発者が競馬予想MLを開発し、バックテストで高い回収率を得たものの、実環境でのフォワードテストで成績が激減するという問題に直面した。これは時系列データの特性に起因する、以下の技術的課題が複合的に絡み合っている。
- ・バックテストでの最適化による生存者バイアスの発生
- ・特徴量計算時に未来の情報が混入するデータリーケージ
- ・市場環境の変化に伴うレジームシフト
- ・効率的な市場における期待値戦略のボラティリティ
// Approach
開発者は、成績の劣化を「バグ」ではなく「時系列MLにおける構造的な問題」と定義し、技術的・運用的な両面から対策を講じた。具体的には、以下の手法を採用している。
- ・SQLのWHERE句に
race_date < ?フィルタを導入し、未来情報の混入を徹底的に遮断 - ・Walk-forwardテストやOOT(Out-of-time)ホールドアウトによる検証の厳格化
- ・判定タイミングや撤退ラインを事前に定義し、初動の数値悪化に動じない運用規律の構築
- ・検証期間中のモデル設計を意図的に凍結し、実験の再現性を担保
// Result
劣化の要因を4つの構造に分解し、単なる実装ミスと構造的劣化を区別する判断基準を得た。これにより、以下の成果を実現している。
- ・単勝回収率の激減を、サンプル数と分散の観点から「想定内の範囲」として冷静に評価
- ・「変えない期間」を設けることで、検証データの汚染を防ぐストイックな運用フローを確立
- ・時系列MLにおける「コードの正しさ」と「運用規律」の両立の重要性を明示した
Senior Engineer Insight
> 時系列予測において、バックテストの成功は「過学習の罠」である可能性が高い。本記事が示す「リーケージの徹底排除」と「運用規律の事前定義」は、実戦投入における必須要件だ。特に、数値の悪化に対してモデルを即座に修正せず、検証期間を固定する「設計の凍結」は、実験の再現性を担保する上で極めて重要な視点である。コードの正しさだけでなく、評価のプロセスを設計することにこそ、シニアエンジニアの価値がある。