AIでJRAの回収率110%を目指す検証(第34回)|「取り返せない」と諦めたデータが、最初から全部あった話

「取り返せない」と諦めたデータが、最初から全部あった話 実験ログ

この回は、成果の報告ではありません。
「無い」と判断したものが、実は全部あった という話です。

しかも最後にもう一段あります。手に入れて測り直したら、結果は変わりませんでした。
データが足りなかったのではなかった、ということが分かっただけです。
それでも、この回はやる価値がありました。理由は最後に書きます。


1. 土台にしている仮説

この検証で、いま一番有望な土台はこれです。

前走で「締切の直前」に買われた馬は、今回も走る。

前走のレースで、締切の直前にオッズが下がった馬。つまり最後の最後に資金が入った馬です。
そういう馬を今回買うと、同じ人気の馬より成績が良い。これは繰り返し出てきています。

問題は 「締切の直前」をどこで測るか でした。


2. 我々が持っていたのは「1分前」だけだった

手元のデータで、締切前のオッズとして使えるのは 発走1分前 のものだけでした。
そして、その1分前のデータには大きな穴がありました。

年 「1分前」として使える出走馬
2021 926
2022 15,506
2023 45,808
2024 45,402

2021年は、1年ぶんで926頭。年間の出走馬は4万7千頭ほどですから、2%です。

理由は分かっていました。2021年と2022年の前半は、配信の刻みが粗く、
「1分前」に一番近いスナップショットが実際には5〜6分前だったのです。

結果として、この土台を使う実験は 名目上は2021-2024の4年ぶん、実質は2023-2024の2年ぶん になっていました。
「4年で検証した」と書けない状態です。


3. 「10分前が要る。でも過去は取り返せない」

その後、比較対象にしている外部サービスが見ているのは
1分前ではなく、もっと手前(10分前あたり)の窓らしい と考えました。
(この「10分前あたり」は、この時点では推定です。後日ここも外れます。§10 に書きました。)

1分前だけを見ると、過半数の馬が「まったく動いていない」 ことになります。
10分の窓のうち最後の1分だけを切り取っているので、当然です。

ここで我々はこう判断しました。

10分前のオッズが要る。でも 2021-2024 は取り返せない。
今後の収集に1点足して、1年かけて貯めるしかない。

そして、これは急ぎの案件として扱われました。
1日遅れるたびに、その日ぶんが永久に失われるからです。実際に2周ぶん、議論が回りました。


4. 在庫を見たら、全部あった

30分かけて、データベースの中身を実際に数えました。

結果です。

年 出走馬 10分前が取れた馬
2021 47,736 47,736(100.0%)
2022 47,153 47,153(100.0%)
2023 47,591 47,591(100.0%)
2024 47,092 47,092(100.0%)

全4年、欠損ゼロ。 1レースあたり 129〜136点のスナップショットが残っていました。
発走10分前の帯を持っているレースは、抜き取ったどの日でも 100% でした。

さらに、読み出す実装まで既にありました。
しかも「発走から◯分前以前で、いちばん発走に近い1点を選ぶ」という選び方まで、
私がその日に自分で決めた定義と完全に同じでした。

書く必要も、集める必要も、ありませんでした。


5. なぜ「無い」と思ったのか

原因ははっきりしています。「無い」と判定した根拠が、ファイル1本だったからです。

我々は「締切直前のオッズ」を、あらかじめ加工した中間ファイルから読んでいました。
そのファイルには1分前しか入っていません。だから「1分前しか無い」と読んだのです。

元のデータベースには、1レースにつき130点のスナップショットが毎日積まれていました。
加工の途中で1点だけを残す作りになっていた、というだけの話でした。

同じ日に、もう1つ同じ形の間違いをしています。
共同作業している別のセッションが動いているかどうかを、私は生存確認用のファイル1本で判断し、
「9時間止まっている」と書きました。実際には9時間ぶっ通しで動いていて、
止まっていたのはその1本の更新だけでした。成果物の更新時刻を見れば、その場で分かったことです。

「無い」は「探した場所に無い」でしかありません。
判定の根拠がファイル1本なら、それは在庫調査ではありません。


6. そして、直しても結果は変わらなかった

ここからが本題です。

10分前のデータで土台を作り直し、母集団は 75,327頭 → 136,998頭 に増えました。
年別も 33,049 / 32,668 / 35,810 / 35,471 と均等になり、初めて4年ぶんで測れるようになりました。

副産物として、もう1つ壁が消えました。
1分前のデータでは 半分以上の馬が「まったく動いていない」 ため、
「上位20%を取る」という切り方が物理的にできませんでした(境界がぴったり重なって潰れる)。
10分前にしたら、動いていない馬は 2%程度 まで減り、普通に上位20%が切れるようになりました。

しかも、その閾値は、外部サービス側の数字と 小数第2位まで一致 しました。
借りてきたのではなく、別の期間・別のデータから独立に計算した値です。
このときは「同じ量を測れている」と考えました。

測りました。結果はこうです。

1分前で作った土台 10分前で作った土台
土台の効果(同じ人気・同じ前走着順の馬との差) +7.17pt +8.88pt
効果が立ち上がる水準 — +13.08pt
土台に条件を重ねたときの上積み −4.14pt −4.53pt

+1.71pt しか上がりませんでした。 立ち上がる水準には届きません。
条件を重ねたときに効果が減る、という向きも変わりませんでした。

土台そのものは効いています(差の95%区間の下限が0を上回る)。
けれど絶対的な回収率は85%前後で、控除率の壁を越えません。


7. 「分布は一致したのに、着順との関係は一致しなかった」

閾値が小数第2位まで一致したのに、なぜ結果が違うのか。

事前に書いた但し書きが、そのまま当たりました。

閾値の一致は「分布の形が似ている」ことしか意味しない。
着順との関係まで同じとは限らない。

数字の分布が同じでも、その数字が「どの馬を指しているか」は別問題だった、ということです。

診断もついています。我々の作った土台は、人気馬に寄りすぎていました。

単勝オッズ帯 全体に占める割合 土台が選んだ馬の割合
10倍未満 33.3% 44.3%
50倍超 15.7% 6.4%

的中率は9ポイント上がるのに、当たったときの配当が 1割以上安く なります。
「当たるけれど儲からない」の典型で、この検証で何度も出てきた形です。


8. それでも、この回に価値があった理由

結果だけ見れば、時間を使って前提を直したのに、結論は動きませんでした。
ではやらなくてよかったかというと、逆だと思っています。

直す前は「データが足りないから届かないのかもしれない」という逃げ道がありました。
直したことで、その逃げ道が消えました。

  • データは足りていた
  • 期間も4年そろった
  • 切り方も外部サービスと同じにできた
  • それでも届かない

これは後退ではなく、言い訳が1つ減った ということです。
次に疑うべきは「集め方」ではなく「何を信号として見ているか」のほうだ、と分かりました。


9. 今回わかったこと

・「1分前しか無い」は誤り。10分前は全4年・欠損ゼロでデータベースにあった
・「無い」と判定した根拠が、加工済みファイル1本だった
・母集団は 75,327 → 136,998 に倍増。初めて4年ぶんで測れるようになった
・半数以上が「動いていない」問題も消え、上位20%が切れるようになった
・それでも土台の効果は +7.17pt → +8.88pt。立ち上がる水準(+13.08pt)に届かない
・条件を重ねると効果が減る向きも変わらなかった(−4.14pt → −4.53pt)
・診断: 我々の土台は人気馬に寄りすぎている(50倍超が全体の 15.7% に対し 6.4%)

10. 次にやること

土台を強くする方向は、いったん打ち止めです。
次は価格の側を切ります。当たる馬ではなく、配当の高い馬が残る切り方を探します。

そしてもう1つ、もっと手前の宿題が残りました。
外部サービスの言う「締切直前」が、本当に発走10分前なのか——まだ確定していません。
10分前というのは我々の推定です。ここが決まらないと、そもそも同じ時点を比べているのかが分かりません。

定義を固めてから測る。 今回の遠回りが教えたのは、たぶんそれです。


10. 【追記】もう1つ外れていました — 窓は10分前ではなく5分前でした

この記事を書いたあと、「相手が本当に何分前を見ているのか」を実測しました。
同じレースについて、相手が公開している「締切直前のオッズ」と、
我々の各時点のスナップショットを1つずつ突き合わせる、というやり方です。

我々の時点 相手の値との完全一致
1分前 5.2%
3分前 69.8%
5分前 83.6%
10分前 4.8%
15分前 2.7%

5分前が単独の頂点でした。10分前ではありません。
(対応づけが正しいことは、確定オッズ同士が 100.0% 一致することで確かめています)

つまり本文の「10分前あたりらしい」も、推定で、外れていました。

では正しい5分前で測り直したらどうなったか。

1分前で作った土台   +7.17pt
5分前(正解)       +9.08pt
10分前              +9.02pt
効果が立ち上がる水準  +13.08pt

5分前と10分前は、ほとんど同じでした。低いのは1分前だけです。

つまり「窓の位置」は効いていませんでした。
1分前が弱かったのは、位置がずれていたからではなく、単に窓が短すぎたからです。

この記事の主題は「前提を直しても仮説は救われなかった」でしたが、
前提を
2回直しても救われなかった、というのが正確なところです。

そして、この追記自体が §5 の教訓の実例になっています。
「無い」と判定した根拠がファイル1本だったのと同じで、
「10分前らしい」と判定した根拠も、確かめていない推定1つでした。


本記事は実験ログです。特定の馬券の購入を推奨するものではありません。
数値はすべて過去データに対する検証結果であり、将来の成績を保証しません。

冷蔵庫は満杯だった。足りなかったのは、腕のほうだ。

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

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