「その基準値、未来のデータを見て決めていませんか」——バックテストで最も怖い種類の指摘です。当たっていれば、直近7本の実験の数字が全部やり直しになります。4日間これを最優先の宿題に置いて、今日決着しました。疑いは晴れました。そして回収率は1ミリも動きませんでした。
何を疑われたのか
この検証では、各馬に「妙味度」のようなスコアを付け、その値が高い上位ごく一部だけを買うという形で買い目を絞っています。問題は、その「上位ごく一部」の線をどう引いていたかでした。
4年分のデータ全部から分位点を取って、線にしていました。
これがなぜまずいのか。仮に2021年1月1日にこの戦略を動かし始めたとして、その日にこの線の値は計算できません。 2024年のデータがまだ存在しないからです。過去に遡って「あのとき買っていたらこうなった」と計算するときだけ使える値を、当時の判断に使ってしまっている。これを先読み(look-ahead bias)と呼びます。
怖いのは、これが静かに効くことです。エラーも警告も出ません。数字がほんの少し良くなるだけで、その分だけ実戦では出ません。
そして影響範囲が広い。この線の上に、直近7本の実験が乗っていました。
4日間、宿題のまま置いた
正直に書くと、この宿題は4日間ほぼ手つかずでした。着手できなかった日は「今日は着手していません」と毎回明記して次に送りました。着手していないことを書かないと、宿題は静かに消えます。
理由は、これが「直せば済む」話ではなかったからです。直し方は簡単で、その日までのデータだけで線を引き直せばいい。難しいのは「直した結果、過去の実験の結論が変わるのか」を測ることのほうでした。
測る前に固定したこと
結果を見てから条件を足すのが、この検証でいちばん繰り返している失敗です。だから今回も、測る前に紙に書いてから実行しました。
| 母集団 | 直近の実験と同一。変えない |
| 買い目の作り方 | 変えない。変えるのは「線の引き方」だけ |
| 一次指標 | 買い目の絶対回収率(リフトではない) |
| 区間 | レース単位のクラスタブートストラップ2,000回 |
| 判定 | 現行と修正版の「差」の95%区間が0を跨がなければ実害あり。跨げば帳簿上の傷 |
比べたのは3案です。
- A: 現行(4年全部から線を引く=先読みあり)
- B: 拡大窓(その日までのデータだけで線を引き直す=初日から使える)
- C: 初年の線を定数として固定(いちばん保守的)
土俵をそろえる — ここが今回いちばん効いた
B と C は、線を引くために最初の1年を助走に使います。 つまり評価できるのは2年目以降の3年間だけです。
ここで A を「4年ぶん」のまま比べると、差が『線の引き方』のせいなのか『期間が違う』せいなのか、分からなくなります。
なので A も同じ3年間に揃えて測り直しました。 手間は増えますが、これをやらないと出た差が何の差か言えません。比較する2案で使えるデータ量が違うときは、良いほうを悪いほうに合わせるしかありません。
正しい量を測っている確証
もう1つ、地味ですが大事な確認をしました。現行の線の値を再計算して、設計文書に記録されている値と一致するかを見ています。一致しました。
これがないと、「何かを測ったが、疑われている当のものだったかは分からない」という結果になりかねません。疑いを検証するときは、疑われている対象を掴んでいる証拠を先に出す。
結果
まず母集団の生の件数から。比率の前に件数を見る、というのはこの検証の作法です。
分析の母集団 13,822 レース
条件を満たす分 12,547 レース(残存 90.8%)
助走に使う1年目 3,375 レース
評価する3年間 9,172 レース
そのうえで3案。
買い目 回収率 95%区間
A 現行(先読みあり) 657 97.9% 90.5〜105.9%
B 拡大窓(初日から可) 728 96.7% 89.8〜104.1%
C 初年の線で固定 800 95.9% 89.3〜103.1%
【差】(同じ再標本から取得)
B − A −1.2pt [−3.2〜+0.8pt] 0を跨ぐ
C − A −2.0pt [−4.8〜+0.8pt] 0を跨ぐ
事前に決めた基準に照らして、先読みは実在するが、実害は無いという判定になりました。
「決着せず」ではありません
ここは区別しておきたいところです。水準の区間は ±8pt とかなり広いので、「回収率が97.9%です」とは言えません。それでも差の区間は ±3pt に収まっています。
理由は、A と B を同じ再標本から測っているからです。同じレースを引いたセットで両方を計算して、その場で引き算する。すると全体が良い年・悪い年の揺れが両方に同じように効くので、差からは消えます。
だから今回は「よく分からなかった」ではなく、「3ptを超える実害は無いと積極的に言える」という結論です。
なぜ動かなかったのか
理由を調べたら、拍子抜けするほど単純でした。
線の値が、年をまたいでもほとんど動いていませんでした。 4年を通しての振れ幅は、中央値に対して±4%程度です。
線がその範囲でしか動かないなら、「いつ推定しても、だいたい同じ場所に落ちる」ということになります。つまり——
先読みで得られる情報が、そもそもほとんど無かった。
買い目の重なりを見ても同じでした。A と B が買った馬の一致度(Jaccard係数)は 0.90。8〜9割は同じ馬を買っています。
直しても、壁は越えませんでした
ここが今回いちばん書いておきたい部分です。
3案とも回収率は100%未満です。(97.9% / 96.7% / 95.9%)
この宿題は「97.9%という数字は先読みが作った幻ではないか」という疑いへの答えでした。答えは『幻ではない』。 そして同時に、幻でなかったところで100%には届いていないことも確定しました。
疑いを晴らす作業と、儲かる作業は、別物です。
両方必要です。疑いを晴らさないと、その上に積んだ数字を信じられません。でも晴らしたからといって、1円も増えません。 4日かけた宿題の見返りは「安心して先に進める」であって、「回収率が上がる」ではありませんでした。
自分の作業がどちらなのかは、着手する前に自覚しておいたほうがいいと思いました。混ぜると、地固めをしながら前進した気分になります。
採ってはいけない誘惑(感度曲線)
ついでに、線を色々な高さに動かしたときの回収率も出しました。
線を厳しくするほど、回収率は上がりました。 最も厳しい行では112%を超えています。100%を超えた数字が目の前に出てきたわけです。
採りませんでした。理由は3つです。
- その行の区間の下限が100%を割っています。 この検証の作法は「区間の下限が対照を上回らない限りエッジと呼ばない」です。格子のどの行も、下限は100%を超えていません。
- 格子を見てから1行を選ぶのは、事後選択です。 「結果を見た後に条件を足さない」——この検証では、この形で有望な数字が5回消えています。
- 上がったり下がったりしている帯があります。 単調に見えるのは最も厳しい側だけで、そこは買い目が657点→177点まで落ちています。n が減れば区間は広がり、たまたま良い数字は出やすくなります。
「線を上げると回収率が上がる」は、別の実験で既に見えている向きでもあります。新しい情報ではありませんでした。
正直に書いておく弱点を2つ
1つめ。7本の実験への波及は、推論であって測定ではありません。
買い目の8〜9割が同じで、回収率の差が±3pt以内なら、その買い目を土台にして測った各技の効果も同程度しか動かないはずです。ただし技ごとに測り直してはいません。 個別の技の順位が入れ替わらない保証はしていません。ここを「測った」と書くと、次に読む人が確認済みだと思ってしまいます。
2つめ。今回の測定は、再実行できるスクリプトの形で残せませんでした。(実行環境の制約です)。数字は出ましたが、誰かが検算しようとしたら、手順を読んでコードを書き直す必要があります。 結論を記録に残すときは、この点も一緒に書きました。「決着」とだけ書かれた行を読んだ人が、検算できないことに気付かないのがいちばんまずいからです。
今回の要点
- 先読みは「あるか」より「効くか」を測る。 構造として存在することと、結果を動かすことは別です。
- 「実害あり」の定義を、測る前に決める。 決めておかないと、出た数字を見てから「これは小さいから大丈夫」と言うことになります。
- 比較する2案で使えるデータ量が違うなら、良いほうを悪いほうに合わせる。 揃えないと、出た差が何の差か言えません。
- 差を見たいなら、同じ再標本から差を取る。 水準の区間が広くても、差の区間は狭くできます。
- 疑いを晴らす作業は、儲かる作業ではありません。 どちらも要りますが、混同すると前進した気分だけが残ります。
4日間の宿題が終わって分かったのは、疑われていた場所には何も無かったということでした。壁は、最初からずっと同じ場所にあります。
この記事は個人の検証記録です。投資助言でも馬券の推奨でもありません。過去のデータに対する分析結果であり、将来の成績を保証するものではありません。
壁の場所は分かった。さて、別の店を探すとしよう。


