📝 この記事は Zenn で先に公開した記事の再掲です。最新版とコメントは Zenn をご参照ください。
TL;DR
- 個人開発の競馬予想ML(UmaScore)について「自前モデルのスコアは結局オッズを写しているだけで、見せかけのエッジを出しているのでは?」という疑いを ablation test で定量検証した。
- オッズ成分を抜いてもBTは崩壊しない(ABLATED & odds≤20 で BT 116.7%)→「循環参照で見せかけ」説は否定。
- しかしFTでは逆転し ABLATED & odds≤20 = 49.3%(的中6.0%)、WITH & odds≤20 = 64.5%(的中13.8%)→ 前向きに効いているのは市場コンセンサス(オッズ)側、自前ファンダ5因子は「オッズと独立した前向きエッジ」を示せていない。
- 加えて未使用シグナル(馬体重)をオッズ帯統制で見ても勝率は平坦。中央競馬市場は公開構造化情報をかなり効率的に価格化している。
- 効率的市場仮説(EMH)の競馬市場版を自前モデルで反証しようとして反証された記録。 negative result の公開だが、検証手順そのものは他ドメインで再利用可能な雛形になる。
1. はじめに:「あなたのモデル、オッズを写しているだけでは?」
前回記事 では、バックテスト(BT)回収率 118% がフォワードテスト(FT)で 40% 台に劣化した現象を、survivorship bias / look-ahead bias / regime shift / 市場効率性の4構造に分解しました。本記事はそのうち 市場効率性だけを1本に拡張し、 ablation test で自前モデルの中を切り分けるノートです。
問いはひとつ。「自前のスコアは、オッズを写したものを写し返しているだけではないのか?」 第1本(リーケージ)でデータ側の罠は塞いだ前提で、本記事は 前向きエッジが実証できなかったという negative result を、結論の出し方ごと記録に残すのが目的です。
書いている人:個人開発の競馬予想 ML を 2026-04 から FT 運用中。検証は BT 16ヶ月(2025-01〜2026-04)+FT 約2ヶ月の累計で、軸ABC統合判定(8月末-9月)まで結果判断は留保しています。
2. モデル設計の最小スケッチ
UmaScore の予測の中核は master_score(0-100点)で、6成分の単純合算を softmax(温度5.0)に通して勝率推定にしています。
# services/prediction_engine.py(概念図)
master_score = (
base_adjusted # 0-35 基礎能力(過去走タイム・着差・対戦比較 等)
+ bias_adjusted # 0-10 Track Bias 補正
+ training_score # 0-15 調教評価
+ aptitude_score # 0-15 コース・距離・馬場適性
+ human_factor # 0-10 騎手・厩舎・斤量
+ odds_implied # 0-15 市場オッズ由来成分(= 1/odds から算出)
)
probabilities = softmax(master_scores_in_race, temperature=5.0)
ev = probabilities * final_odds # EV ≥ 1.5 を選別
重要なのは2点。オッズは6成分中1つで、設計上の比率は15%。残り85点は独立計算の特徴量。そして softmax は同一レース内の相対比較なので、全頭一律に乗る定数項は確率に効きません。ベースラインの数値は BT 16ヶ月(2025-01〜2026-04)EV≥1.5 単勝で 回収率 115.4%(4,856点、reports/ft_diagnosis_20260603.md の read-only 再計算値。原典 backtest_report_20260414.md §1 は同戦略を 118.4%/4,684点 と公表しており、集計時点と n の差で約3pt 動くが結論は不変)。
3. 検証1:Ablation test ── odds_implied を抜くとどうなるか
3.1 設計
ablation の核は「特定成分を 抜いて同じパイプラインを通し、性能差を見る」だけです。
- WITH 版:設計通りの6成分すべて。
-
ABLATED 版:保存済み5成分(base / bias / training / aptitude / human)だけを合算し、
odds_impliedを 0 として再計算。
同一 assembly・同一最終オッズ・同一温度(5.0)で softmax を再計算 → EV = 勝率 × オッズ → EV≥1.5 を選別 → 実払戻で回収率を集計します。スクリプトは scripts/bt_ablation_odds_implied.py と scripts/ft_ablation_odds_implied.py の2本、 いずれも read-onlyで本番モデルの変更はありません。
「全件」と「odds≤20 に限定」の2系統で集計したのは、第2本で議論した「大穴の尾の生存バイアス」(odds>50 の極端な高分散)を切り分けるためです。EV≥1.5 を素朴に取ると ABLATED 版は中央オッズ約94倍の大穴が大量に紛れ込み、控除率水準しか出ません。デプロイ可能性の議論には odds≤20 のコアでの比較が現実的です。
3.2 結果(記事の中核図)
| 版 | BT 16ヶ月 | FT 6週 |
|---|---|---|
| WITH(設計通り) | n=4835 / 的中15.3% / 回収率 116.3% | n=580 / 的中8.8% / 41.2% |
| ABLATED 全件 | n=24705 / 的中2.8% / 81.8%(大穴洪水) | n=2633 / 的中1.6% / 60.1% |
| WITH & odds≤20 | n=3601 / 的中19.9% / 102.7% | n=370 / 的中13.8% / 64.5% |
| ABLATED & odds≤20 | n=3251 / 的中13.2% / 116.7% | n=336 / 的中6.0% / 49.3% |
出典:reports/ft_diagnosis_20260603.md §9(2026-06-03 スナップショット、read-only 再計算)。WITH の BT 116.3% は SSOT 公開値 115.4% と n の取り方差で約 1pt 内、再現性は担保。
3.3 読み方
観察A ── オッズ成分を抜いても全体は崩壊しない。「設計はオッズ単独で、それ以外は飾り」仮説はここで否定されます。
観察B(BT) ── odds≤20 のコアでは BT は ABLATED の方が WITH より高い(116.7% > 102.7%)。BTだけ見ると「odds_implied は希釈要因で、ファンダ単独の方が強い」と読めてしまう数字です。in-sample の最良が「ファンダ単独」になる、というこのねじれが伏線。
観察C(FT) ── 前向きに測ると逆転する。ABLATED & odds≤20 は 49.3%(的中6.0%)まで落ち、WITH は 64.5%(的中13.8%)。 的中率で2倍以上の差で、配当の偶然では説明できない方向の差です。 BT 最良が FT で崩れる、過学習の教科書的症状そのもの。
3.4 結論
ablation は2段で答えを返してきました。
- 「自前モデルのエッジはオッズの循環参照で水増ししただけの見せかけ」説 → 否定(観察A)
- 「自前ファンダ5因子はオッズと独立した前向きエッジを持っている」説 → 否定(観察C)
残った第3の答えは、 自前モデルはオッズと同じ方向を、より雑に写している、というところに落ち着きます。オッズの写し鏡ではないが、オッズを超えた独立シグナルでもない。BT で ABLATED が WITH を上回って見えたのは、in-sample 上で「ノイズの自由度」を多く取った上振れで、前向きには汎化しません。
4. 検証2:相関 0.78 をどう解釈するか
並んで頻出するのが master_score と市場 implied probability の相関です。実測 corr(master_score, 1/odds) = 0.78。
この高相関の解釈で飛びつきがちなのは次の2つで、どちらも単独では不適切です。
- 誤解1「0.78 はオッズ参照だから当たり前」 → 部分否定。ablation で odds_implied を抜いてもBTは崩れないので、相関はオッズ参照だけでは説明できない。
- 誤解2「0.78 もあるなら市場は非効率」 → 否定。同じ公開情報を全員が独立に読めば、独立計算でも結果は寄る。株式 ML で公開ファンダ score が PER と高相関するのと同型。
傍証として confidence_rank 別中央オッズが綺麗に並びます(S=4.8 / A=9.9 / B=160.9 / C=271.1倍)。同じデータを別経路で読んだ結果が寄っているわけです。相関の高さ自体は問題になりません。ablation の FT 逆転(観察C)と組み合わさったときに初めて 独立エッジ不在を示してしまう、という構造です。
5. 検証3:未使用シグナル「馬体重」をオッズ帯統制で見る
最後の検証は master_score の採点に 使っていない公開構造化データです。題材は weight_diff(前走比馬体重増減)。仮説は「市場が織り込んでいない未使用構造化シグナルがあれば、馬体重バンドごとに勝率の勾配が出るはず」。過学習対策に 事前定義バンド × オッズ帯統制 × 期間2分割を入れて scripts/bt_weight_signal.py で BT のみ実行(read-only)。
オッズ帯統制(決定的)の結果が核心。3-7倍帯に絞って weight_diff バンドごとの勝率を見ると:
| weight_diff バンド | 3-7倍帯の勝率 |
|---|---|
| 大きく減(-6kg以下) | 17.0% |
| やや減(-5〜-2kg) | 16.7% |
| 増減小(-1〜+1kg) | 17.7% |
| やや増(+2〜+5kg) | 17.2% |
| 大きく増(+6kg以上) | 17.6% |
ほぼ完全に平坦。他帯でも単調性なし、期間2分割でも回収率は乱高下しどの帯も 100% を頑健には超えませんでした。
含意は ablation・相関と同じ方向です。 中央競馬市場は、モデルが採点に使っていない公開構造化データすら、最終オッズ時点でかなり効率的に価格化している。§3+§4+§5の3つで、自前モデル側から効率的市場仮説の競馬市場版を支持する証拠が出揃いました。
6. 副次発見:設計したが実質死んでいた成分
ablation の過程で、master_score の2成分が実質的に識別力をほぼ持っていないことが分かりました。
| 成分 | Cohen's d | 実態 |
|---|---|---|
| Track Bias | 0.065 | データ供給が本番でゼロ、全頭デフォルト |
| Training | 0.037 | ほぼ全頭デフォルト |
これを「バグ」「設計ミス」と言ってしまうと話が早いですが、本記事ではあえて 意図した設計判断のうえで残している成分として扱います。理由は、UmaScore の重要技術判断のひとつに Master Score の重み最適化でオッズ比率を上げない/オッズ独立性を維持する、という方針があるためです。
softmax は同レース内の相対比較なので、全頭一律に乗る定数項は確率に影響しません。 死に成分は無害で、かつオッズ寄りに重みが偏らないようにする緩衝材として機能します。逆に Track Bias と Training の重みを 0 にして残り成分を再配分すると、結果的に odds_implied の比率が相対的に上がります。過去にこの方向で重み最適化を試したところ BT 回収率が 118% から 93% 台まで落ちた経緯があり、 死に成分を据え置くを設計判断の側に置いています。
negative result の記事なので副次の負の例も併記しましたが、これは「バグの開示」ではなく、 弱い成分をなぜ残しているかの設計根拠の開示だと読んでもらえると正確です。
7. 一般化:この検証手順は他ドメインでも書ける
ここまでの3つの検証は、競馬以外でも、市場価格と独立スコアが共存するドメイン(株式 / FX / スポーツベッティング / 予測市場)なら同じ形で書けます。再利用 3 点セットはこうなります。
- Ablation:市場価格由来成分を抜き、in-sample と out-of-sample の両方で性能差を測る。BT 最良が FT で崩れたら、その成分が前向き信号の主役。
- 相関の解釈:自前スコアと市場 implied 値の相関は単独では「写したか/同じデータを別経路で読んだか」を分けられない。ablation の前向き挙動と組み合わせて初めて意味が立つ。
- 統制実験:未使用の構造化シグナルを、市場価格帯で統制した条件下で勝率勾配を見る。出なければその情報は市場に織り込み済み。
EMH の弱形・準強形を自分のデータで小規模に部分テストできる雛形として手元に置いておく価値はあります。
8. 補足:個人投機目的では運用していません
技術文脈の記事ですが、競馬は公営賭博であるため一言補足します。UmaScore はあくまで 運営者個人のフォワードテスト記録の公開であり、購入推奨ではなく、利益保証もありません。FT 結果は実投票ではなくスナップショット記録です。なお公営競技は20歳以上の自己責任であり、馬券購入の代理や投資助言は行いません。本記事の数値・判定スタンスは結果の良し悪しを訴求する意図はなく、「BT と FT で何ポイント乖離するかをそのまま記録する」「ablation で独立エッジが立たないことを記録する」こと自体を価値として扱っています。
9. まとめ
master_score と市場 implied probability の高い相関(0.78)の解釈には3つの可能性がありました。①モデルがオッズを写した/②モデルとオッズが同じ公開データを独立に読んだ結果として寄った/③市場が非効率で、モデルが市場を出し抜いている。
ablation・相関分析・統制実験の3点セットを通すと、 ②が最も説得力のある解釈で、①と③は現データでは支持されません。これは competitive な市場での自前モデルにとって厳しい結果ですが、negative result そのものは検証手順を含めて positive な資産として残ります。
UmaScore のフォワードテストは継続中で、軸ABC統合判定(8月末-9月)まで結果判断は留保しています。本記事のような技術的な検証ノートは Zenn/Qiita で、検証の物語や運営判断の経緯は note(note.com/umascore)で、と棲み分けています。「自前 ML で市場仮説に挑んで跳ね返された」プロセスごと公開する記事を探していた方の参考になれば幸いです。
10. 参考
- 第1本:「競馬予想 ML でデータリーケージを正攻法で潰した話 ──
race_dateフィルタを4箇所に入れて気づいたこと」(Qiita) - 第2本:「バックテストで作った『回収率118%』がフォワードテストで崩れた話 ── 個人開発の競馬予想MLで観測した4つの構造劣化」(Qiita)
- Eugene F. Fama, Efficient Capital Markets: A Review of Theory and Empirical Work (1970)
- Marcos López de Prado, Advances in Financial Machine Learning(特に Feature Importance / Backtest Overfitting の章)
- UmaScore: https://umascore.com
- note 連載:https://note.com/umascore