この検証の目的は、最初から一貫して回収率110%です。的中率ではありません。それなのに、74回の実験を支えていた採点プログラムは、的中率にしか統計的な判定を掛けていませんでした。 回収率の数字は表に印字されていましたが、信頼区間もp値も付いておらず、多重比較の補正にも、採否の判断にも使われていませんでした。今回はその発見の記録です。まだ測り直していません。物差しを直しただけの回です。
何が起きていたか
この検証では、思い付いた条件(以下「技」と呼びます)を一本ずつ採点する共通の関数を使っています。「単勝オッズが同じくらいの馬と比べて、その条件に当てはまる馬は成績が良いか」を測るものです。
出力される表には、ずっと2つの数字が並んでいました。
| 列 | 中身 |
|---|---|
| 的中リフト | 同じオッズ帯の馬と比べて複勝の的中率が何ポイント高いか |
| 回収リフト | 同じオッズ帯の馬と比べて回収率が何ポイント高いか |
問題は、信頼区間とp値が的中リフトにしか付いていなかったことです。回収リフトは平均を計算して印字するだけでした。
その結果、次の3つが全部、的中率側だけで動いていました。
- 多重比較の補正(候補をたくさん並べて測るときの偽陽性対策)
- 「信頼区間の下限が0を超えたか」という採否の判定
- 「年ごとに符号が一貫しているか」という安定性の判定
表には回収率の数字が出ています。 出ているので、見ている側は「回収率も見て判断している」と思い込みます。実際には、その数字は判定に一切参加していませんでした。
見逃していた理由
数字が消えていたなら気付きます。数字は出ていました。判定に使われていなかっただけです。
これが厄介なところで、出力を眺めているかぎり異常は見えません。関数の中の、区間を計算している行が1行だったこと、その1行が的中率の配列を受け取っていたこと。それだけです。74回ぶんの実験が、そこを一度も疑わずに走りました。
出力に出ている数字と、判定に使われている数字が同じとは限りません。
AIに検証を任せる場合、ここは特に危ないと思います。AIは指示された比較を実行しますが、「その比較が目的に沿っているか」は、指標の定義を書いた時点で固定されてしまいます。そして指標の定義は、たいていコードの奥に短く書かれていて、レビューの対象になりません。
何が歪んだか
具体的な被害が出ていました。第72回の実験で、レースの形を表す技を並べて測ったときの結果です。
| 技 | 的中リフト | 回収リフト |
|---|---|---|
| 人気が集中しているレース | +3.9pt(最大) | +2.6pt |
| 1番人気と2番人気の差が大きいレース | +1.8pt | +5.2pt(最大) |
判定は的中率で行われました。したがって上の技が「最も有望」として扱われ、下の技は2番手になりました。
しかし目的は回収率です。 目的に照らせば、順位は逆でした。
このねじれ自体は当時も記録に残していますが、「なぜ2つの指標がずれるのか」という話として扱っていました。ずれた原因が採点機構の側にあるとは考えていませんでした。
合成データでの再現
物差しを直したあと、人工のデータで確かめました。「人気の馬ほど当たるが、人気の馬ほど配当が小さい」という、現実と同じ形のデータを作ります。
そこに、情報を一切含まない候補を入れます。「単勝3.0倍以下の馬」です。これは馬の強さについて何も言っておらず、単にオッズが低い馬を抜き出しているだけです。
| 測る量 | 結果 | 判定 |
|---|---|---|
| 的中リフト | +7.9pt | 合格 |
| 回収リフト | −7.9pt | 不合格 |
同じデータの、同じ候補です。的中率で見れば優秀な技、回収率で見れば買ってはいけない技。
対照群はオッズ帯で揃えてありますが、帯の中でさらに人気側だけを抜けば、的中率は上がります。ただし配当は下がるので、回収率は下がります。差し引きでマイナスです。
この検証の目的に照らして正しい答えは「不合格」ですが、74回ぶんの実験は「合格」の側で選別されていました。
ついでに見つかった2つ
物差しを直すために採点まわりを読み直したところ、別の問題も出てきました。
単調変換で作った候補は、新しい候補ではない
第72回では、レースの形を表す技を15本並べて測りました。そのうち2本が、こういう定義でした。
- 人気の集中度が高いレース(集中度の上位25%)
- 実質的な頭数が少ないレース(集中度の逆数の下位25%)
逆数は単調減少なので、この2つはまったく同じレースを選びます。 15本測ったつもりで、実際には14本でした。
数式で書けば一行で分かることですが、日本語の説明で並べると別の技に見えます。今回、機械的に検出する仕組みを入れました。候補どうしの順位相関を採点の前に印字して、極端に高い対は先に落とします。実際に走らせたところ、「人気が集中」と「上位3頭に集中」も相関0.98でした。これも実質同じものである疑いがあります。
対照が価格しか揃えていないと、構造の違いが素通りする
複勝は、8頭以上のレースでは3着まで、5〜7頭のレースでは2着までが的中です。頭数は的中率も回収率も構造的に動かします。
一方、この検証の対照群は単勝オッズの帯でしか揃えていません。 頭数は素通りします。
そして、人気の集中度は頭数と相関します(少頭数のレースほど集中して見えます)。人工データで確かめたところ、「人気が集中しているレース 上位25%」で選ばれるレースは、平均で5.5頭も少ない集合でした。
つまり第72回の「+3.9pt」が、レースの読みやすさによるものなのか、単に少頭数だからなのかは、まだ分離できていません。
これも検出器を追加しました。技ごとに「選ばれたレースの平均頭数」と「選ばれなかったレースの平均頭数」の差を必ず併記します。
判定の作り方も変えました
物差しを直すついでに、判定基準を2つ変えています。どちらも測る前に決めました。
「効かなかった」と「測れなかった」を分ける
回収率は「外れれば0、当たれば配当倍率」という、ばらつきの大きい量です。的中率(0か1か)より区間が広くなりやすく、候補によっては何も言えないことがあります。
これまでは、区間が0をまたげば一律に「効果なし」でした。今後は、その候補で検出できる最小の効果(区間の半幅)を併記して、次のように分けます。
- 効果は測れているが、目標に足りない
- そもそもこの件数では何も言えない(効かなかったのではない)
この区別が無いと、全滅したときに「試したがダメだった」と読んでしまいます。実際には「試せていなかった」かもしれません。
「年ごとに符号が一致するか」を主判定から外す
第70回で「4年平均の103.3%は2021年に支えられていた」と分かって以来、「年ごとの符号が4つとも揃うか」を選別条件に加えていました。
これは検定ではありません。 多重比較の補正が一切かかっていません。真の効果が正で、各年のばらつきがそこそこ大きい場合、4年とも正になる確率はおよそ0.5です。15本測れば、偶然揃うものが数本出ます。
第72回と第74回の判定には、この欠陥がそのまま入っています。今回からは「最も成績の悪かった年でも、区間の下限が0を超えているか」に置き換えました。こちらのほうが厳しく、かつ意味がはっきりしています。
直したこと、直していないこと
過去の実験を出したコードには手を触れていません。記録済みの数字を出したプログラムを書き換えると、あとで差が出たときに「移植のせいか、実体か」が分からなくなります。
追加したものは、既存の呼び出しを1行も変えずに動くようにしてあります。新しい機能は明示的に指定したときだけ有効になります。この後方互換は、データベースを使わない検査57項目で確認しました。
それで、結果は
まだ出ていません。
今回やったのは物差しの修理までです。実際に測り直すにはデータベースが必要で、それは別のマシンにあります。実行はこれからです。
そして、全滅する可能性が高いことも、測る前に書いておきました。
第73回で分かっているのは、対照群そのものの回収率が73.3%だということです。100%に届かせるには+27ポイント必要で、これまで観測された最大の効果は+6.3ポイントでした。桁がひとつ足りません。
正しい物差しで測り直しても+27ポイントを出す技が無かった場合、それは「測れなかった」ではなく「正しく測っても無かった」という結論になります。
- 弱い技を積み上げる路線は、第73回で算術的に閉じました
- レースを選ぶ路線も閉じるなら、残る問いは「2021年に何が起きていたのか」だけになります
どちらに転んでも次の一手が決まるので、測る価値はあると考えています。
この回の要点
- 目的に使う指標と、判定に使う指標を一致させる。 表に印字されていることは、判定に使われていることを意味しません。
- 単調変換で作った条件は、新しい条件ではない。 言葉で並べると別物に見えます。機械的に検出したほうが確実です。
- 対照群が揃えていない変数は、素通りする。 価格を揃えても、構造(この場合は頭数)は揃いません。
- 「効かなかった」と「測れなかった」は違う。 分けて記録しないと、次の判断を誤ります。
この記事は個人の検証記録です。投資助言でも馬券の推奨でもありません。過去のデータに対する分析結果であり、将来の成績を保証するものではありません。
ずっと当たりの口になっていた。欲しかったのは儲けなのに。


