AIで回収率110%を目指す検証(第44回)|回収率108%を見つけて、それがレース後にしか存在しない数字だと分かるまで

回収率108%を見つけて、それがレース後にしか存在しない数字だと分かるまで 実験ログ

前回(第41回)は「監視が4日間、異常なしと言い続けていた」という運用の話でした。
今回は数字の話です。1日で見つけて、1日で失いました。


見つけたときの数字

地方競馬の19年分を使っています。探索に2007〜2020年の14年、検証に2021〜2024年の4年。探索期で条件を作り、検証期で確かめるという順序を守っています。

その日の午後、こういう数字が出ました。

単勝1.5〜2.0倍の馬のうち、「複勝の人気が単勝の人気より2つ以上下」の馬を複勝で買う

  探索 2007-2020   n=1,287   回収率 108.5%  [104.1, 112.5]
  検証 2021-2024   n=  208   回収率 108.9%  [100.2, 118.1]

独立な2つの期間で、点推定が 0.4pt しか違いません。そして両方とも、95%区間の下限が100を上回っています。

このプロジェクトを始めてから、下限が100を超えたのは初めてでした。


なぜそれが起きるのか(当時の理解)

複勝の払戻は、その馬が複勝でどれだけ買われているかで決まります。単勝の人気と複勝の人気は普通そろいますが、ときどきズレます。

「複勝でだけ嫌われている馬」を買うと、こうなります。

配当    114.3円 → 147.6円   +29.1%
的中率   77.8% →  73.5%    −5.5%

配当が29%上がるのに、実際に3着以内に入る率は5.5%しか落ちない。釣り合っていません。

しかも逆向きも確認できました。複勝で「買われている」側は、的中率が上がるのに回収率は下がります。つまり複勝の人気は的中率を正しく予測している。値段だけがズレている。

きれいな話に見えました。


1つだけ、確かめていなかったこと

この数字は確定オッズ、つまりレースが終わった後の最終的なオッズで作っていました。

買うときには、その数字はありません。

うちの自動投票は締切の2分前に判定します。だから確かめるべきことは1つです。

締切2分前の複勝人気は、確定時点の複勝人気と同じか。

これを測る前に、合格ラインを決めました。後から決めると、出た数字を都合よく読んでしまうからです。

締切2分前に「乖離2つ以上」だった馬のうち、確定でも2つ以上だった割合を「適合率」とする。

適合率が70%なら:  0.7 × 108.5% + 0.3 × 87% = 102.1%
・70%を割ると、計算上100%を割る。だから合格線は70%。

結果

適合率  28.6%
再現率  35.9%
相関    0.392

3.6頭に1頭しか残りませんでした。

移り方の表が、いちばんはっきりしています。

締切2分前 \ 確定 −2 −1 0 +1 +2 +3
+2 3.3% 9.6% 31.8% 31.1% 19.5% 4.8%

締切2分前に「+2」だった馬の3割は、確定では「0」に戻ります。1割強はマイナス側、つまり「複勝で買われている」側にまで移動します。

締切2分前の複勝人気と、確定の複勝人気は、ほぼ別物でした。

事前に書いた式に実測値を入れます。

0.286 × 108.5% + 0.714 × 87% = 93.1%

基準線より少し良いだけで、100%には届きません。

この計算を先に書いておいたことが、この日いちばん役に立ちました。もし後から基準を作っていたら、私はこう書いていたと思います。「適合率は28.6%だが、相関は0.392あるので、薄まった形では効くはずだ」。


では、締切2分前の乖離そのものはどうなのか

ここで気づきました。私は間違った問いを立てていた。

❌ 立てた問い   「確定の乖離を、締切2分前に当てられるか」
・本来の問い   「**締切2分前の乖離それ自体**に、予測力があるか」

確定の乖離はレース後にしか分からない量です。それを近似する必要なんてありません。締切2分前の乖離が、その時点での値段のズレを表しているなら、確定と一致しなくても構わない。

測りました。

基準線                          84.1%
締切2分前に乖離+2以上の馬        76.0%   [66.3, 85.3]
   的中率 −10.9pt / 配当 +9.9円

逆でした。

確定の乖離   配当 +29.1%  的中  −5.5%  → 打ち消しが**不完全** → 108.5%
2分前の乖離  配当 +20.4%  的中 −24.6%  → 打ち消しが**過剰**   →  76.0%

締切2分前に複勝が嫌っている馬は、実際にちゃんと弱い。市場は正しく値段をつけています。


108.5%の正体

2つを並べると、答えが出ます。

2分前に嫌われている馬  → 実際に弱い(的中 −10.9pt)→ 買っても損
確定で嫌われている馬   → **2分前以降に票が入らなかった馬**

確定時点の乖離には、「レース直前に人気が動かなかった」という結果が含まれていました。そして動かない馬は、動く馬より成績が良い。

つまり、値段のズレを見つけていたのではありませんでした。
「締切間際の資金の動きが結果と相関する」という、ごく当たり前のことを、遠回りに測っていただけでした。
そしてその情報は、判定時点には存在しません。


最後に確かめたこと

まだ1つ、逃げ道がありました。

「動かない馬が良い」なら、動きそのものを指標にすればいい。確定までの動きは見えませんが、朝一から締切2分前までの動きなら見えます。

測りました。56セルすべて平ら。下限が100を超えたセルはゼロでした。


今日わかったこと

数字は1つも前進していません。それでも、この日の測定は「なぜ届かないか」を式の形にしました。

回収率 = 的中率 × 配当

的中率は  単勝オッズがほぼ完全に決めている
          (馬の条件・騎手・調教師・走破タイム・着差 — どれで切っても価格帯の中では動かない)
配当は    複勝オッズがほぼ完全に決めている
          (乖離で切ると配当は上がるが、的中率がそれ以上に落ちる)
動きにも  情報が無い

判定時点で観測できる情報からは、地方競馬の複勝で100%を超える部分集合は作れない。

これは「まだ探し足りない」ではありません。1日で350を超える切り口を、事前登録つきで、3つの期間から測った結果です。


手順の話

この日、100%を超える数字は9回出ました。そのうち8回は、別の期間に当てると消えました。

残った1つも、判定時点では再現しませんでした。

1日で350の切り口を測れば、偶然だけで10前後は100%を超えます。期待値どおりでした。

だから、こうしています。

  1. 測る前に、合格線と根拠の計算を書いて保存する
  2. 片方の期間だけで数字を報告しない
  3. 数字を出すときは、その日に測ったセル数を必ず添える
  4. 件数(n)を比率より先に印字する

4番目のおかげで、この日ひとつ事故を防げました。ある測定が「6,851レース」のはずが「29レース」しか返らず、比率を見る前に異常に気づけました(原因は、早朝のオッズはレコードだけあって中身が空だったこと)。もし比率だけ見ていたら、壊れたデータの上に「不合格」という結論を書いていたはずです。


次

地方競馬の複勝は、判定時点の情報という意味では、かなり見通しが立ちました。残っているのは券種そのものです。

このプロジェクトで100%を超えたことがある券種は、いまのところ1つだけ。それは複勝ではありません。

次回はそちらを測ります。

閉店後の厨房を覗いて、旨い店だと言っていたのか。

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

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