競馬編
競馬でよく起きる失敗
データリーク、時系列を無視した分割、条件を絞りすぎたときの見かけ倒し。「バックテストだけ異常に良い」の正体。
この記事の要点
- バックテストだけ異常に良いときは、たいてい未来の情報が混ざっています(データリーク)。
- 条件を細かく絞るほど数字はきれいになりますが、それは実力ではなく偶然を選んでいるだけかもしれません。
- 疑うべきなのは、うまくいかないときより「うまくいきすぎたとき」です。
1. データリーク(未来の情報の混入)
競馬データは、レース前に分かる列と後で確定する列が同じ行に並んでいるため、 リークがとにかく起きやすい構造です。
| 混入しやすいもの | なぜ問題か |
|---|---|
| 今回の走破タイム・上がり 3 ハロン・通過順位 | 走った後にしか分からない。答えそのもの |
| 確定オッズ・確定人気・払戻金 | 締切後に確定する。買う時点では使えない |
| 全期間で集計した騎手・厩舎の成績 | 予測対象のレースの結果が集計に含まれている |
| 後から付けられた区分(レース回顧の評価など) | 結果を知ったうえで人が付けた情報 |
見分け方はひとつです。列ごとに 「発走の直前に、この値を手に入れられるか」を問うてください。 答えが「いいえ」なら、その列は使えません。
2. 時系列を無視した分割
データをシャッフルして 8:2 に分ける ── 一般的な手順ですが、 競馬ではやってはいけません。 未来のレースで学習して過去を当てることになり、実運用の順序を再現できません。 出てくる成績は、多くの場合ほんとうの実力より良く見えます。
正しくは「◯年までで学習、それ以降で検証」と時間で切ることです。 同じ理由で、学習期間より前のレースを検証に使うのも避けます。
3. 条件を絞りすぎた「見かけ倒し」
「特定の競馬場の、特定の距離の、特定の枠順で、この条件を満たす馬」── 絞り込むほど、回収率の数字はいくらでも良くできます。 しかし対象レースが数十件しか残っていないなら、 それは偶然を選び出しただけである可能性が高くなります。
目安として、対象件数と、条件を何通り試したかを必ず記録してください。絞り込みの数だけ、当たりくじを引く試行回数が増えていると考えると分かりやすくなります (多重比較)。
4. 後知恵で条件を決める
結果を知っている期間のデータを眺めながら条件を組み立てると、 当然その期間には合った条件ができます。条件を決めた後のデータで確認するまでは、 それは仮説にすぎません。
検証用に手を付けていない期間を残しておき、 最後に一度だけ試す。この規律が、後知恵から身を守るほぼ唯一の方法です。
5. 古いデータをそのまま信じる
コースの改修、馬場管理の変化、レース体系や規定の改定があれば、 当時の傾向は今と違います。 期間を伸ばすほどデータ量は増えますが、今と違う時代のパターンを混ぜている可能性も上がります。
学習期間は「長ければ良い」ではなく、 検証して決めるべき設定のひとつです (分布シフト)。
6. 精度の改善を、収支の改善と取り違える
AUC が上がった、的中率が上がった ── それ自体は良いことですが、オッズを考えない限り収支の話にはなりません。人気馬をうまく当てる能力が上がっても、 配当が安ければ手元には残らないためです。
チェックリスト
- 使っている列は、すべて発走前に手に入るか
- 集計特徴量は「そのレースより前」だけで作っているか
- 学習と検証は時間で切ってあるか
- その回収率は何レース分の結果か
- 条件は何通り試した末のものか
- 別の期間でも同じ傾向が出るか
- 控除率を織り込んだうえで判断しているか