AIでJRAの回収率110%を目指す検証(第13回)|外部データを取ってきても、壁は動かなかった

外部データを取ってきても、壁は動かなかった 実験ログ

前回の総括で、JRA-VANの構造化データは尽きたと書きました。次に必要なのは外から持ち込む情報です。今回はJRA公式が無料で公開している馬場の物理測定を集め、モデルに足しました。

手持ちのデータが尽きたあとで

23回の実験で、JRA-VANから作れる特徴量はすべて市場に織り込まれていることが分かりました。残る道は、外から情報を持ち込むことだけです。

そこで何が使えるのかを調べたところ、意外なものが見つかりました。JRA公式サイトが無料で公開している馬場の物理測定です。

手持ちのデータと比べます。

JRA-VAN(手持ち) JRA公式サイト
馬場 馬場状態コード = 良・稍重・重・不良の4段階 クッション値(連続値)
水分 なし 含水率(連続値%、芝・ダート × ゴール前・4コーナー)
コース設定 見当たらない 使用コース A/B/C/D(2025年以降)

4段階のカテゴリしか持っていなかったところに、連続値の物理測定があったわけです。クッション値は芝の反発力を実測したもので、2020年9月から公開されています。含水率は2018年7月からです。

しかも無料。取らない理由がありません。

収集

過去分はPDFで公開されています。URLの規則性が分かったので、1リクエストあたり3秒の間隔を空けて収集しました。

2,252開催日ぶん、10競馬場、2021年から2026年まで。費用は0円です。

ただし、ここからが本題になります。

検算が2回、汚染を止めた

この検証では過去に3度、有望に見えた数字が消えています。うち1度は、データの3割超に欠損値が混入していたことが原因でした。だから今回も、集めたデータをそのまま信じませんでした。

1回目:符号が逆だった年

クッション値と含水率の相関を、年ごとに計算しました。

水を含むほど地面は軟らかくなります。つまりこの相関は、物理的に必ず負になるはずです。

年 相関 平均クッション値
2020 +0.643 11.42
2021 −0.416 9.27
2022 −0.426 9.13
2023 −0.480 9.07
2024 −0.381 9.27
2025 −0.528 9.32
2026 −0.664 9.69

2020年だけ符号が逆でした。 平均も他の年より2ポイント高く、想定範囲を外れた値が27件ありました。

調べると、2020年のPDFはさらに別のレイアウトで、含水率をクッション値として読み取っていました。含水率どうしを相関させれば、当然プラスになります。

2020年を除外しました。

2回目:静かに0件を返していたパーサ

もうひとつありました。231本のPDFを取得したのに、抽出できたのが2年分しかなかったのです。

原因は、2024年以前と2025年以降でPDFのレイアウトが違っていたことでした。

  • 2025年以降:1行が1開催日
  • 2024年以前:1列が1開催日(転置されている)

最初に書いたパーサは行単位で日付を探す作りだったので、旧レイアウトでは1行も拾えません。そして何も言わずに「成功」を返していました。

PDFの本数と抽出できた年数が合わないことに気づかなければ、そのまま先へ進んでいたはずです。

対策として、0件だったら警告を出すようにしました。さらに旧形式のパーサには、PDFに書かれた曜日と、日付から計算した曜日が一致するかを確認する処理を入れています。一致しなければその部分は捨てます。日付がずれたまま気づかない事態を、構造的に防ぐためです。

「パースが通った」ことと「正しい値を取れた」ことは、別の話です。

モデルに入れる前に分かった制約

集めたデータをモデルに入れる段になって、ひとつ制約に気づきました。

クッション値も含水率も、同じレースの中では全馬に共通の値です。

使っているモデル(条件付きロジット)は、レースの中で馬を比較する構造をしています。つまりレース内で全馬に共通の値は、数式のうえで消えてしまいます。実際、以前の検証でレース内不変の変数を入れたとき、t値がちょうど0.00になったことがありました。

したがって、クッション値をそのまま入れても、必ず何も起きません。

馬ごとに値が変わる形、つまり交互作用でしか入れられないわけです。この制約は不便ですが、いい面もありました。試せる組み合わせが構造的に絞られるので、恣意的に選んだという疑いが入りにくくなります。

事前登録

結果を見てから解釈を決めないよう、実行前に5つを確定しました。機構が説明できるものだけです。

特徴量 想定した機構
クッション値 × 前走の4コーナー通過順 硬い馬場は時計が速く前が止まりにくい。先行有利が拡大する
クッション値 × 直近4走の平均指数 硬い馬場ではスピード型の優位が拡大する
含水率 × 前走の4コーナー通過順 脚抜きが変わり、前が残るか止まるかが変わる
|今回のクッション値 − その馬が過去に走った平均| 経験した馬場と違うほど力を出しにくい
クッション値 × 距離 硬い馬場の恩恵は距離によって変わる

判定基準はモデルの上積みが+0.15以上。これは調教データ1,183万本を検証したときとまったく同じ数字です。今回だけ緩めることはしません。

結果

項目 値
馬場データが付いた出走馬 161,863頭
上積みの推定に使えた件数 94,249
モデルの上積み −0.046(標準誤差0.020、t=−2.33)
95%信頼区間 −0.085 〜 −0.007

基準の+0.15には届きませんでした。

そして、この数字には見覚えがあります。

系統 上積み
条件別適性・騎手厩舎 +0.042
調教データ1,183万本 +0.046
馬場特徴量を入れる前のモデル −0.046
今回(馬場特徴量を入れたあと) −0.046

足す前と、足したあとが、同じでした。

5つの特徴量を追加して、変化は小数点第3位以下です。個別のt値も1.45、1.58、−0.19、0.76、0.00と、ひとつも有意ではありませんでした。

「弱かった」のではなく、「何も足していない」という結果です。

自分の設計ミスについて

5つのうちひとつ、t値がちょうど0.00になったものがあります。「クッション値 × 距離」です。

これはこちらの誤りでした。クッション値はレース内で共通の値ですが、距離もレース内で共通です。共通の値どうしを掛けても共通の値のままなので、モデルの構造上、必ず消えます。

「交互作用なら入る」と書いておきながら、馬ごとに変わる変数と掛けるべきところを、レース共通の変数と掛けていたわけです。しかも、その罠の存在自体はスクリプトの説明文に自分で書いていました。

t値がぴったり0.00という数字が、それを正確に告げています。

ただし残り4つもt値が1.6未満なので、設計を直しても結論は変わりません。

結論

クッション値と含水率は、市場に上積みできませんでした。

理由はおそらく単純です。クッション値は当日の新聞にもスポーツ紙にも載ります。 群衆も見ている情報でした。

前々回、「大敗した馬は本気で追われていないから市場が過小評価しているのではないか」という仮説を検証し、同じ結末を迎えています。現象は実在したのに、市場はすでにそれを織り込んでいました。

「見落とされていそうな情報」は、たいてい見落とされていません。 2回続けて同じ形で確認したことになります。

これで16の系統を試し、すべて否定されました。今回はじめて外部からデータを持ち込みましたが、壁は動きませんでした。

ひとつだけ収穫を挙げるなら、費用が0円だったことです。否定の記録を1つ増やすのに、払ったのは時間だけでした。


本記事はAIが下書きを生成し、人間が公開可否を判断しています。掲載した数値はすべて実データによる分析結果であり、恣意的な抽出は行っていません。本記事は情報提供を目的としたものであり、馬券の購入を勧誘するものではありません。

わざわざ取り寄せた食材も、とうに店の棚に並んでいた。

この後の実験は、地方競馬に舞台を移しています。

地方競馬の市場について測った事実は連載「地方競馬の解体新書」に、当方の価格モデルによる買い目の配信(準備中)は先行案内のページにまとめています。