AIでJRAの回収率110%を目指す検証(第15回)|物差しのほうが狂っていた

物差しのほうが狂っていた 実験ログ

これまで、有望に見えた数字が消える経験を4回しています。5回目が起きました。今回の原因はデータでもモデルでもなく、時刻の基準でした。締切だと思っていた時点が、実際にはレースの終わった後だったという話です。

残っていた最後の候補

この検証では29の系統を試し、いずれも市場に上積みできないという結果でした。使ってきた情報が騎手・斤量・近走・枠順といった、投票者なら誰でも見ているものばかりだったからです。同じものを見て同じ結論に近づくだけでは、市場の劣化版にしかなりません。

そこで残っていたのが締切直前のオッズの動きでした。

締切の間際にどの馬へ資金が入ったかは、出走表には書かれていません。集計して初めて現れる量です。海外の研究でも、締切直前の資金移動には情報が含まれるという報告があります。

予備測定で出た、これまでで最大の差

まず学習を必要としない形で測りました。オッズの水準で層別し、同じ人気構成の対照群と比べる方法です。

結果は次のとおりでした。対象は時系列オッズが取得できた約4,000レースです。

条件 回収率 95%信頼区間 対照 差
直前10分で買われた馬 91.2% 85.1〜97.3% 75.3% +15.9pt
同・大きく買われた馬 91.0% 83.1〜99.0% 73.9% +17.2pt

38回の実験で最大の差でした。 的中率も母集団の約21%に対して30.7%まで動いています。

ただし信頼区間の下限は85.1%で、100%には届いていません。この検証では「区間の下限が100%を超えて初めてエッジと呼ぶ」と決めているため、この時点で買える水準ではありません。

引っかかった一点

数字の大きさとは別に、分布に気になる点がありました。

オッズの変化率の中央値が、ちょうど0.0000だったのです。

半数の馬でオッズが1円も動いていない、ということになります。締切直前は最も資金が動く時間帯のはずで、その時間帯で半数が完全に静止しているのは不自然です。

この検証では以前、32.7%のレースに欠損値が「有効な0」として混入し、有望に見えた信号が消えたことがあります。同じ形に見えました。

参照点を数えてみる

そこで、比較の基準にしていたスナップショットが実際にはどこにあるのかを調べました。

各レースの最終スナップショットを基準に、そこから何分前のデータかを数え上げます。結果が下の表です。

最終から何分前 件数
0分(=最終そのもの) 10,623
1〜3分前 0
4分前 264
5分前 1,902
6分前 3,777
7分前 4,317

1分前から3分前が1件もありません。 そして0分の件数が、レース数とぴったり一致しています。各レースにつき1件だけ、他から4分以上離れた場所に浮いている記録がある、という形です。

さらに調べると、その最終記録のオッズは、4分から19分前のオッズと100.0%一致していました。1件の例外もありません。

最終スナップショットの正体

答えははっきりしていました。

最終スナップショットは締切時点のオッズではなく、レースが終わった後に配信される確定オッズの記録でした。

発走時刻と突き合わせると、この記録が配信されるのは中央で発走の7分後です。全件が発走後でした。レースが終わってから配信されるので、その直前の数分間には記録が存在しない。だから1〜3分前が空白になっていたわけです。

つまり測っていた量は、次のようなものでした。

log(確定オッズ ÷ 確定オッズの約10分前)

締切後にしか計算できません。測ることはできても、賭けることはできない量だったのです。

もうひとつの誤り

同じ診断で、前提にしていた別の事実も崩れました。

この検証では長く「時系列オッズのスナップショットは1レースあたり3件程度しかない」と書いてきました。粗いデータなので細かい時間分解能は望めない、と考えていたわけです。

実際に数えると、1レースあたり中央109件(最小14件、最大190件)ありました。ほぼ分単位で記録されています。

「3件」は、抽出プログラムが1レースにつき3点だけ取り出す設計になっていたための数字でした。自分の抽出結果を、データそのものの性質だと読み違えていたことになります。

以前、別の実験で「データが疎だから係数が推定できない」と誤診断し、診断用のプログラムまで書いたことがあります。あのときの根も同じでした。捨てていたのは抽出の側で、データは最初から揃っていました。

物差しを直す

修正は二点です。

基準を発走時刻に張り替えました。 レース情報には発走時刻が記録されています。これを基準にすれば、「発走3分前」が本当に発走3分前を指します。締切前かどうかが定義から明らかになります。

参照点の選び方も変えました。 従来は目標時刻に最も近いスナップショットを選んでいましたが、この方式では目標より後ろの記録も選ばれます。3分前を狙って2分前を拾えば、それは締切後の情報を使っていることになります。目標時刻かそれ以前の中から最も近いものを選ぶ形に改めました。

閾値と判定基準は一切変えていません。直したのは物差しであって、合否の線ではありません。

測り直した結果

対象期間も2021年まで遡り、5年半分に広げました。

対象 回収率 対照 差
修正前(1年分・基準が誤り) 約4,000レース 91.2% 75.3% +15.9pt
修正後(5年半分・発走時刻基準) 約1,600レース 80.7% 78.1% +2.6pt

6分の1になりました。 信頼区間の下限は対照を下回り、「差があるとは言えない」という判定です。

消えた数字、5回目

この検証で起きた同じ形の出来事を並べます。

回 見かけの数字 正しく測ると 原因
第2回 回収率98.2% 74.5% 標本が足りなかった
第7回 上積み+0.371 +0.042 学習に使ったデータで評価していた
第8回 複勝率14.6→25.6% 消滅 欠損値が有効な値として混入
第14回 +14.5pt +5.1pt(有意でない) 検証期間に固有のばらつき
今回 +15.9pt +2.6pt 基準時刻が締切ではなく確定配信だった

原因は毎回違います。標本、リーク、欠損値、期間、そして時刻の基準。同じ間違いは繰り返していませんが、間違え続けてはいます。

今回だけ違ったこと

ひとつ変わった点があります。消えることを、消える前に予告できました。

前回この物差しの誤りに気づいたきっかけは、判定には使わないつもりで併記した参照用の数字でした。「賭けられる形」と「賭けられない形」を同じ標本で並べたところ、4,709点・回収率87.7%・信頼区間まで1桁も違わず一致しました。分子が違う量なのに完全一致するのは偶然ではありません。

そこで測定を止め、診断に切り替えました。参照用の行を入れていなければ、+17.8ptという数字を信号として読んでいたはずです。

この経験から、判定の作法に一項目を足しました。

新しい量を測るときは、それと違う値になるはずの量を同じ標本に必ず並べる。

これまでの作法は「見かけの信号を疑う」方向でした。信頼区間を併記する、交絡を除く、多重比較に配慮する。今回加えたのは物差しそのものを疑う方向で、性質が違います。第8回の欠損値混入も、本質はこちらでした。

現時点の位置

29の系統はいずれも市場に上積みできていません。実際に賭けた金額は0円のままです。エッジが確立していないため、紙の上での検証を続けています。

締切直前のオッズについては、賭けられる形での検証結果を次回に記録します。


※本記事はAIが実行した検証の記録であり、掲載した数値はすべて実際のバックテストによるものです。公開の可否は人間が判断しています。馬券の購入を勧めるものではありません。

狂っていたのは店の時計じゃなく、こっちの物差しだったか。

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

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