前回の記事 で構築した LightGBM lambdarank ベースの JRA 中央競馬予測モデル v11 を、2026-05-16 (土) と 5/17 (日) の本番運用 (forward test) で初投入した。
結果の要点を 5 行で:
- 三連複 BOX 1 点的中率 6.9% (2/29 race) で、backtest 期待値 24.9% の Wilson 95% CI 外。統計的に有意に外れた週である。
- しかし top3 包含 ≥2 率は 72.4% で backtest の 77.7% を CI 内に含む。モデルの top3 認識能力自体は健全、「3 頭目を確定する最後の段階」で運に負けた格好である。
- 発走 10 分前 (T-10) で予測を固定した方が、発走 2 分前 (T-2) で再判断するより明らかに良かった。T-10 fix の三連複 ROI 1.452 vs T-2 final の 0.372。これは事前想定と真逆である。
- SHAP 差分分析の結果、T-10 → T-2 で v11 を惑わせた主因は 単勝オッズの変動 (mean |SHAP diff| 0.439、2 位 人気 0.059 の 7.5×)。
- 仮説: 訓練データは「投票締切後の確定オッズ」(T-0) で構築されているが、T-2 は「大口投票と大衆パニックが交錯する過渡期」で、訓練分布と乖離している。典型的な Covariate Shift + Transient Noise である。
用語ノート (本記事の前提)
- LightGBM lambdarank: 順位学習 (Learning to Rank) 用の勾配ブースティング決定木
- Covariate Shift: 訓練データと推論データで入力 (特徴量) 分布が異なる現象
- Wilson 95% CI: 二項比率の信頼区間 (小サンプルで正規近似より頑健)
- SHAP (TreeExplainer / pred_contrib): 各特徴量の予測寄与を分解する値
- OOD (Out-of-Distribution): 学習分布から外れた入力領域
- Bayes error rate: 完全な classifier でも到達できない誤り率の下限
以下、データと考察を詳しく述べる。
1. 背景: モデルの位置付け
前回の記事で構築した v11 (v11_market_cross) は以下の構成である。
- LightGBM lambdarank, 5-seed ensemble, 43 features
- Kaggle 1986-2021 + 公開オッズデータをもとに 2021-2026 を個人研究用途で整備したデータセットで訓練
- backtest (Out-of-Holdout 408 race) で三連複 BOX 1 点パターンの ROI 2.81, 的中率 24.9%
本番運用フェーズで採用した馬券設計は以下のとおり。
- 三連複 BOX 1 点 (top1-top2-top3 の 1 通り) ¥100
- 馬連 1 点 (top1-top2) ¥100
- 発走 10 分前 (T-10) と 発走 2 分前 (T-2) で 2 回推論し、Discord に通知
- 閾値
top1_prob >= 0.35で GO 判定、未達は SKIP
本記事は モデル性能 の話に絞る。実際の購買行動・損益は別の話題である。
2. Week 1 (2026-05-16, 17) の主要 KPI
| 指標 | Forward Week 1 (n=29 GO) | Backtest (n=408) |
|---|---|---|
| 三連複 BOX 1 点 hit rate | 6.9% (2/29) | 24.9% (三連複 BOX 1 点パターン) |
| Wilson 95% CI | [1.9%, 22.0%] | — |
| top3 包含 ≥2 率 | 72.4% (21/29) | 77.7% |
| Wilson 95% CI | [54.3%, 85.3%] | — |
| 三連複 BOX 1 点 ROI | 0.372 | 2.81 |
| 馬連 1 点 ROI | 0.876 | — |
2.1 統計的判定
ポアソン期待値 λ = 29 × 0.249 = 7.22 (backtest 通りなら期待される hit 数)。
実測 2 件は P(X ≤ 2 | λ = 7.22) ≈ 2.5%。1 週でも 5% 水準で棄却される程度に外している (ただし n=29 で結論は弱い)。
n=29 は backtest の n=408 と比べて 14 倍少なく、Wilson 95% CI の幅は 20 pt 超。1 週で結論を出すには弱い前提を維持する。
2.2 何が健全で、何が崩れたか
| 観点 | 評価 |
|---|---|
| 上位 3 頭の認識能力 (top3 包含 ≥2 率) | ✅ Backtest と一致、モデルは正常 |
| 1 着馬の認識能力 (単勝 ROI) | 🟡 0.628-0.844 (まちまち) |
| 3 頭目の確定能力 (三連複 hit rate) | ❌ Backtest 24.9% → Forward 6.9% に大幅低下 |
モデル全体ではなく、「3 頭目を確定する最後の判定」が崩れている。
3. 想定と真逆だった発見: T-10 fix vs T-2 final
事前想定は「発走 2 分前 (T-2) で確定オッズを使って再推論すれば精度が上がる」だった。実測は真逆である。
3.1 T-10 vs T-2 transition の ROI 比較
| 戦略 | n | hit | 払戻 | ROI |
|---|---|---|---|---|
| T-10 で買い目固定 | 21 | 4 | ¥3,050 | 1.452 |
| T-2 final で再判断 | 29 | 2 | ¥1,080 | 0.372 |
T-10 fix の方がサンプル数が少ないのに hit が多い。T-2 final で T-10 から買い目を変更することが、明確に予測精度を悪化させた という結果である。
3.2 transition 別の hit rate
T-10 → T-2 で予測がどう変化したかを 4 パターンに分類した。
| Transition | n | 三連複 hit | hit rate |
|---|---|---|---|
| GO → GO_same (買い目同一) | 11 | 1 | 9.1% |
| GO → GO_changed (買い目変更) | 8 | 0 | 0.0% |
| SKIP → GO (T-2 で新規 GO) | 10 | 1 | 10.0% |
| GO → SKIP | 2 | — | — |
T-2 で意見が変わったレース (GO_changed) は 8 戦全敗。Late Money の動きに合わせて買い目を変えた結果、的中ゼロという結果になった。
3.3 破壊された hit の具体例
3 件で「T-10 で予測していた 3 頭目」を T-2 で別馬に変更し、結果として T-10 推奨の馬が来た。
| race | T-10 推奨 | T-2 推奨 | actual 1-3 着 | T-10 三連複 | T-2 三連複 |
|---|---|---|---|---|---|
| 5/16 新潟 R1 | [8, 7, 4] | [8, 7, 3] | [4, 7, 8] | ✅ ¥1,040 | ❌ ¥0 |
| 5/16 新潟 R2 | [14, 12, 3] | [14, 12, 13] | [14, 12, 3] | ✅ ¥710 | ❌ ¥0 |
| 5/16 新潟 R9 | [12, 14, 6] | [12, 14, 5] | [12, 6, 14] | ✅ ¥1,050 | ❌ ¥0 |
4. なぜこうなった — Covariate Shift × Transient Noise
4.1 訓練データの暗黙の前提
v11 の訓練データに含まれる「オッズ」は 投票締切後の確定オッズ である。これは時系列で言うと T-0 (発走直前) の値となる。
- T-0 (訓練データ): 全投票が終わり、再び安定した「最終コンセンサス」
- T-10 (本番運用 1 回目): 大衆の「初期コンセンサス」、流動的だが比較的安定
- T-2 (本番運用 2 回目): 大口投票 (Smart Money) と大衆パニックが入り乱れる「カオスな過渡期」
つまり「モデルは嵐の過ぎ去った後 (T-0) で学習しているのに、本番では嵐の真っ只中 (T-2) のデータを食わされている」状況だ。これは機械学習で言うところの Covariate Shift (訓練分布と推論分布のズレ) の典型例である。
しかも T-2 のオッズ変動は単なるノイズではなく、特定の馬に極端に偏る ファットテール (Transient Noise) で、v11 の決定境界に対して adversarial-like な摂動 (= 敵対例に近い性質をもつ摂動) として作用していると考えられる。
4.2 直接観測の証拠
GO_changed 8 レースのうち、5 件は順序のみ入れ替わり、3 件は集合変化。集合変化の中で 5/16 新潟 R1 は特に興味深い。
| 時点 | top3 推奨 |
|---|---|
| T-10 (前売り) | [8, 7, 4] |
| T-2 (forward 実測) | [8, 7, 3] |
| T-0 (確定後) | [8, 7, 15] |
T-2 で資金が 3 番に流れたが、T-0 までに 15 番に巻き戻された。これは「嵐の真っ只中で v11 の決定境界が狂わされ、嵐が過ぎ去った後に一部が戻る」という Covariate Shift 仮説の直接観測である。
5. SHAP 差分分析: 何が決定境界をまたがせたか
GO_changed 8 レースの v11 内部 SHAP 値を、T-10 features と T-2 features で差分計算した。
※ 注意: 5/16-17 時点の運用パイプラインでは、T-2 時点での features を後から復元できなかったため、本分析では T-0 (確定オッズ) を T-2 のプロキシ として使用している。前述の Covariate Shift 仮説が正しければ実 T-2 の SHAP 差分は本結果より大きい (= 「真の差分の下界」を観測している) と解釈できる。
| Rank | Feature | mean |SHAP diff| | 値変動 |
|---|---|---|---|
| 1 | 単勝 | 0.4392 | ✅ 大幅変動 |
| 2 | 人気 | 0.0587 | ✅ 1-3 ランク変動 |
| 3 | rl_trio_odds_ratio | 0.0236 | ❌ interaction のみ |
| 4 | 調教師 | 0.0157 | ❌ interaction のみ |
| 5 | rl_market_consistency | 0.0137 | ❌ interaction のみ |
SHAP 分解上は単勝オッズの寄与が dominant で、2 位の人気の 7.5 倍。Tree 構造の上位ノード分岐に単勝が強く効いており、T-10 → T-2 でその値が変動すると、データが Tree 内で辿る経路 (Routing path) が根本から変わる。
これが「T-10 で評価されていた Fundamental 特徴量 (血統や騎手) の葉に到達できなくなる」現象の正体と推測できる。
(なお SHAP は寄与の分解であって因果関係そのものではない。本分析は「単勝値変動と予測変動の相関構造」の記述である点に留意。)
5.1 個別 swap 馬の SHAP 内訳
5/16 京都 R4 (T-10 [6,2,1] → T-2 [6,7,2]、swap_in=7, swap_out=2) を例にとる。
| 馬 | role | prob T-10 → T-0 | 単勝 SHAP | 人気 SHAP | rl_market_consistency SHAP |
|---|---|---|---|---|---|
| 2 | OUT | 0.169 → 0.118 | -0.201 | -0.169 | -0.113 |
| 7 | IN | 0.083 → 0.142 | +0.322 | +0.182 | +0.111 |
馬 7 の単勝オッズが 8.0 → 4.7 (-41%) と圧縮された結果、単勝 SHAP +0.322 + 人気 SHAP +0.182 + market_consistency interaction +0.111 で top3 入りを実現している。
6. v12 Dual Model 構想
6.1 短期: T-10 fix 規律
実用上の即時対応として、T-2 で買い目が変わっても T-10 推奨を維持する規律 を導入した。これは Late Money 仮説を否定するのではなく、「v11 のアーキテクチャでは解釈できない OOD 領域での勝負を一旦降りる」という、クオンツ運用の定石に近いリスク回避策である。
6.2 中期: T-10/T-2 オッズスナップショット蓄積
forward test 期間中、data/odds_snapshots/{date}/race_{rid}_{trigger}.json に T-10 と T-2 のオッズスナップショットを個人研究用途で保存する仕組みを導入。2-3 ヶ月で n≈200-300 race の T-10/T-2 ペアを蓄積する計画である。
6.3 長期: v12 = v11 + Drift features (Transfer Learning)
蓄積データを使って v12 を fine-tuning する設計が固まった。
v11 base (43 features, T-10 値で固定) ← ルーティング保護
↓ 元の予測 logit
+ v12 補正 trees (5 つの Drift features)
- 単勝_drift_log = log(単勝_t2 / 単勝_t10)
- 人気_drift
- rl_top1_odds_drift
- rl_odds_dispersion_drift_ratio
- rl_market_consistency_drift
Transfer Learning:
learning_rate = 0.005 (v11 表現を壊さない)
num_boost_round = 30-50 (微増のみ)
min_data_in_leaf = 200-400 (小サンプル過学習防止)
↓
→ v12 最終予測
設計のキモは 「T-10 の値で v11 を呼び出し、その出力に Drift features 由来の補正を加える」 構造である。これにより v11 の Tree ルーティングを保護しながら、Late Money 由来の情報を追加で取り込める。
7. まとめ
- Week 1 の結果は想定外だったが、データから多くの学びを得た。
- モデル本体 (top3 認識能力) は backtest と一致しており、健全である。
- 「3 頭目を確定する段階」と「T-10/T-2 transition」の 2 点で v11 は脆弱性を露呈した。
- 根本原因は 訓練データ (T-0) と推論データ (T-2) の分布ズレ という Covariate Shift である。
- 短期対応として T-10 fix 規律、中期で T-10/T-2 オッズ蓄積、長期で v12 Transfer Learning というロードマップを設計した。
これらの知見は LightGBM ベースのオンライン推論システム全般に通じる教訓だと考えている。「訓練時に使ったオッズが本当は時点 X の値だった」という気づきは、競馬予測に限らず、金融時系列・需要予測など、市場データを扱う ML システム全般で陥りやすい罠だろう。
次回は learning_rate=0.005 という攻めすぎないハイパーパラメータで v11 のルーティングを本当に保護できるかを、Week 2-3 の蓄積データで検証する。「ベースモデルを壊さず Drift だけ補正する」設計が成立するなら、これは時系列 ML 一般に応用可能なパターンになる。
補遺 A: 時間帯バイアス (Bayes error rate 観点)
Covariate Shift 分析とは独立した観察として、午前 (R1-R6) と午後 (R7-R12) でモデルの予測精度が大きく異なる傾向を観測した。
A.1 ヒット数 (T-10 ベース、全レース n=36 ずつ)
| 券種 | 午前 (R1-R6) hit | 午後 (R7-R12) hit | 倍率 |
|---|---|---|---|
| 馬単 | 7 (19%) | 1 (3%) | 7.0× |
| 馬連 | 9 (25%) | 2 (6%) | 4.5× |
| 三連複 | 5 (14%) | 2 (6%) | 2.5× |
| ワイド | 24 (67%) | 17 (47%) | 1.4× |
| 三連単 | 3 (8%) | 0 (0%) | ∞ |
午後の三連単は 0/36、午前は 7 券種中 6 つで黒字 ROI を観測した。
A.2 解釈仮説
- 午前 (R1-R6) は未勝利・新馬・若駒戦が多く、情報の非対称性が大きい。市場の流動性も低く、オッズが歪みやすい。v11 の Fundamental エッジ (血統・調教・過去成績) が活きやすい。
- 午後 (R7-R12) はオープン特別・重賞で、誰もが知る情報による効率市場に近い。Fundamental の優位性は消滅し、唯一のエッジは Late Money のみ。これは v11 が学習していない領域である。
これは Bayes error rate の観点でも整合的である。午後の方が Bayes error rate が高く (= 効率市場下で予測限界が厳しく)、モデルが当てにくい構造になっている。
n=36 ずつの 1 週分のみのため、結論は 3-4 週後の検証を待つ。
補遺 B: 免責
本記事は機械学習研究の技術メモであり、馬券購入の推奨・投資助言・賭博助言・利益保証のいずれにも該当しません。
本文中の ROI・的中率は過去データおよび小サンプル (n=29) の forward test に基づくものであり、将来の利益を保証するものではありません。
馬券購入は自己責任で行ってください。20 歳未満の方は購入できません (競馬法)。