0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

# 【番外編 第2話】 競馬 データ で 学んだ、 時系列 ML の **リーク 監査 と 確率 較正** 🏇📚

0
Posted at

⚠️ 先 に 重要 な お知らせ (= 全部 読まなくて も これ だけ は):

  • 本 記事 は 競馬 データ を 題材 に した 時系列 機械 学習 の 検証 記録 で あり、 馬券 購入 ・ 自動 投票 ・ 投資 判断 を 推奨 する もの で は あり ません。
  • 記載 する ROI は 特定 条件 下 の backtest または 検証 ログ で あり、 将来 の 成績 ・ 利益 を 保証 する もの で は あり ません
  • 20 歳 未満 の 方 は、 競馬 法 第 28 条 に より 勝馬 投票券 を 購入 ・ 譲り 受け する こと は できません
  • 契約 サービス 由来 の 生 データ、 個別 レース ・ 個別 馬 の 予測値、 買い目、 再 構築 可能 な 特徴量、 投票 連携 手順 は 公開 しません。

📖 3 分 要約 (= 長い 記事 です が、 結論 だけ):

  1. リーク を 潰したら 構造 ROI は 80% 程度 まで 落ちた (= 控除率 に 飲まれる)。 「ROI 800% モデル」 は 全部 leak だった
  2. そこ から 市場 オッズ と 合成 (= Benter 較正) + 戦略 選定 (= EV 閾値) を 重ねて、 backtest 上 100% 超え 候補 が 数 戦略 出 た
  3. ただし backtest は 確定 オッズ で 評価 して おり、 実 投票 時点 で は odds drift で 期待値 が ズレる 可能性 が ある。 「forward 検証 に 進める 候補」 に 過ぎ ない
  4. 競馬 ML で 一番 重い の は モデル 設計 では なく、 データ 基盤 (30%) と 特徴量 設計 + リーク 監査 (40%) だった

これは何:
弊社 Qiita 連載「建築 × AI」 シリーズの 番外編 続報 です。 前回 記事 (= 「ROI 140% より 先 に 税金 が 気 に なった 話」) で 触れた 競馬 AI、 その後 1 ヶ月 で 9 代 血統 / Plackett-Luce / Benter 較正 / LambdaRank まで 詰め込んだ ので、 自分 が 通った 道 と、 同じ 道 を 1970 年代 から 通って きた 世界 中 の 先人 を 並べて 紹介 します。

📌 本 記事 は 中間 報告 で、 一部 の 検証 ・ 起動 確認 は 投稿 時点 で 進行中 / 予定 の 状態 を 含み ます。 完了 / 失敗 / 延期 は 後続 の 「結果 編」 で 報告 します。


この 記事 で 分かる こと 📖

  • 競馬 ML で なぜ 二値 分類 だけ では 足り ない の か (= Plackett-Luce が 必要 な 理由)
  • Plackett-Luce / Benter 較正 / Kelly が それぞれ 何 を して いる 道具 な の か
  • backtest ROI が 高すぎる とき に 何 を 疑う べき か (= リーク 監査)
  • 競馬 AI を 作る 上 で、 モデル より データ 基盤 と リーク 監査 が 重い 理由

⚠️ 注意: 本 記事 中 の ROI は、 評価 段階 に よって (1) odds 特徴量 なし モデル の proxy 評価、 (2) HR 払戻 ベース walk-forward、 (3) 真 odds 付き 戦略 backtest混在 します。 以降 では、 可能 な 限り 評価 系 を 明記 します。 さらに、 三連単 系 の ROI は 分散 が 非常 に 大きい ため、 ROI 単体 で は なく、 bets 数 ・ 的中 数 ・ 年別 ROI ・ 最大 DD ・ bootstrap 信頼 区間 を 併記 する 必要 が あります。 本 記事 は 中間 報告 として 点 推定 を 載せ、 5/25 結果 編 で 分散 込み で 評価 します。


第0章 オチ を 先に 言います 🎯

弊社 の 競馬 AI、 前回 記事 (= 2026-05 上旬 公開) から 今日 まで で だいたい こう なりました。 ROI は 評価 系 で 値 が 違う ため、 必ず 「評価 条件」 列 と 一緒 に 読んで ください。

⚠️ 以下 の 数字 は 未使用 期間 で の 利益 保証 では なく、 検証 条件 ご と の 観測 値 です。 戦略 選定 後 の 同じ データ 系列 で の 再 評価、 確定 オッズ で の backtest、 サンプル サイズ の 制約 など を 含み、 forward (= 未知 の 期間) の 結果 を 約束 する もの で は あり ません。

Phase モデル 評価 条件 ROI 備考
Phase 0 TFJV 1954-2025 raw 抽出 (= 17.3M レコード) データ 基盤
Phase 1 LightGBM baseline (= 25 feat、 odds 特徴量 抜き) odds 特徴量 なし モデル / proxy 評価 132.5% 後続 の 真 odds 払戻 評価 と は 別 系統
Phase 2 + 集計型 血統 (Sire / BMS / Phase 1-4) 同上 (= proxy 評価) 141.5% Bayesian smoothing
Phase 3 leak 監査 後 (= chaku_num leak 等 排除) HR 払戻 ベース / 3 年 walk-forward 77 - 81% 現時点 の 評価 設計 で 観測 された 構造 ROI
Phase 4 + LE 込み 254 feat (= label encoding 全部) odds 特徴量 なし モデル / proxy 評価 単勝 約 140% / 三連単 N=1 で 134.4% 戦略 評価 前、 振れ 大
Phase 5 + Plackett-Luce 三連単 (= N=1 LE +56pt) 6 年 backtest / 真 odds 払戻 評価 avg 136% (= spread 203pt、 2022 69%・2023 78%・2025 272%) hold-out で 良く 見えた N=1 改善 が 真 odds 6 年 で 年別 に 大きく 崩れ、 単独 採用 に 耐えない overfit 候補 と して 不採用
Phase 6 + Benter 較正 (α, β) + 真 odds 6 年 backtest / EV ≥ 1.5 N=1 戦略 200.3% (= 旧 MLE 部分学習 α=0.31/β=0.79、 単年 50% 含む、 spread 300 pt) model × market blending、 旧 S6 (= 5/21 に deprecated)
Phase 7 Benter MLE 全期間 再学習 n=20,626 race / MLE α=0.2825, β=0.8597 (= ΔLL +0.1569) 旧 S6 で n=25 サンプル 崩壊 確定 → 戦略 切替
Phase 8 新 MLE で re-validation (= S6 deprecated 確定) 6 年 walk-forward / 各 戦略 旧 S6: mean 307% / n=25/年 / spread 969 pt → 採用 不可 サンプル 崩壊 検出、 新 主力 候補 抽出
Phase 9 S6_v2 主力 候補 + 年別 resampling 参考 レンジ 6 年 walk-forward / S6_v2 (= MLE EV ≥ 1.2 N=5) mean 187.6% / 参考 レンジ [130%, 249%] / n=353/年 / spread 195 pt レンジ 下側 2.5% 点 は 130% (= 「統計的に保証」 では なく forward に進める 相対 候補)
Phase 10 1988-2025 (= 約 38 年) 長期 backtest / 中量 cache (208 列、 +UM) 38 年 walk-forward / S6_v2 mean 178.1% (= 6 年 187.6% から gap -9.5 pt、 100%+率 79%、 n=531/年) 「直近 6 年 だけ の 偶然」 説明 を 弱める 材料、 ただし 戦略 選定 後 の 再 評価 + 特徴量 セット 不一致 (= 254 列 vs 208 列) に 注意

つまり 「リーク を 消したら 現時点 の 評価 設計 で 観測 さ れる 構造 ROI は 80% 程度」 が ベース で、 そこ に 戦略 (= EV 閾値 / 馬券 種 選択 / 較正) を 重ねて 初めて 100% を 超えに 行く、 と いう 構造 です。 Phase 1 の 132.5% は 「odds 抜き proxy 評価」 の 数字 で、 Phase 6 の 200.3% は 「真 odds × 戦略 backtest」 の 数字、 同じ ROI と 書いて あって も 比べる もの では ない

⚠️ Phase 5 の 重要 訂正: 前回 記事 で 触れた hold-out 三連単 N=1 ROI 134.4% (= LE +56pt) は、 5/20 真 odds 6 年 backtest で avg 136% / spread 203 pt / 2022 69%・2023 78%・2025 272% と 年別 に 大きく 崩れ、 単独 採用 に 耐えない overfit 候補 と して 不採用 と なりました。 三連単 (1,0) N=10 ev≥1.5 (= avg 105% / spread 34pt) を 留保 候補 と して 残し、 主力 は 単勝 系 に 寄せて います。 「真 odds で 評価 し なおす」 と いう 工程 を 入れた こと で、 初めて overfit を 切り 出 せた 例 です。

🧪 馬券 種 別 「100%+ 戦略」 の 数 (= 真 6 年 backtest、 EV × N × α/β grid、 計 882 戦略): 単勝 43 件 / 三連単 17 件 / 複勝 0 / 馬連 0 / ワイド 0 / 馬単 0 / 三連複 0今回 の 特徴量 ・ 期間 ・ grid では 中間 5 馬券 種 で 100% 超え 戦略 が 出 なかった。 これ も 真 odds 評価 を 入れ ない と 出て こない 結論 で、 「構造 不可能」 と 断定 する もの では ない 点 に 注意。

そして、 1 ヶ月 で 何度 も 「自分 で 思いついた」 と 思った アイデア が、 全部 1986 年 - 1994 年 の 論文 に 既出 だった。 これ が 今回 の 一番 の 学び。 もちろん 細部 の モデル や 実装 は 進化 して いる が、 基本 論点 は 驚く ほど 変わって いない。

📅 5/25 月曜 22 時 に 「実戦 結果 編」 を 出す 予定。 本 記事 は 実戦 直前 の 中間 報告 で、 競馬 ML を 始めて みたい 人 向け の 理論 + 実装 ツアー です。

📖 読み方 ガイド (= 長い 記事 なので):

  • 理論 だけ 知り たい 人 → 第2章 ・ 第3章
  • 実装 の 罠 を 知り たい 人 → 第4章 ・ 第5章
  • forward 投入 前 の 検証 設計 を 知り たい 人 → 第8章
  • 論文 リスト だけ 持って 帰り たい 人 → 末尾 「参考 文献」

第1章 前回 の あらすじ と 「素朴 な 疑問」 📝

前回 記事 で 自分 は 「LightGBM + 40 次元 特徴量 で 単勝 hold-out ROI 140%」 と 書きました。 それ自体 は ちょっと した 数字 です が、 開発 を 進める うち に 2 つ の 素朴 な 疑問 が 出て きました。

  1. そもそも 競馬 の 確率 は どう モデリング する の が 正しい の か?
    • LightGBM 二値 分類 で 「1 着 か 否か」 を 学習 して いた が、 これ 競馬 と いう 「全頭 が 1 つ の race で 競う」 構造 を 取り こぼして いる の では?
    • 「3 着 の 馬」 の 情報 は 学習 に 使え ない の か?
  2. モデル の 出力 確率 を、 そのまま 期待値 計算 に 使って いい の か?
    • LGBM の 出力 30% は 統計 確率 30% と 違う。 そこ を どう 整合 させる の か?
    • 市場 (= 確定 オッズ) に 含まれる 集合 知 を どう モデル と 合成 する の か?

調べ 始めて すぐ、 これ ら の 疑問 は 30 - 40 年前 に 既 に 整理 されて いた こと が 分かり ました。 ここから が 本題。


第2章 競馬 ML の 「世界 史」 (= 1986 - 2024) 🌐

競馬 ML の 系譜 は 思って いた より ずっと 古い。 主要 な マイルストーン を 時系列 で 並べ ます。

2.1 1973 Harville: 競馬 確率 モデル の 「原点」

Harville (1973, JASA) は 「3 頭 以上 の レース で、 1 着 から 3 着 まで の 順位 確率 を どう 計算 する か」 に 数学 的 整理 を 与えた 代表 的 な 初期 研究 の 一つ。 アイデア は シンプル で、 正規化 済み の 1 着 確率 を p_i と 書く と、

P(i が 1 着、 j が 2 着) = p_i × p_j / (1 - p_i)

と なる。 より 一般 に 各馬 の 強さ を s_i と 書け ば、

P(i, j) = s_i / Σs × s_j / (Σs - s_i)

と 表せて、 これ が 後段 の Plackett-Luce 型 逐次 選択 モデル の 形 です。 1 着 を 1 頭 引いた あと の 残り 集団 で 「次 の 1 着」 を 確率 計算 する、 と いう 構造 が ここ で 出 揃って います。

この シンプル さ が 今 でも 三連単 / 三連複 確率 計算 の ベース ライン と して よく 使われて おり、 弊社 の Phase 5 で 採用 した Plackett-Luce モデル は これ と 同型 の 逐次 選択 モデル (= Plackett 1975 と Luce 1959 が 独立 に 同じ 構造 に 到達 した) と 整理 されて います。

2.2 1986 Bolton & Chapman: MNL の 競馬 応用

Bolton & Chapman (Management Science, 1986) は McFadden の Conditional Logit (= 多項 ロジット) を 競馬 の win-betting / pari-mutuel に 適用 した 代表 的 な 初期 研究。 「馬 i の 強さ π_i を、 各馬 の 観察 特徴 ベクトル x_i の 線形 関数 で 表す

π_i = exp( β^T x_i )
P(馬 i が 1 着) = π_i / Σ_j π_j

これ、 数式 を 見ると ほぼ softmax で す。 つまり、 競馬 の 1 着 確率 は 「馬 数 が 可変 な softmax 分類」 と 整理 できる。

これ を 言われて 自分 は ぶっ飛び ました。 自分 が ふんわり LightGBM で 「1 着 か 否か」 の 二値 分類 を やって いた の は、 馬 数 可変 を 無視 した 雑 な 近似 だった と いう こと です。

補足: 二値 分類 でも race_id ご と に 予測値 を 正規化 し、 評価 も race 単位 で 行えば 実務 上 の 近似 と して は 使え ます。 問題 は 学習 損失 が race 内 の 相対 順位 を 直接 見て いない 点 で、 LambdaRank や Plackett-Luce 最尤 損失 を 使う 方 が 構造 と は 合います。 弊社 の Phase 1 - 4 は 二値 分類 + race 内 softmax 正規化 で 走って いて、 これ で も hold-out 上 は 動く。 ただし forward で 思った 順位 が 出 ない ケース は 損失 設計 ま で 戻る べき、 と いう 整理。

2.3 1994 Benter: 競馬 ML の 古典 的 代表 作

William T. Benter は 1980 年代 後半 から 香港 競馬 で コンピュータ 賭博 を やって、 数年 で 大規模 な 利益 を 上げた と 報じられて いる 人物 (= 具体 額 は 各種 報道 で 数字 が 揺れる ため、 ここ で は 一次 文献 で 確定 した 数字 で は ない こと を 断って おきます)。 1994 年 の "Computer Based Horse Race Handicapping and Wagering Systems: A Report" は 競馬 ML の 古典 的 代表 作 と して 知られ、 30 年 たった 今 でも 後続 論文 が 広く 引用 します。

Benter の 主張:

  1. モデル を Bolton-Chapman 流 MNL で 構築 する
  2. モデル 出力 だけ を 信じて はいけない。 市場 (= 確定 オッズ に 織り込まれた 集合 知) は 強力 で、 単独 モデル で は 越えられない こと が 多い
  3. モデル × 市場 を α / β で blending する
P_public(i)  =  normalize( 1 / odds_i )      # race 内 で 正規化 した public implied probability
P_final(i)   ∝  ( P_model(i) ^ α )  ×  ( P_public(i) ^ β )
  • 簡略 化 して 「1 / odds」 と 書く こと も 多い が、 実装 上 は race 内 で 正規化 した public implied probability を 使う (= odds に は 控除率 が 含まれて おり、 そのまま では 確率 に なら ない)
  • α = モデル 出力 を どれだけ 信じる か
  • β = 市場 オッズ を どれだけ 信じる か
  • α = 1, β = 0 → モデル のみ
  • α = 0, β = 1 → 市場 のみ
  • 探索 grid と して は α, β を 広め に 取り、 文献 ・ 実務 例 で は 市場 側 β が 残る ケース が 多い (= 弊社 でも β = 0.86 が 出た)

弊社 の Phase 6 で 入れた 「Benter 較正」 は ここ。 部分 学習 (= n = 483 race) で α = 0.3143, β = 0.7945、 続いて 全期間 (= n = 20,626 race) で 再 MLE して、 値 が α = 0.2825, β = 0.8597 (= ΔLL = +0.1569) に 落ち着きました。 「モデル よりも 市場 を かなり 信じる」 較正 で、 これ が 出る と いう こと は 弊社 モデル は 中堅 程度 の 強度 と いう こと です。 Benter の 議論 でも、 単独 モデル 予測 を そのまま 賭け に 使う より、 市場 オッズ に 含まれる public information と 組み 合わせる 重要 性 が 強調 されて おり、 弊社 で 観察 した 「市場 側 を 強く 信じる 較正」 と 方向 性 が 一致 して います。

注意 点: α / β が 動いた 後 で 単勝 EV ≥ 1.5 N=1 戦略 の ROI 200% が 維持 される か は 別問題。 5/22 に α=0.2825 / β=0.8597 で 戦略 ROI の re-validation を 実行 予定。 ± 10 pt 以内 で 動か なければ 「MLE 値 安定」、 ± 30 pt 超 動いたら 「戦略 が MLE 依存」 と 判定 して 見直し。

2.4 1995-2010 拡張: SVM / ベイズ / ニューラル

Lo, Bacon-Shone, Busche (1995) は Harville モデル を 三連複 ・ 三連単 に 拡張 して 大規模 検証。 Edelman (2007) は SVM で 試したが、 Bolton-Chapman 流 MNL より 強くなかった と 結論。 Davoodi & Khanteymoori (2010) は ニューラル で 試したが、 これも 当時 は MNL ベース より 強く なかった。

つまり 2010 年 頃まで は 「ベース ライン は MNL + 集計 特徴量、 そこ から 大きく 上 に 行く 手 は 無かった」 と いう のが 業界 共通 認識。

2.5 2010s 後半 - 現代: 勾配ブースティング + 深層学習

XGBoost (2016) と LightGBM (2017) が 登場 して 状況 が 変わります。 ベンチマーク 上 は 同じ 特徴量 で MNL より 2 - 5 pt 精度 が 上がる ように なった。 弊社 も Phase 1 の LightGBM 採用 は ここ の 流れ。

最近 は さらに 深層 学習 系 が 立ち上がって きて、

  • TabNet (arXiv 2019 / AAAI 2021) — 表形式 データ で Entity Embedding を 学習 (= 種牡馬 ID を 16 次元 ベクトル化)
  • CatBoost — 高 cardinality カテゴリ 変数 に 強い
  • DeepFM / DCN — 交互 作用 を 自動 抽出
  • URIN v4.7 — 北米 系 商用 サービス が AUC-ROC 0.944 を 主張。 ただし 独立 検証 された 共通 ベンチマーク で は ない ため、 SOTA と いう より 「商用 側 の 高 性能 主張」 と して 扱う のが 安全

弊社 は Phase 5 で TabNet を 試したが、 集計 型 (= sire_win_rate 等) より 弱かった ので 採用 見送り。 sire_no が 7,000 + クラス あって、 過学習 が 抑制 し きれ なかった。 Benter が 1994 年 に 「シンプル な 集計 + Bayesian smoothing は 強力」 と 書いて いた のは、 確かに そう だ と 体感 する 結果 でした。


第3章 「競馬 に 合いそう な 確率 モデル」 を 1 つ ずつ 解剖 する 🔬

ここ から が マニアック ゾーン です。 興味 ない 章 は 飛ばし て OK。

📖 章 内 ざっくり 早見 表:

  • 3.1 Plackett-Luce — 「1 着 → 2 着 → 3 着 を 順番 に 引く サイコロ」 で 三連単 確率 を 計算
  • 3.2 Bradley-Terry — 「馬 A と 馬 B が 1 対 1 で 走ったら どっち が 勝つ か」 の 確率
  • 3.3 Bayesian smoothing — 「n=1 だけ で 勝率 100% に なる ノイズ」 を 平均 化 で 抑える
  • 3.4 Wright COI — 100 年 前 の 遺伝学 公式 で 近交 度 を 数値 化
  • 3.5 Nicks 指標 — 「種牡馬 × 母父」 の 相性 スコア
  • 3.6 Kelly 公式 — 賭け 金 配分。 「半分 だけ 守る (Half-Kelly)」 が 実務
  • 3.7 LambdaRank — race 内 の 順位 を 直接 学習 する 損失
  • 3.8 Isotonic — 出力 確率 を 実 統計 に 寄せる 単調 関数 較正

3.1 Plackett-Luce (= 弊社 三連単 で 採用)

ざっくり: 「福引 の くじ 引き」 と 同じ で、 全馬 の 強さ π_i を 持つ 玉 を 袋 に 入れて、 1 着 を 引く → 残り から 2 着 を 引く → 残り から 3 着 を 引く、 を 確率 計算 で 表す モデル。 これ で 「18 頭 race の 三連単 4896 通り の 確率」 を 全部 出せる。

数式 で 書く と、 各馬 に strength パラメータ π_i を 与えて、

P(順序 = (i₁, i₂, i₃))
  = (π_{i₁} / Σπ)   × (π_{i₂} / (Σπ - π_{i₁}))   × (π_{i₃} / (Σπ - π_{i₁} - π_{i₂}))
  • 1 着 を 引く → 残り から 2 着 を 引く → 残り から 3 着 を 引く、 と いう 逐次 引き 抜き
  • 1 着 確率 だけ から、 全 permutation 確率 が 計算 できる

弊社 の Phase 5 実装 は、 LightGBM の 出力 確率 p_i を race 内 で p_i / Σ_j p_j に 再 正規化 し、 これ を Plackett-Luce の strength π_i と して 使い、 18 頭 race なら 18 × 17 × 16 = 4896 通り の 三連単 確率 を 全部 計算 して、 期待値 上位 N 通り に 賭ける。 (= raw score / logit を 使う 実装 で あれば、 race 内 softmax exp(score_i) / Σ exp(score_j) に なる)

注意 点: Plackett-Luce は IIA (Independence of Irrelevant Alternatives) 仮定 を 持って いる。 「1 頭 を 除外 して も、 残り の 順位 確率 比 は 変わら ない」 という かなり 強い 仮定。 実際 の 競馬 では コース 取り の 影響逃げ 馬 が 1 頭 し か 居ない とき の 展開 効果 が あって、 厳密 に は 成立 し ない。 Henery (1981) や Stern (1990) は ここ を 緩めた 正規 / ガンマ 系 モデル を 提案 して いる。

実務 的 に は Plackett-Luce が 圧倒 的 に 計算 が 軽くて 実装 容易 で、 「厳密 で は ない けど ベース ライン として 強い」 ので、 弊社 も 当面 これ で 行きます。 forward で 観測 された ROI の バイアス を 見て、 必要 なら Henery / Stern に 切り 替え る 余地 を 残して おく。

3.2 Bradley-Terry (= 弊社 採用 して いない、 が 馬同士 比較 で 強力)

馬 i と 馬 j が 1 対 1 で 走ったら、 馬 i が 勝つ 確率」 を モデル 化 する 古典。

P( i beats j ) = π_i / (π_i + π_j)

Plackett-Luce は Bradley-Terry の N 馬 拡張 と 見る こと も できる。 1 着 確率 を 推定 する だけ なら Plackett-Luce で 十分 だ が、 「3 番 人気 が 1 番 人気 を 直接 倒す 確率」 と いう 個別 質問 を 直接 学習 し たい とき に は Bradley-Terry の 方 が 自然。 弊社 は 現状 三連単 ROI を 評価 軸 に して いる の で 採用 して いない けど、 将来 「頭 数 を 絞った 馬連 ・ 馬単」 の 戦略 を 作る とき に は 再 検討 候補。

3.3 Bayesian Smoothing (= 弊社 血統 集計 で 全面 採用)

ざっくり: 「1 戦 1 勝 の 種 牡馬 を 勝率 100% と 集計 する と モデル が 騙される」 ので、 事前 に 「とりあえず α 勝 β 敗 した と 思って 集計 する」 こと で、 サンプル の 少ない 値 を 平均 寄り に 引き戻す 処理。 機械学習 の 文脈 で は Pseudocount と か Beta-Binomial Prior と か 呼ばれる、 古典 的 だ が 強力 な 手 法。

sire_win_rate  =  ( 父産駒 の 1 着 数 + α )  /  ( 父産駒 の 出走 数 + α + β )

α = 5, β = 15 を 採用 (= 「事前 に 5 勝 15 敗 した と 思って 集計」)。 これ で n = 1 出走 の 種 牡馬 が 「勝率 100%」 と か 「勝率 0%」 と か いう ノイズ だらけ の 値 を 出して モデル を 騙し に 来る 事態 を 防ぐ。

補足: α / β は 一例 で あり、 本来 は global base rate p₀ と 事前 強度 m に 対して α = m · p₀, β = m · (1 - p₀) の よう に 決める の が 自然 です。 弊社 の (α=5, β=15) は prior mean 25% で、 競馬 の 「父 産駒 1 着 率」 と して は やや 高め に 見える が、 集計 単位 (= 父 系 全体 / 距離 帯 別 等) で の validation 上 の 安定 性 を 見て この 値 を 採用 して います。 集計 軸 を 変える 際 に は α / β を 都度 見直す 余地 が あり。

Bayesian smoothing は、 Benter (1994) が 「集計 系 特徴量 を 入れる 時 は 必ず prior 平滑化」 と 強調 して いて、 30 年 後 の 弊社 も α = 5, β = 15 を 採用。 数式 は 100 年 前 と 同じ。

3.4 Wright COI (= 1922 年 の インブリード 係数、 弊社 9代 まで 拡張)

ざっくり: 「父 系 と 母 系 を 辿って 同じ 祖先 が 何 代 前 に 何 回 出る か」 を 1 つ の 数値 F に まとめた もの。 F が 高い ほど 近交 度 が 高く、 競走 成績 や 健全 性 に 不利 な 傾向 が ある と される 統計。

Sewall Wright が 1922 年 に 提案 した インブリード 係数 (Coefficient of Inbreeding, COI)

F = Σ_A  ( 1/2 )^(n_A + n'_A + 1)  ×  ( 1 + F_A )
  • A は 「父 系 と 母 系 の 両方 から 共通 して 辿れる 祖先」
  • n_A = 父 から A まで の 世代 数
  • n'_A = 母 から A まで の 世代 数
  • F_A = A 自身 の COI

弊社 は TFJV UM.parquet の 3 代 血統 から スタート し、 公開 データ + 手元 DB 経由 で の 補完 で 9 代 まで 拡張 した COI を 計算 (= 211,409 馬 × 2048 列 の pedigree_9gen.parquet を 構築)。 5,993 馬 (= 約 2.8 %) が F > 0 を 持つ。

⚠️ サニティ チェック 中: F > 0 が 2.8% は 9 代 拡張 と しては 直感 的 に かなり 低い ので、 (a) 9 代 全部 が 埋まって いる 馬 の 割合、 (b) 祖先 ID の 名寄せ 率、 (c) 同一 祖先 の name / ID 表記 揺れ、 (d) Northern Dancer など 既知 クロス が 検出 できる か、 (e) F の ヒストグラム、 (f) 世代 別 重複 祖先 検出 数、 を 順に 検査 中。 数字 は 改訂 の 可能性 が ある。

インブリード と 競走 成績 の 関係 は、 学術 文献 で も 体系的 に 検証 されて います。

  • Scientific Reports (2018) "Founder-specific inbreeding depression affects racing performance in Thoroughbred horses" — 豪 サラブレッド 135,572 頭 (= 2000-2011 出走) + 創始 馬 まで 遡る 257,249 頭 の 系譜 で、 近交 と 競走 成績 の 関係 を 検証
  • Proceedings of the Royal Society B (2022) "Inbreeding depression and the probability of racing in the thoroughbred horse" — 6,128 頭 の 欧州 ・ 豪 サラブレッド × 297K SNP genotypes で、 F_ROH が 10% 増える と 出走 可能 性 が 7% 低下

つまり COI は 近交 に 伴う 競走 成績 ・ 健全 性 リスク を 拾う 候補 特徴量 と して 有用。 ただし 影響 は 祖先 ・ 集団 ・ 評価 指標 に 依存 する ため、 「F が 高い ほど 必ず 弱い」 と は 扱わ ず、 線形 では ない 形 で モデル に 寄与 する もの と 見て います。 弊社 で は COI を そのまま 特徴量 に 入れた だけ で、 細かい クロス (= 3 × 4 とか 4 × 5 の 系統 重ね) は 別 特徴 に 分けて いません。 ここ は 改善 余地 が ある エリア。

3.5 SII × BSII Nicks (= 種牡馬 × 母 父 相性、 弊社 採用)

TrueNicks 的 な 発想 を 参考 に、 公開 データ から 独自 の 簡易 Nicks 指標 を 構築。 商用 TrueNicks そのもの では なく、 Sire Index / Broodmare Sire Index / 組合せ 勝率 を 使った 独自 実装 です。

SII (Sire Index)        = sire の 平均 産駒 勝率 を normalize
BSII (Broodmare Sire Index) = bms の 平均 産駒 勝率 を normalize
Nicks 風 Score (sire, bms)  = SII × BSII × ( 組合せ 産駒 の win_rate / 期待 win_rate )

「Sunday Silence 系 種牡馬 × Northern Dancer 系 母 父」 みたい な 組合せ で、 期待 を 超える 勝率 が 出る ペア に 高い スコア が つく。 弊社 の nicks_score.parquet は 3.39 M 行 で、 LightGBM に 1 列 で 渡して います。

3.6 Kelly Criterion (= 賭金 配分、 弊社 検討中)

ざっくり: 「期待値 が プラス の とき、 資金 の 何 % を 賭ける と 長期 成長 率 が 最大 化 する か」 の 公式。 ただし 真 の 勝率 を 過大 推定 する と 即 破産 する ので、 実務 で は Half-Kelly (= 半分 だけ 賭ける) や Quarter-Kelly が 一般 的。

John Kelly (1956, Bell Labs) が 通信 理論 の 文脈 で 出した、 「資金 の 何% を 賭ける と 長期 成長 率 が 最大 化 する か」 の 公式。

f* = ( bp - q ) / b
  • f* = 資金 の 賭ける 割合
  • b = オッズ - 1 (= 純 利益 倍率)
  • p = 真 の 勝率
  • q = 1 - p

「期待値 が プラス の 馬 に だけ、 Kelly 比 で 賭ける」 と いう のが Benter の 結論 でも あり、 数値 投資 の 古典 でも あり ます。 ただ 競馬 の 場合 p (= 真 の 勝率) が 推定 値 で あって、 過大 推定 する と 即 破産 する。 そこで 実務 で は Half-Kelly (= 0.5 × f*) や Quarter-Kelly が 一般的。 弊社 は 5/23 時点 で は まだ 固定 1 点 100 円 の フラット ベット で、 Kelly は 戦略 確定 後 (= 6 月 以降) の 課題 と して 残し て あります。

3.7 LambdaRank (= 弊社 採用 候補、 未実装)

Burges (2007) Microsoft Research の ランキング 学習。 順序 関係 を 直接 学習 する 損失。 LightGBM では objective="lambdarank" で 利用 可能 で、 race ID を group_key に 渡すと 「race 内 で 1 着 馬 を 上位 に 並べる」 こと を 直接 最適化 する。

弊社 は 現状 二値 分類 + softmax 正規化 で やって いる が、 LambdaRank は race 内 で 正解 馬 を 上位 に 置く ランキング 損失 を 直接 最適化 できる ため、 二値 分類 より 競馬 の 構造 に 合いやすい。 ただし LambdaRank と Plackett-Luce 最尤 は 同じ で は ない ので、 NLL / calibration / ROI で 別途 比較 する 必要 が ある。 これ は 6 月 中 の TODO。

3.8 Isotonic Regression (= 弊社 採用、 較正)

ざっくり: 「LightGBM が 出した 30% は、 実際 の 統計 で 当たる 確率 30% と は 限ら ない」 ので、 過去 データ で 「モデル 出力 何 % → 実際 何 %」 の 対応 表 を 作って 補正 する 処理。 「単調 増加 だけ は 守る」 制約 を 入れて 過 学習 を 抑える。

LightGBM の 出力 を 「実際 の 勝率」 に 較正 する 後 処理。 Platt scaling (= sigmoid 較正) と Isotonic regression が 主流 で、 Isotonic は 単調 増加 制約 だけ 課して データ 駆動 で 細かい 補正 を 行う。

from sklearn.isotonic import IsotonicRegression
iso = IsotonicRegression(out_of_bounds="clip")
iso.fit(p_model_raw, y_true)
p_calibrated = iso.transform(p_model_raw)

これ を Benter blending の 前 に 通す と、 P_model(i) と 1 / odds_i の スケール が 揃って α / β の MLE 推定 が 安定 します。 弊社 は 024/models/isotonic_calibrator.pkl に 保存 済。


第4章 弊社 開発 フェーズ 史 (= 1 ヶ月 の 旅 を 1 章 に 圧縮) 📜

過去 の HANDOFF を 漁って、 弊社 が 通った 道 を 整理 します。 これ から 競馬 ML を 始める 人 が 「同じ 罠 を 踏ま ない」 為 の 地図 と して 置いて おきます。

Phase 0: 生 データ 抽出 (= 2026-04 中旬)

  • 契約 範囲 内 の ローカル 分析 で、 サービス 提供 元 (= TFJV / TARGET frontier JV) の ローカル DB 5.58 GB から 1954 - 2025 の 17.3 M レコード 規模 を Parquet 化
  • 17 種類 の record (SE / RA / UM / HR / HN / SK ...) を 全部 抽出 (= 個別 馬 / 個別 race / 個別 予測値 は 本 記事 で は 公開 し ない)
  • 罠: 仕様書 が ない 独自 binary。 offset を 1 列 ずらして 数日 ハマる。 前回 記事 で 触れた 「toroku が 全部 77」 事件 が ここ
  • ⚠️ データ 本体 ・ 抽出 物 ・ 再 構築 可能 な 変換 手順 は 本 記事 で は 扱い ません。 利用 可否 は 各自 の 契約 と 利用 規約 に 従って 確認 が 必要 です

Phase 1: LightGBM ベース ライン (= 2026-04 下旬 - 05 中旬)

  • 25 特徴量 × LightGBM 二値 分類 で 学習
  • 最初 は ROI 800% とか 出て ぬか喜び。 全部 データ リーク
  • リーク 源 を 順に 潰す:
    • SE.tansyo_odds → 5/19 に LEAK 確定 (= 5 着 まで しか 値 が 入って いない、 1 着 馬 だけ 系統 的 高 値)
    • chaku_num (= 着順 数値 版) → 988% の ROI を 出して 発覚、 feature_pool.LEAK セット に 追加
  • リーク 除去 後 の 3 年 walk-forward 推定 で 構造 ROI 77 - 81% (= 控除率 20% に 単 体 で は 勝て ない)
  • ★ 教訓: 「hold-out ROI が 200% を 超え たら、 まず リーク を 疑う」 を 直感 と して 持つ (= 少なくとも 弊社 環境 で は、 200% 級 の 数字 は リーク 監査 の 赤 信号 でした)

Phase 2: 集計 型 血統 (= 2026-05-17、 1 日 で 一気 に)

  • 弊社 内部 の 血統 設計 メモ に 沿って Day 1 - Day 6 を 1 日 で 完走
  • Sire / BMS / PGS / MDS の 年別 集計 を Bayesian smoothing (α=5, β=15) で 平滑 化
  • 距離 適性 / コース 適性 / 系統 (Keito) / Nicks / Wright COI 3 代
  • 新 champion = v20260517_full_ped_lgbm_no_odds_ped_phase1 (= ROI 132.5% → 141.5%、 +15.9 pt)
  • TabNet で Entity Embedding を 試す も 集計 版 より 弱かった ので 採用 見送り

教訓: 「最新 手法 が 必ずしも 強い と は 限らない」。 Benter が 30 年 前 に 「集計 + 平滑化 は 強い」 と 書いて いた 通り。

Phase 3: 5/19 大 リーク 検出 (= 半日 損失、 だが 結果 的 に 真値 確定)

  • 全 ROI 評価 を HR.parquet.TanPay_1 ベース に 切替 (= 「単勝 配当」 を 直接 払戻 として 使う)
  • chaku_num leak を feature_pool.LEAK に 入れて 988% leak を 完全 消滅
  • 3 年 walk-forward 推定 で 構造 ROI は 80% 程度 と 確認
  • 「今回 の 特徴量 ・ 評価 設計 で は、 モデル 単体 で 控除率 を 安定 に 超える の は 難しい」 と いう 現実 を 受け 入れ
  • → ここから が 「Value Betting + 市場 オッズ blending + 馬券 種 戦略」 の 旅 が 始まる

Phase 4: LE 込み 254 特徴量 (= 2026-05-20)

  • Label Encoding で カテゴリ 変数 を 全部 数値 化 した 254 特徴量 版
  • 三連単 N=1 hold-out ROI 134.4%、 単勝 hold-out ROI 約 140%
  • ただし これ が 真値 か overfit か は backtest 単体 で 判定 不能 (= odds を 使って いない eval pipeline)
  • → Phase 5-6 で odds を 入れる

Phase 5: Plackett-Luce 三連単 + overfit 確定 (= 2026-05-20)

  • LightGBM の 1 着 確率 を softmax 正規化 して π_i に
  • 18 頭 race で 4896 通り の 三連単 確率 を 全部 計算
  • 上位 N=1/10/20/50/70/100 を 評価 grid と する
  • ⚠️ N=1 LE +56pt は 真 odds 6 年 backtest で 年別 に 大きく 崩れる (= avg 136% / spread 203pt / 2022 69%・2023 78%・2025 272%) → 単独 採用 に 耐えない overfit 候補 と して 不採用
  • 三連単 (1,0) N=10 ev ≥ 1.5 は avg 105% / spread 34pt で 留保 候補
  • N=30 grid も 後続 で 評価 (= 完了 後 に レンジ 更新)

Phase 6: Benter 較正 + 真 odds backtest + 戦略 確定 (= 2026-05-20 同日)

  • 過去 6 年分 の 真 odds を 揃えて 戦略 評価 (= 全 7 馬券種 × EV 閾値 × N 通り × α/β grid、 計 882 戦略)
  • 単勝 EV ≥ 1.5 N=1 戦略 の 真 6 年 ROI = 200.3% (= ただし 2021 は 50%、 spread 300 pt)
  • Benter MLE 部分 学習: α = 0.3143, β = 0.7945 (= n = 483 race)
  • 馬券 種 別 100% 超 戦略 数: 単勝 43 / 三連単 17 / 複勝 0 / 馬連 0 / ワイド 0 / 馬単 0 / 三連複 0
  • 結論: 単勝 を 主力 と し、 中間 5 馬券 種 は 完全 不採用
  • cross-bet ranking (= 馬券 種 横断 EV 上位 N) も backtest で 100%+ 戦略 ゼロ、 採用 見送り

Phase 7: Benter MLE 全期間 再 学習 (= 2026-05-21 05:54)

  • 5/20 部分 学習 (= n=483) → 5/21 全期間 (= n=20,626) で 再 MLE
  • α = 0.3143 → 0.2825, β = 0.7945 → 0.8597 (= ΔLL = +0.1569)
  • 旧 値 は 024/models/benter_alpha_beta_history/20260521-055448.json に backup
  • → 旧 主力 (S6 = EV≥1.5 N=1) の re-validation を 続いて 実施

Phase 8: 新 MLE re-validation で S6 (旧 主力) サンプル 崩壊 確定 (= 2026-05-21 06:14)

eval_tansyo_10yr.py で 6 年 walk-forward を 新 MLE 値 で 再 backtest:

戦略 旧 MLE (5/20) 新 MLE (5/21) 判定
EV≥1.5 N=1 (= 旧 S6) avg 200.3% / n=186/年 avg 307% / n=25/年 / spread 969 pt サンプル 崩壊 = 採用 不可
EV≥1.2 N=5 (未 検証) avg 187.6% / n=353/年 / spread 195 pt 新 主力 候補
(1,1) EV≥2.5 N=5 (未 検証) avg 184.5% / n=47/年 / spread 208 pt サンプル 微妙

新 MLE で α が モデル 方向 に 下がった (= 0.3143 → 0.2825) こと で、 EV ≥ 1.5 を 通る race が 1/8 に 減って しまい、 旧 主力 S6 の 統計 力 が 崩壊。 「α を 動かす と EV 分布 が 大きく ずれる」 と いう 当然 の こと を、 現場 で 体感 する 結果 と なりました。

5/23 forward 観測 では 旧 S6 を deprecated し、 S6_v2 (= EV ≥ 1.2 N=5) を 主力 候補 と して 観察

Phase 9 (= 確定 戦略 + 年別 resampling 参考 レンジ): S6_v2 主力 候補 化

6 年 年別 ROI を 10,000 回 resample し、 年別 resampling 参考 レンジ (= 厳密 な 信頼 区間 で は ない、 stability interval 相当) を 算出。 サンプル n=6 (= 年) は 弱い が、 spread を 数値 化 する 簡易 指標 と して 採用:

ラベル 戦略 mean ROI 参考 レンジ spread n/年 役割
S6_v2 (= 新 主力 候補) 単勝 MLE EV ≥ 1.2 N=5 187.6% [130%, 249%] 195 pt 353 resampling 参考 レンジ 下側 2.5% 点 が 130%
B (= 安定 代替) 単勝 (1,1) EV ≥ 2.0 N=10 157.2% [132%, 177%] 89 pt 212 レンジ 幅 最小、 暴れ 抑制
C (= 最 安定) 単勝 MLE EV ≥ 1.1 N=10 111.3% (TBD) 44 pt 1988 「死なない」 戦略
S6 旧 単勝 MLE EV ≥ 1.5 N=1 307% [77%, 620%] 969 pt 25 deprecated (= n=25 崩壊、 レンジ 下限 77% で 真値 100% 下回り 可能性 排除 できず)

⚠️ ここ で の [130%, 249%] 等 は、 利益 を 統計 的 に 保証 する 信頼 区間 では なく、 選定 後 データ に 対する 年別 resampling の 参考 レンジ (= stability interval) です。 サンプル は n=6 (= 年) と 弱く、 また 882 戦略 grid から 「最高」 を 拾った 後 の 多重 比較 ・ 選定 バイアス ・ odds timing leak を 含み ます。 「forward 検証 に 進める 候補 と して 相対 的 に 有望」 と いう 位置 づけ に 留めます。 未知 の 期間 ・ 異 なる オッズ 取得 タイミング ・ 市場 変化 に 対する 下限 を 意味 する もの で は あり ません。

forward は S6_v2 を base line と して forward 観測 で 走らせ、 1 ヶ月 観測 で 50 - 80% 級 の 暴れ 年 を 引いたら 安定 代替 B (= レンジ 下限 132%) に 切替、 と いう 設計 です。

📊 resampling レンジ 下限 が 100% を 切る 戦略 は forward で 避ける が 弊社 の 内部 ルール。 旧 S6 が 「mean 307% 出 て いる の に 採用 不可」 と なった のは、 レンジ 下限 77% で 「真値 が 100% を 下回って いる 可能 性 が この resampling 設計 で 排除 でき ない」 から。 この 判断 基準 は forward 開始 後 も 「mean だけ 見て 戦略 拡張 しない」 と いう ガード と して 機能 する はず。

Phase 10: 1988-2025 (= 約 38 年) 長期 backtest で 戦略 ロバスト 性 を 補強 (= 2026-05-21 07:12)

弊社 の 1988-2025 (= 約 38 年) 長期 backtest は 8.4 分 で 完了 しました。 40 cores (= Spark2 20 cores × 2) 並列 + 中量 cache 軽量化 で、 「半日 コース」 と 諦め かけて いた 検証 が 当日 中 に 実現 した、 と いう のが 一番 嬉しい 報告 です。 (※ 内部 で は 「40 年」 と 呼んで いる が、 実 期間 は 1988-2025 で 38 年 分)

cache 拡張 の 工夫 (= 軽量 → 中量)

完全 v9 cache (= 1614 列、 LE 込み 254 feat) を 1986 まで 拡張 する のは pipeline 6 段階 で 半日 コース。 そこで 弊社 は 段階的 cache 拡張 を 採用 しました:

軽量 cache (= SE + walk_forward_aggs)        ← 130 列、 build 15 秒
↓ +UM (= 馬データ 78 列、 血統 系 含む)
中量 cache (= SE + wfa + UM)                  ← 208 列、 build 27 秒
↓ +KS (= 騎手 28 列) +CH (= 調教師 52 列)
重量 cache (= 288 列、 完全 v9 254 feat に 近づく)  ← 将来 拡張

軽量 cache で 38 年 backtest は 全戦略 ~78% (= 控除率 と 一致)。 学習 力 が 完全 に 控除率 に 飲まれて edge を 出せ ない。 これ 自体 「LightGBM が 過学習 して 高 ROI を 出した のでは ない、 真値 は 控除率」 と いう null hypothesis を 確認 した 価値 ある 結果

中量 cache (= UM 血統 系 78 列 追加) で 同じ 38 年 backtest を 回す と:

戦略 6 年 (cache_master_v9 254 feat) 38 年 (中量 cache 208 列) gap 100%+率 評価 上 の 注意
S6_v2 = MLE EV ≥ 1.2 N=5 187.6% 178.1% -9.5pt 79% (= 38 年 中 30 年) 戦略 探索 後 の 再 評価 / 特徴量 不一致 / 確定 オッズ
S10_v2 = MLE EV ≥ 1.5 N=5 250.9% 288.9% +38.0pt 66% 同上
S8_v2 = (1,1) EV ≥ 2.5 N=5 184.5% 279.9% +95.4pt 87% 同上
S7_v2 = (1,1) EV ≥ 3.0 N=5 201.5% 377.3% +175.8pt 71% 同上 + n=52/年 と 薄い
S9_v2 = (1,1) EV ≥ 2.0 N=10 157.2% 218.6% +61.4pt 84% 同上

⚠️ 表 の 「評価 上 の 注意」 列 は、 全 戦略 共通 で (1) 戦略 探索 後 に 同じ データ 系列 で 再 評価 して いる、 (2) 6 年 側 と 38 年 側 で 特徴量 セット が 完全 に は 一致 し ない (254 列 vs 208 列)、 (3) 確定 オッズ で backtest して おり 実 投票 時点 の odds drift は 反映 して いない の 3 点 を 指して います。

主力 候補 S6_v2 が 6 年 と 38 年 で gap -9.5 pt。 「直近 6 年 だけ の 偶然」 と いう 説明 は 弱まり、 forward 検証 に 進める 根拠 が 強く なりました。

⚠️ 重要 な 限界: 6 年 側 は cache_master_v9 (= 254 feat) を 使い、 38 年 側 は 中量 cache (= 208 列) で 完全 に 同じ 特徴量 セット で の 比較 で は ありません。 また、 戦略 探索 後 の 再 評価 で あり 「完全 未使用 期間」 で も ない。 「gap -9.5pt = ロバスト 確定」 と 断定 する より、 「直近 6 年 だけ の 偶然 で は ない 可能 性 が 補強 され た」 くらい が 正確 です。 forward は 引き 続き 別 系列 の 検証 と 位置 づけ。

5/23 から の 並列 forward 候補 (= 5 戦略)

38 年 + 6 年 の 二重 検証 を 通過 した 戦略 を 並列 で 走らせ、 1 ヶ月 後 (= 6 月 下旬) に 戦略 別 forward ROI を 比較 する 設計 です:

ラベル 較正 EV N 38 年 avg 6 年 avg 100%+率 役割
S6_v2 (= 主力 候補) MLE 1.2 5 178% 188% 79% ★ 1 ヶ月 観測 base line
S7_v2 (= 最高 mean) (1,1) 3.0 5 377% 201% 71% n=52/年 と 薄い、 暴れ 注意
S8_v2 (= 100%+率 最高) (1,1) 2.5 5 280% 184% 87% n=89/年
S9_v2 (= 安定) (1,1) 2.0 10 219% 157% 84% n=213/年
S10_v2 (= 高 ROI 安定) MLE 1.5 5 289% 251% 66% n=132/年

⚠️ S7_v2 の avg 377% は n=52/年 = サンプル 薄 で あり、 「mean だけ で 判断 しない」 ガード 対象。 主力 観測 base は あくまで S6_v2、 S7-S10 は 並列 観察 用。

なぜ MLE と (1,1) を 並列 で 走らせる の か (= 較正 path の 二刀流)

5 戦略 の 較正 は 「MLE Benter (= S6_v2 / S10_v2)」 と 「α=β=1.0 baseline (= S7_v2 / S8_v2 / S9_v2)」 の 2 系統 に 分かれて います。 これ は backtest で 観察 された 次 の 性質 を 拾い に 行く 設計 です。

  • MLE Benter (= α=0.2825, β=0.8597) = モデル を やや 弱める 較正 → 「市場 オッズ 重視」 → 高 EV (= 1.5+) を 通る race 数 は 少 (= n=132/年)、 だが 集中 した picks で 平均 ROI 高
  • α=β=1 baseline = モデル と 市場 を 等価 に 扱う → 「モデル 単独 確率」 が 効く → EV ≥ 2.0+ で n=213/年 と 多 サンプル + 高 ROI

これ は 「モデル が odds に 反映 されて いない edge を 持って いる」 こと の 別 角度 から の 観察 で、 較正 を 1 つ に 固定 する と どちら か を 取り 逃がす。 forward で どちら の 較正 が 真値 に 近い か を 1 ヶ月 で 戦略 別 比較 する の が、 並列 並走 の メリット です。

⚠️ ただし、 これ も 戦略 探索 後 の 観察 で あり、 「(1,1) が 構造 的 に 強い」 と 一般 化 する もの で は ない。 「今回 の 弊社 モデル の 較正 不足 を、 (1,1) baseline が 偶然 拾った」 可能 性 を 否定 でき ない。 forward 観測 の 主目的 の 一つ は、 ここ の 切り 分け でも あります。

撤退 ・ 切替 ルール (= 1 ヶ月 観測 = 6 月 下旬 判定)

forward 観測 中 に 「mean だけ 見て 続行」 や 「単月 -30% で 慌て て 全 撤退」 を 避ける ため、 事前 に 紙 に 書いて あり ます。

forward ROI (1 ヶ月) 判定 アクション
≥ 100% 維持 採用 継続 投資 額 拡大 検討 (= 6 月 から、 Kelly 検討)
50 - 100% 採用 継続 参考 レンジ + 年別 分布 観察 + 結果 編 で 追加 評価
< 50% (= 2021 級 暴れ 年) 即 全 戦略 撤退 安定 代替 単独 (= S6_v2 のみ) に 切替、 S7-S10 停止

これ、 投資 系 ML を 本番 デプロイ する とき に 「事前 に 撤退 基準 を 紙 に 書く」 と いう のは 業務 系 と 全く 同じ。 後 で 「想定 外 で 撤退 した」 と 言わ ない 為 の、 自尊心 救済 装置 でも あります。

「軽量 vs 中量 cache」 の 教訓

軽量 cache (130 列) で 全戦略 78% 控除率 一致 → 中量 cache (208 列、 + UM 血統 系) で 100%+ 多数 と いう 結果 は、 競馬 ML に おいて 特徴量 設計 が ROI に 直結 する こと の 教科書 的 な 例 で した。 LightGBM の 学習 力 自体 で は なく、 入力 feature の 質 と 量 が 「edge を 出せる か 否か」 を 決定 して います。

これ は Bolton & Chapman (1986) の 「ハンディキャップ 系 特徴量 設計 が 重要」 と いう 結論 と 方向 性 が 一致 して おり、 競馬 ML で は 馬 ・ 騎手 ・ 調教師 ・ 血統 ・ 過去 成績 など の 集計 特徴量 が 効く、 と いう 古典 的 観察 を 弊社 でも 再確認 した、 と いう のが 業界 の 「先人 に 学べ」 教訓 の 典型 例 です。

詳細 結果 は 弊社 内部 レポート (REPORTS/compare_6yr_vs_38yr_*.md) に 全 76 ロバスト 戦略 を 並べて ありますが、 個別 戦略 / 個別 race / 個別 馬 に 紐づく 数値 は 本 記事 では 公開 しません。


第5章 「自分 が 選ば なかった 道」 と 「選ば な かった 理由」 🛤

これ、 競馬 ML を 始める 人 が 一番 知り たい 部分 だ と 思う ので 包み 隠さず 書きます。 「選ば なかった 理由 を 残す と、 半年 後 に 「あれ 試して 無いの?」 と 自問 した とき に 「試して 採用 し なかった」 と 即答 できる」 と いう 利点 が ある。

手法 選ばなかった or 採用 見送り 理由
Neural Network 単独 採用 見送り LightGBM より 弱い + 解釈 性 低い (= Benter 1994 と 同じ 結論)
TabNet Entity Embedding 採用 見送り sire_no 7,000 + クラス で 過学習。 prior 集計 版 が 強い
Bradley-Terry 学習 未実装 1 着 確率 推定 で 十分。 馬連 戦略 を 本気 で やる 時 に 再検討
Henery / Stern モデル 未実装 Plackett-Luce で 充分 強い + 計算 が 楽 (= IIA 仮定 の 妥当性 は forward で 観測)
三連単 N=1 単独 不採用 LE +56pt が 真 odds 6 年 backtest で overfit 確定 (= spread 203pt、 2022 69%)
中間 5 馬券 種 (複勝/馬連/ワイド/馬単/三連複) 現時点 で は 採用 しない 今回 の 特徴量 ・ 期間 ・ grid (= 882 戦略 / 6 年) で 100%+ 戦略 が 1 件 も 出 なかった。 控除率 22.5-27.5% の 壁 が 厚く、 再 検証 まで 保留
cross-bet ranking (= 馬券種 横断 EV) 採用 見送り 今回 の backtest で 100%+ 戦略 0 件、 単純 単勝 単独 戦略 の 方 が 上
Kelly (Full) 採用 見送り 真 p の 過大 推定 で 損失 急拡大 リスク。 当面 フラット ベット、 慣れたら Half-Kelly
CatBoost 試行 中 LightGBM と 比較 中、 差 が 出れば 切替
DeepFM / DCN 検討 留保 競馬 で 効く 実装 例 が 業界 で まだ 確立 して いない
追加 課金 データ / 外部 有料 指数 現時点 で は 採用 しない TARGET / TFJV 由来 の 手元 DB を 基盤 と し、 それ 以外 の JRDB ・ 有料 予想 指数 ・ 商用 特徴量 は 使わない (= TFJV ローカル DB 自体 は DataLab 会員 範囲 で の 個人 利用)
外部 タイム 指数 系 スタブ 会員 プレミアム 領域 / 利用 規約 上 慎重 を 要し、 手間 に 見合わない と 判断

選ば な かった 道」 を 並べ た こと が、 「選んだ 道 が 弱かった とき に 戻れる 道」 で も ある。 ML 開発 の 副 産物 と して これ は そこそこ 価値 が ある と 思って ます。


第6章 結局 「競馬 ML」 は 何 を やる 仕事 な の か 🧩

過去 1 ヶ月 で 自分 が 体感 した 「競馬 ML と は こう いう 仕事 で ある」 の 整理 を 1 枚 に 書き出します。 これ から 始める 人 の 期待 値 調整 の 参考 に。

  • 「モデル 学習」 そのもの は 10%。 LightGBM を fit する だけ なら 1 行。
  • 「特徴量 設計」 が 40%。 ここ で 血統 / Bayesian smoothing / 集計 窓 / リーク 監査 に 時間 を 溶か す。
  • 「データ 基盤」 が 30%。 binary 仕様書 が ない、 名前 表記 揺れ が ある、 race_id 形式 が 経路 で 違う、 等 の 泥 作業
  • 「戦略 設計」 が 10%。 EV 閾値、 N 数、 馬券 種 配分、 撤退 ルール。
  • 「実戦 + 監視」 は 一生 続く。 backtest と forward の ギャップ は 必ず ある。

ここ、 業務 系 ML を 実 デプロイ して 監視 する とき と 完全 に 同じ 配分 で す。 自分 が 弊社 で やって いる JWW 図面 AI と 比べて も、 工程 配分 は ほぼ 同じ。 競馬 が 業務 系 ML の 練習 台 に なる 理由 が ここ。


第7章 「日本語 文献 が 薄い」 問題 と オープン 化 📚

最後 に、 1 ヶ月 通じて 強く 感じた こと を 書きます。

競馬 ML、 日本語 文献 が 異常 に 薄い

理由 は 想像 つきます。

  • 商用 で 成功 した 人 (= 大阪 / 札幌 馬券 裁判 の 当人 や、 機関 投資 家 系) は 手 の 内 を 公開 し ない。 それ は 競争 優位 の 直接 損失
  • 個人 で やって いる 人 は note 有料 記事 や Discord で 細々 と やって いて、 検索 可能 な 場所 に 論文 - 実装 を 紐 付け た 解説 が 殆ど 無い
  • 海外 (= 北米 / 香港 / 豪) は 学術 系 が 強く て、 上記 の 1973 Harville から 連綿 と JASA / Management Science / Royal Society に 論文 が 残って いる が、 日本語 で 紹介 する 動機 が 誰 に も 無い

結果 と して、 「日本 競馬 で やる 競馬 ML」 を 始めた 人 は、 日本語 で 検索 し ても 「血統 重視 AI で 回収率 2,870 %」 と か 「単勝 万馬 券 攻略 法」 と か 半分 オカルト 半分 商売 の 記事 ばかり が 出てきて、 学術 系 を 読みに 行く と 一気に 海外 論文 の 山 に 投げ込まれ ます。 これ、 入り口 として かなり 急 な 階段 です。

弊社 が この シリーズ を 出して いる 動機 の 一つ が ここ で、 「日本語 で、 学術 系 と 実装 を 紐付ける 入り口」 が 1 個 でも あれば 後続 が 入って くる、 と いう 期待 です。 競馬 ML に 限らず、 マイナー 領域 の 日本語 文献 の 薄さ は 業務 系 で も よく 出会う 課題 で、 弊社 の 建築 × AI シリーズ 本編 も 「JWW 自動 生成 を 日本語 で 紐解いた 例 が 無い」 か ら 書き 始めて います。

📌 本 記事 末尾 の 「参考 文献」 に、 弊社 が 1 ヶ月 で 読んだ 論文 リスト を 全部 並べ ました。 リンク は 全部 一次 ソース。 これ から 始める 人 は ここ から 入ると 急 階段 が ちょっと だけ 緩く なる はず。


第8章 forward 観測 開始 予定 と 結果 編 予告 ⏰

⚠️ forward 観測 の 主目的 は 「検証 ログ の 取得」 で あって、 自動 購入 ・ 営利 運用 で は ありません。 backtest と forward の 差分 を 数値 化 し、 odds drift / 戦略 選定 バイアス / サンプル 不足 を 後 から 検証 する ため の 記録 取り です。 購入 判断 ・ 投票 連携 手順 ・ 自動 化 の 実装 詳細 は 本 記事 で は 扱い ません。

本 記事 は 投稿 時点 で 一部 検証 / 起動 確認 が 進行中・予定 の 状態 を 含む 中間 報告 です。 backtest 系 タスク (= Benter MLE 再 学習 / 三連単 N=30 / S6_v2 年別 resampling レンジ / 1988-2025 長期 / S7-S10 設計) は 完了 済。 候補 抽出 系 (= MLE と (1,1) の 両 較正 path、 5 戦略 並列 出力、 検証 上限 額 固定、 smoke test 拡張) は 整備 中。 続いて 全 コード bug hunt + 始動 テスト 5 件 + GO / NO-GO 最終 判定 を 経て、 forward 観測 を 開始 する 設計 です。 NO-GO 判定 の 場合 は 起動 を 止めて 延期、 と いう 設計 を 事前 に 紙 に 書いて あり、 結果 編 で その 旨 を 報告 します。

📝 状況 注記 (= 投稿 時点 で 進行中 / 予定 の 項目 を 含み ます): モデル 側 (= MLE 再 学習、 三連単 N=30 backtest、 S6_v2 年別 resampling レンジ、 1988-2025 長期 backtest、 並列 戦略 設計) は backtest 完了 済。 続く 検証 段階 と して、 候補 抽出 ロジック (= MLE / (1,1) の 両 較正 path、 5 戦略 候補 出力、 検証 上限 額 の 固定、 smoke test 拡張) を 整え、 その後 「全 コード bug hunt + 始動 テスト + 観測 開始 の GO / NO-GO 判定」 と いう 流れ で 進め ます。 NO-GO 判定 が 出た 場合 は 観測 開始 を 延期 し、 結果 編 で その 旨 と 原因 を 報告 します。

検証 進捗 (= ✅ 完了 / 🛠 整備 中 / ⏳ 予定)

STEP 内容 状態
三連単 N=30 backtest 結果 確認 (= N grid 完全版) 完了
単勝 10 年 backtest + 6 年 比較 完了
全期間 MLE 値 で 戦略 re-validation 完了 → 旧 S6 deprecated、 S6_v2 主力 候補
S6_v2 年別 resampling 参考 レンジ [130%, 249%] 完了
1988-2025 (= 38 年) 長期 backtest 完了、 S6_v2 178% / 100%+率 79%
並列 戦略 S7-S10 設計 完了
🛠 MLE / (1,1) 両 較正 path の 候補 抽出 ロジック 整備 中
🛠 5 戦略 並列 候補 出力 + 検証 上限 額 固定 整備 中
🛠 smoke test Part 1 (retention) / Part 2 (S7-S10) / Part 3 (MLE π ≠ (1,1) π) 整備 中
全 コード bug hunt (= 3 環境) 予定
始動 テスト 1-5 (= smoke / 抽象 設定 / 過去 race dry-run / 定時 経路 / 3 環境 同期) 予定
GO / NO-GO 最終 判定 予定
forward 観測 開始 (= GO 判定 時 のみ) 5/23
5/23 + 5/24 forward 観測 5/23-24
5/25 22:00 結果編 公開 5/25

5/25 月 22:00 の 「実戦 結果 編」 で 出す もの:

  • 5/23 (土) と 5/24 (日) の 的中 率 ・ 回収 率 の 生 数字 (= 隠さず)
  • モデル 出力 シグナル の 全 一覧 と 結果 (= 紙 で 並べる)
  • Plackett-Luce 上位 N 通り の 命中 率 分布
  • Benter blending の 効果 (= α / β を 動かして 仮想 ROI を 並べる)
  • 購入 時 オッズ vs 確定 オッズ の 散布図 (= odds drift 検証)
  • median ROI / trimmed mean ROI / 2025 除外 ROI / 最大 連敗 数 / 最大 DD / 1 日 あたり 損益 分布 / EV bucket 別 実績
  • backtest と forward の ギャップ を 1 つ ずつ 見る
  • 「2021 級 の 暴れ 年 が forward で どこ で 顔 を 出 す か」 の 観察
  • (おまけ) 全 211,000 頭 血統 補完 の 進捗
  • (おまけ) 「税金 を 半日 調べた 件」 の 後日 談 ← 万 が 一 黒字 が 出 て しまった 場合 のみ

📊 分散 込み 評価 の 予告: 三連単 系 の ROI は bets 数 が 少ない と 一発 の 高 配当 で 一気 に 動く ため、 結果 編 で は ROI 単体 で は なく、 (a) bets 数 ・ 的中 数 ・ 総 購入 額、 (b) 年別 ROI (= 2021 だけ 突出 して ない か)、 (c) 最大 ドローダウン、 (d) 年別 resampling 参考 レンジ、 (e) calibration curve、 (f) Brier score / log loss、 を 併記 します。 「ROI だけ 出して くる ML 系 記事」 に なら ない よう、 ここ は ちゃんと やります。

⚠️ backtest 自体 の 統計 的 リスク 4 点 (= 後続 で 検証 予定):

  1. 多重 比較 + 戦略 選定 バイアス: 882 戦略 の grid から 「最高 ROI」 を 拾った → 同じ 期間 で 「S6 が 200.3%」 と 言う と 戦略 選定 バイアス を 含む。 Bonferroni / FDR 補正 だけ で なく、 最終 的 に は train (モデル 学習) / calibration (α/β・isotonic) / validation (EV 閾値・N・馬券 種 選定) / final test (完全 未使用 期間) を 時系列 で 分離 した nested walk-forward で 再 評価 する 必要 が ある
  2. サンプル サイズ 不足: 単勝 EV ≥ 1.5 N=1 は 6 年 で 1,116 race / 当たり 265 件 → σ ≈ 40-50 pt は 不可避
  3. 2025 単年 上振れ: avg 200% は 2025 単年 350% に 引き上げ られ、 2020-2024 中央 値 は 170% 付近
  4. odds timing leak リスク: backtest は 確定 オッズ (= 締切後 確定 値) で EV 判定 して いる が、 実 投票 時点 では オッズ は 未 確定。 発走 直前 の odds drift で EV ≥ 1.5 が 崩れる 可能性 が ある (= 下記 補足)

後続 検証 では、 新 MLE 値 で 戦略 ROI を 再評価 + resampling 参考 レンジ (= bet 単位 だけ で なく race-day / 開催日 単位 の block resampling も 併用) + 2025 除外 5 年 avg + 2025 除外 trimmed mean / median ROI で 数値 化 します。 forward 1 ヶ月 で は 100 - 170% に 収束 する シナリオ を 想定 し つつ、 サンプル 数 次第 では 100% 未満 も 十分 あり得る もの と して 扱います。

⚠️ odds timing leak と は (= 一行 で): 「backtest は ゴール 後 に 確定 した オッズ を 知って いる が、 実 投票 時 は まだ オッズ が 動いて いる」 と いう ズレ の こと。 backtest で 「EV = 1.5 だから 賭ける」 と 判定 して も、 実 締切 直前 で オッズ が 動いて EV が 1.0 に 落ちて いる、 と いう こと が 起こり 得ます。 特に EV 閾値 戦略 で は odds drift が ROI に 直撃 し ます。 forward で は 購入 時 / 締切 直前 / 確定 の 3 時点 を 記録 し、 結果 編 で (購入 時 EV) vs (確定 EV) の 散布図 を 出す 予定。

正直 怖い。 backtest と forward が 一致 する とは 思って ない の で、 ズレた とき に どこ が 原因 か を 1 つ ずつ 潰す ライブ レポート に なる はず。 楽しみ で あり 恐怖 でも あります。


第9章 おわりに (= 中間 報告) 🌳

前回 記事 公開 後 の 1 ヶ月 で、 自分 は 「機械 学習 で 競馬 を 予想 する」 と いう 個人 プロジェクト を 想像 の 10 倍 真面目 に やる 羽目 に なって います。 そして そ の 過程 で、

「自分 が 思いついた」 と 思った アイデア は、 大抵 1986 - 1994 年 の 論文 に 既出 だった

と いう 事実 を 何度 も 思い知らされ、 そ の 度 に 「先人 すごい」 と なって います。 これ、 自分 の 本業 (= 建築 × AI、 JWW 図面 自動 生成) でも 全く 同じ こと が 起きて いて、 「自分 が JWW で 思いついた 構造化 手法、 1970 年代 の AutoCAD 系 論文 に 既出 だった」 が 何度 か あった。 マイナー 領域 の 個人 開発 は、 「先人 を 見つける 速度」 が ほぼ 開発 速度 に なる、 と 最近 信じ つつ あります。

GO / NO-GO 判定 を 経て、 弊社 の 競馬 AI は 検証 用 の 最小額 で、 実 運用 に 近い 条件 の forward 観測 を 開始 する 設計 です。 backtest 値 が forward で どこ まで 持つ か、 持た ない か。 持た ない とき に どこ が ズレ の 原因 か を、 Phase 1 - 10 の 学び を 1 つ ずつ 潰し ながら 検証 します。 NO-GO で 延期 に なった 場合 は 結果 編 で その 旨 と 原因 を 出す 予定 です (= 「forward の 失敗 を 報告 する」 章 が 増える だけ、 と いう 整理)。

これ、 業務 系 ML を 本番 デプロイ する 全 ケース と 同じ で、 「backtest と 本番 の ギャップ を 1 つ ずつ 詰める」 こと が 結局 一番 学び が 多い。 競馬 は 結果 が 3 - 30 分 で 出る ので、 業務 系 で 1 ヶ月 かかる 学習 ループ が 1 日 で 回る。 やっぱり 練習台 と して は 異常 に 優秀。

5/25 月 22:00、 また 会い ましょう。 (おそらく 意気消沈 した 顔 で)


🔁 最後 に もう 一度:

  • 本 記事 は ML 検証 の 読み物 で あり、 馬券 購入 を 推奨 する もの で は あり ません。
  • 数値 は 全部 hold-out / バックテスト 等 の 検証 結果。 実 購入 が ある 場合 も 検証 用 の 最小額 です。
  • 20 歳 未満 の 方 は、 競馬 法 第 28 条 に より 勝馬 投票券 を 購入 ・ 譲り 受け する こと は できません
  • 投票 連携 ・ 自動 購入 ・ 外部 サービス 連携 の 実装 手順 は 本 記事 で は 扱い ません。 利用 する 場合 は、 JRA / IPAT 等 の 利用 条件、 通信 失敗、 締切 直前 の 混雑、 投票 成立 確認 を 含めて 自己 責任 で 管理 する 必要 が あり ます。
  • データ 利用、 馬券 購入、 税務 処理、 依存症 リスク へ の 対応 は、 各自 の 責任 で 確認 して ください。 馬券 は 余剰 資金 で 適度 に。

困ったら → 厚労省 依存症 対策


関連 記事

主要 参考 文献 (= 弊社 が 1 ヶ月 で 読んだ もの、 可能 な 限り 一次 ソース ・ 出版社 ページ ・ 公式 ドキュメント を 優先)

確率 モデル の 古典

  • Harville (1973) "Assigning Probabilities to the Outcomes of Multi-Entry Competitions" Journal of the American Statistical Association — 競馬 確率 モデル の 代表 的 な 初期 研究
  • Plackett (1975) "The Analysis of Permutations" Journal of the Royal Statistical Society Series C — Plackett-Luce 元 論文
  • Luce (1959) Individual Choice Behavior: A Theoretical Analysis (Wiley) — IIA 仮定 の 元
  • Bradley & Terry (1952) "Rank Analysis of Incomplete Block Designs" Biometrika — pairwise 比較
  • Henery (1981) "Permutation Probabilities as Models for Horse Races" Journal of the Royal Statistical Society B — 正規 分布 仮定 版
  • Stern (1990) "Models for Distributions on Permutations" Journal of the American Statistical Association — ガンマ 分布 仮定 版

競馬 ML の 古典

  • Bolton & Chapman (1986) "Searching for Positive Returns at the Track: A Multinomial Logit Model for Handicapping Horse Races" Management Science 32(8) — MNL の 競馬 応用 代表 研究
  • Benter (1994) "Computer Based Horse Race Handicapping and Wagering Systems: A Report" Efficiency of Racetrack Betting Markets (Hausch, Lo & Ziemba 編、 Academic Press / 1994; 2008 再録 World Scientific) — 競馬 ML の 古典 的 代表 作
  • Lo, Bacon-Shone & Busche (1995) "The Application of Ranking Probability Models to Racetrack Betting" Management Science 41(6) — 三連単 拡張
  • Edelman (2007) "Adapting Support Vector Machine Methods for Horse Race Odds Prediction" Annals of Operations Research

インブリード ・ 血統

ベット 配分

較正

機械学習 (= 弊社 が 採用 した 道具)

使用 ツール

  • Claude Opus 4.7 (1M context) — 論文 整理、 設計 レビュー、 実装 補助 に 使用
  • LightGBM / Optuna — 学習 ・ ハイパラ 最適化
  • Python (paramiko / pandas / pyarrow / scikit-learn) — 全 工程
  • scikit-learn IsotonicRegression — 確率 較正
  • TabNet (pytorch-tabnet) — Entity Embedding (= 試行 後 採用 見送り)
  • 競馬 の 払戻 金 と 所得 税 の 一般 整理: 国税庁 タックスアンサー No.1490 / 最高裁 判決 (平成27年3月10日 / 平成29年12月15日)
  • 私 の 睡眠 時間 — 1 ヶ月 で 平均 5 時間 (= 論文 と コード を 行き来 した 結果、 返却 不可)
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?