前置き:バックテストは良かった。だが実戦は
前回(#22)で、EV正規化バグの修正から、回収率100%超えを目指した設計変更までの過程を報告した。
41日間・178件のバックテストで、最終的に回収率122.2%という数字にたどり着いた。サンプルを増やすたびに数字が崩れる経験(171.5%→118.5%→92.6%)をした後だっただけに、train/holdout分割で独立に検証した122.2%には、それなりの根拠があると思っていた。
そして8月8日、いよいよ本番モデルでの実運用を開始した。
結果は——
8月8日:6件推奨 的中0 回収率0%
8月9日:6件推奨 的中0 回収率0%
8月15日:5件推奨 的中0 回収率0%
8月16日:7件推奨 的中0 回収率0%
累計:24件推奨 的中0 回収率0%
4日連続、24件全ハズレ。
バックテストで122.2%を確認した直後にこれでは、さすがに何か根本的に間違っているのではないかと、不安になる数字だ。
本記事は、この4日連続ゼロが「異常事態」なのか「想定の範囲内」なのかを、統計的に検証した記録である。
まず確認:これは「異常」なのか
感覚的な不安と、データが示す事実は分けて考える必要がある。
41日間のバックテストの内訳を振り返ると、41日中28日は的中ゼロだった。
41日間の的中ゼロ日数:28日
1日あたりのゼロ的中率:28 / 41 ≈ 68.3%
つまり、バックテストの時点で「10日中およそ7日はゼロ的中」というのが、このモデルの通常運転だったということになる。
ここで、「4日連続ゼロ」が起きる確率を単純計算してみる。
1日あたりゼロ的中の確率:p ≈ 0.683
4日連続ゼロの確率:p^4 ≈ 0.683^4 ≈ 21.8%
約5回に1回は、4日連続ゼロが起きる計算になる。
「あり得ないほど異常」ではない。だが、「気にしなくていいほど普通」とも言えない、微妙なラインだ。
この計算の前提が抱える弱さ
ただし、この21.8%という数字自体、鵜呑みにはできない。前提にいくつかの弱さがあるからだ。
弱さ1:41日間という母数自体が小さい
「1日あたりゼロ的中率68.3%」は、41回の試行から推定した値に過ぎない。この推定値自体に誤差がある。二項分布の標準誤差で見ると:
標準誤差 = √(0.683 × 0.317 / 41) ≈ 7.3%
つまり実際の「真のゼロ的中率」は、60%台後半から70%台前半のどこかにある可能性が高く、68.3%ちょうどだと決めつけるのは危うい。
弱さ2:日々の的中は独立ではないかもしれない
上の計算は「各日が独立事象」という前提を置いている。だが、レースの傾向(開催場、馬場状態、季節)が数日単位で似通うことはよくある。8月8日・9日・15日・16日は、いずれも札幌・新潟・中京中心の開催で、傾向が似ている可能性がある。independent(独立)という前提が崩れていれば、「連続ゼロ」はこの単純計算より起こりやすくなる。
弱さ3:バックテストと実運用は厳密には同じ条件ではない
バックテストは「その日より前のデータしか知らないリークなしモデル」を使っていたが、実運用は「8月5日更新分までを学習した本番モデル」を使っている。学習データの鮮度は違う。理論上は実運用の方が新しい情報を持っているはずだが、逆に直近の悪いパターンを学習してしまっている可能性もゼロではない。
結論:「21.8%だから想定内」と安心しきるのは早計。だが「4日連続ゼロ=システムが壊れた」と即断するのも早計。 どちらの立場も、今のサンプルサイズでは断定できない。
今、僕がやっていること・やらないこと
やっていること
✓ 毎日の推奨馬と結果を、正直に記録し続ける
✓ 累計件数が増えるごとに、41日間バックテストの傾向(回収率122.2%、
的中率9.6%)と乖離していないかを定期的にチェックする
✓ 開催場・EV帯など、41日間バックテストで使った切り口で実運用データも
同じように分解し、特定のパターンに偏っていないか確認する
あえてやらないこと
✗ 24件というサンプルだけで、条件(EV3.50〜5.00・既知馬限定)を
再調整すること
✗ 「勝率が下がっている気がする」という感覚だけでロジックを変更すること
理由はシンプルだ。24件はあまりに少なすぎる。前回の記事(#22)で「サンプルを増やすたびに171.5%→118.5%→92.6%と数字が崩れた」経験をしたばかりだ。今度は逆方向に、少ないサンプルの悪い結果だけを見て慌てて調整すれば、同じ過ちを繰り返すことになる。
良い数字が出たときに疑ったのと同じように、悪い数字が出たときも、飛びつかずに疑う。 それが一貫した態度だと思う。
今後の判断基準
このままただ「様子見」を続けるだけでは、記事として無責任だ。あらかじめ、次にどう動くかの基準を決めておく。
基準1:累計50件に到達した時点で、的中率・回収率を再確認する
→ 41日間バックテストの水準(的中率9.6%、回収率122.2%)と
大きく乖離していれば、原因分析に着手する
基準2:連続ゼロ的中が7日(バックテストの最大連続ゼロ日数相当)を
超えた場合は、件数を待たずに一度立ち止まって点検する
基準3:累計回収率が50%を明確に下回る状態が続く場合は、
EV下限のさらなる引き上げ(3.50→4.00等)や、開催場別の追加
絞り込みを検討する
数字が悪いからといってすぐに手を加えるのではなく、「どの水準になったら手を加えるか」を先に決めておくことで、感情的な判断を避けたい。
Data Scientistとしての振り返り
前回(#22)は「良い数字を疑う」話だった。今回は、その裏返しで「悪い数字も、慌てて疑う」話になった。
どちらも根っこは同じだ。サンプルサイズが小さいうちは、良い方向にも悪い方向にも、数字は簡単にブレる。 そのブレに一喜一憂して条件を変え続ければ、いつまで経っても「本当の実力」にはたどり着けない。
4日連続ゼロという事実は変えられない。だが、それを「バグの証拠」と決めつけるのも、「気にする必要なし」と切り捨てるのも、今の時点ではどちらも根拠が薄い。「まだ判断できない」という結論を、正直に受け入れる。 これも一つの誠実な態度だと思っている。
技術ノート
実運用データの記録方法
買い目リスト(keiba_ai_v3_6_hybrid_kaime_list_*.txt)と、
確定後のレース結果CSVを突き合わせて検証している。
買い目リストには race_id・オッズが直接含まれないため、
記載されている「勝率」と「EV」から
推定オッズ = EV ÷ 勝率
を逆算し、場所+馬名で実結果と照合する簡易検証スクリプトを使用。
累計成績(2026年8月16日時点)
実運用日数:4日
推奨件数 :24件
的中数 :0件
回収率 :0%
参考:41日間バックテスト(過去データ)
推奨件数 :178件
的中率 :9.6%
回収率 :122.2%
1日あたりゼロ的中率:68.3%(28/41日)
次回の予定
累計50件到達時点での中間報告
上記の「基準1」に従い、累計50件に到達した時点で、バックテストの傾向とどれだけ一致・乖離しているかを報告する。
それまでにやること
✓ 毎日の推奨馬と結果を淡々と記録する
✓ 連続ゼロ日数が7日を超えないか注視する
✓ 条件は変更せず、今の設計(既知馬限定・EV3.50〜5.00)を維持する
いずれの結果になっても、正直に報告する。それが、この開発記録を続ける意味だと思っている。
【競馬AI開発記】次回予定:
- Day 24:累計50件到達時点での中間報告
- Day 25:開催場別・季節別の実運用データ分析(3月の成績が特に弱かった件の続報)