BoatraceCSV

スリット隊形からの展開予想(検証結果と結論)

「ボートレースはスリット(スタート通過時の前後関係)で展開と結果が決まる」という 定説を、data/results/realtime/ の実測 スタートタイミング(ST) で定量検証した記録。 本書は検討ドキュメント(pre-design)であり、確定仕様ではない。


1. スリットの作り方

Nコース_スタートタイミング は大時計 0 秒からの遅れ秒。スタート艇速を 約 50km/h = 13.9 m/s とすると ST 差 0.01 秒 ≒ 0.14 m、艇長 3m の 1 艇身差 ≒ ST 差 0.216 秒、半艇身 ≒ 0.108 秒。

レース内平均 ST を基準にした前出量(m)を各コースの スリット位置 とする。

lead[c] = (mean(ST) - ST[c]) * 13.9     # 正 = 平均より前
gap_in[c] = lead[c] - lead[c-1]         # 正 = 内隣艇より前 (= まくり圏)
in_margin = lead[1] - max(lead[2..6])   # 正 = 1コースがスリット先頭
spread    = (max(ST) - min(ST)) * 13.9  # スリットの縦の伸び

2. 結論(先に要点)

  1. 定説は正しい。スリットは結果を強く規定する。 実測 ST から作ったスリットだけで 1 着コースの log loss が 1.342 → 1.182(コース事前確率のみのベースライン比 -11.9%)、 1 着的中率 55.1% → 58.3%。既存の 強さpt に足すと log loss -0.143 と、 このリポジトリの他のどの特徴量よりも大きい。
  2. しかしスリットは事前に予測できない。 締切前に手に入る ST は 全国平均ST(実測との相関 0.21〜0.25)と スタート展示ST(相関 0.05)しかなく、 これで組んだスリットは実測スリットの利得の 12% しか回収できない。
  3. 必要精度は現実的でない。 スリット利得の 75% を取るには ST 予測の MAE ≦ 0.016 秒(現行 0.053 秒)が必要。実測 ST のレース内ばらつきは 標準偏差 0.07 秒で、その大半は当日の勝負駆けに由来する不可約ノイズ。
  4. よって「スリットを 1 本当てて展開を読む」路線は投資対効果が低い。 代わりに 確率的スリット(ST 分布からのサンプリング)で展開シナリオの 確率を出す方が、同じ情報量で誠実かつ UI 価値が高い(§6)。

3. スリット隊形と結果(実測)

3.1 隊形パターン別(41,776 レース)

in_margin と先行勢の位置で 6 分類したもの。定説どおりの傾向がきれいに出る。

隊形 占有 逃げ まくり系 差し 1着=1C 2C 3C 4C 5-6C
ほぼ揃い (±0.6m) 56.7% 64.0% 17.8% 11.7% 66.4% 11.6% 10.2% 6.4% 5.4%
イン半艇身遅れ / センター先行 17.9% 36.1% 40.7% 15.2% 39.0% 16.8% 18.3% 18.6% 7.3%
イン半艇身遅れ / 外(5-6)先行 12.5% 45.6% 36.5% 10.6% 48.1% 11.4% 13.0% 10.5% 17.0%
イン明確先手 (+0.6m 以上) 5.4% 71.9% 12.1% 7.8% 73.2% 9.2% 8.5% 5.0% 4.0%
イン大幅遅れ / 外(5-6)先行 3.9% 18.9% 64.0% 10.1% 20.9% 17.3% 17.1% 20.2% 24.6%
イン大幅遅れ / センター先行 3.7% 8.0% 70.9% 13.1% 9.5% 26.5% 24.8% 29.0% 10.2%

「イン大幅遅れ / センター先行」では 1 コースの勝率が 9.5%(全体 55.7% → 1/6 以下)まで落ち、 まくり系決着が 71%。逆に「イン明確先手」なら逃げ 72%。スリットは決着を実質的に決めている。

3.2 イン先手量の連続的な効き方

in_margin(1 コースが 2〜6 コース最先行艇より前に出ている量, m):

in_margin n 1着=1C 逃げ まくり系
< -3.0m (1 艇身以上遅れ) 389 3.1% 2.6% 83.8%
-3.0 〜 -2.0m 1,616 14.1% 12.1% 69.3%
-2.0 〜 -1.25m 5,534 30.5% 28.1% 50.3%
-1.25 〜 -0.6m 8,314 47.9% 45.1% 34.2%
-0.6 〜 0m 15,443 63.1% 60.5% 20.3%
0 〜 +0.6m 8,231 72.7% 70.5% 13.1%
+0.6m 以上 2,249 73.4% 72.0% 12.1%

1.2m(≒ ST 差 0.09 秒)の遅れで 1 コースの勝率が半分になる。一方 +0.6m を超えると 飽和する(それ以上前に出ても勝率は伸びない)。非対称なので線形特徴量では表現できない。

3.3 外側艇: 内隣艇に対する前出量別の 1 着率

gap_in 2C 3C 4C 5C 6C
< -1.25m 4.4% 3.2% 2.8% 2.5% 0.4%
-0.6 〜 -0.2m 9.6% 8.1% 5.1% 4.2% 1.3%
-0.2 〜 +0.2m 12.0% 10.9% 6.6% 5.0% 1.0%
+0.6 〜 +1.25m 25.4% 19.9% 21.7% 10.5% 4.9%
+1.25m 以上 44.5% 31.5% 37.9% 21.5% 13.5%

内隣を 1.25m 以上突き放せば、どのコースでも 1 着率が 3〜10 倍になる。 4 コース(カド)は 3 コースより伸びが大きく、カド受けの構造がそのまま出ている。

3.4 スリット幅

spread n 1着=1C 逃げ まくり系
〜1.0m 8,952 65.3% 62.6% 18.0%
1.0〜1.5m 10,124 58.6% 56.3% 24.3%
1.5〜2.0m 10,653 53.2% 50.7% 30.2%
2.0〜3.0m 8,784 49.3% 47.1% 34.6%
3.0m 〜 3,262 46.1% 43.7% 38.0%

締まったスリットほどインが残る、というのも定説どおり。


4. 予測モデルでの説明力

目的変数 = 1 着コース(6 クラス)。時系列 split(前 80% 学習 / 後 20% 検証)、 HistGradientBoosting。特徴量はすべて §1 のスリット量。

特徴量 log loss 1着的中率
コース事前確率のみ(ベースライン) 1.3423 55.1%
全国平均ST から組んだスリット 1.2805 55.2%
スタート展示ST から組んだスリット 1.3373 55.1%
全国平均 + 展示 1.2806 55.2%
実測ST から組んだスリット(上限) 1.1703 58.7%

4.1 既存指標への上積み(v1_basic 強さpt と結合できた 14,736 レース)

特徴量 log loss 1着的中率 強さpt比
コース事前確率のみ 1.3481 54.7% +0.076
強さpt(既存 v1_basic) 1.2725 55.1% —
強さpt + 全国平均STスリット 1.2550 55.1% -0.018
強さpt + 展示STスリット 1.2727 55.1% +0.000
強さpt + 実測STスリット(上限) 1.1291 59.7% -0.143

事前に取れるスリット情報は、上限利得 0.143 のうち 0.018(12%)しか回収できていない。 残り 88% は「レース当日にどうスタートが揃うか」という、締切前には存在しない情報。


5. なぜ事前に組めないか

5.1 スタート展示ST は本番 ST をほぼ予測しない

コース corr(展示, 実測) MAE(展示) corr(全国平均, 実測) MAE(全国平均)
1 0.048 0.114 0.209 0.053
2 0.049 0.116 0.233 0.051
3 0.027 0.117 0.211 0.052
4 0.053 0.119 0.250 0.053
5 0.015 0.127 0.237 0.054
6 0.059 0.136 0.216 0.060

展示 ST の平均は 0.074 秒、本番は 0.158 秒(展示は約 0.08 秒早い)。水準がずれるだけでなく 相関そのものが 0.05 しかない。進入コースが展示と本番で一致するレース(81.5%)に 絞っても変わらない。展示 ST は「その日の勘」の 1 サンプルに過ぎず、本番の攻め方とは別物。

これは st_estimation.md §1.2 の課題 3(展示 ST 未使用)への回答でもある。 展示 ST を予測 ST に直接混ぜても効果は期待できない。使うなら「展示で大出遅れ = 機力/整備トラブル」のような外れ値検知に限る。

スリット隊形としての再現度:

予測元 スリット順位 Spearman スリット先頭コース的中率
スタート展示ST 0.082 21.2%
全国平均ST 0.244 28.9%
(参考) AI 推定 ST の目標値 0.296 —

先頭コースすら 7 割外す。§3 の表は「隊形が分かっていれば」の話であって、 分からないうちは使えない。

5.2 必要な ST 予測精度の逆算

実測 ST に正規ノイズ N(0, σ) を乗せた「疑似予測 ST」でスリットを組み直し、 利得がどこまで残るかを測ったもの(利得率 = 実測スリット利得を 100% とした割合)。

σ ST の MAE 順位 Spearman 先頭的中 log loss 利得率
0.000 0.000 1.000 100% 1.1823 100%
0.010 0.008 0.914 79.9% 1.1898 95%
0.015 0.012 0.868 73.3% 1.2059 85%
0.020 0.016 0.817 67.5% 1.2230 75%
0.030 0.024 0.726 57.3% 1.2366 66%
0.040 0.032 0.636 49.1% 1.2643 49%
0.060 0.048 0.509 40.5% 1.2912 32%
0.100 0.080 0.354 31.6% 1.3182 15%

利得の 75% を取るには MAE 0.016 秒が必要。現行は 0.053 秒。3 倍以上の改善が要る。 実測 ST のコース内標準偏差は 0.070 秒なので、MAE 0.016 は分散の 95% を説明することに等しい。 選手が当日どこまで踏み込むかは事前情報に存在しないため、この水準は原理的に届かない。

注意: この表は疑似予測 ST に「選手の腕」情報が残らないため、実在する予測子との 単純比較はできない。全国平均 ST の実測利得 0.062(§4)は Spearman 0.244 の 隊形再現力ではなく、大半が「相対的な ST 巧拙 = 選手の腕」の寄与である。 隊形そのものの寄与は表が示すとおりもっと小さい。


6. 実装するとしたらどうするか(推奨)

点推定のスリットを 1 本描いて展開を断定する路線は取らない。代わりに:

6.1 確率的スリット(モンテカルロ展開シミュレーション)

実装計画は slit_sim_plan.md。 素朴に「推定 ST + 選手の ST 標準偏差」でサンプリングすると隊形が散らばりすぎて 校正が壊れる(ST 分散の 56% はレース共通ショックで、隊形には効かない)。 落とし穴は同計画の §0 にまとめてある。

Racer ST の推定 ST に分散を持たせ(選手 × コース別の ST 標準偏差、現状の点推定に対する追加パラメータ)、1 レースあたり N 本の ST ベクトルを サンプリング。各サンプルを §3.1 の隊形テーブルに当てて集計する。

出力例(数値は所与のイメージ):

イン先手率      42%     逃げ         51%
ほぼ揃い        38%     まくり系     28%
イン遅れ        20%     差し         13%

6.2 やらないほうがよいこと

6.3 副産物として使えるもの

§3 の条件付きテーブルは、レース後の振り返りでは即使える:


7. 再現方法

検証スクリプトは本リポジトリには未収録(使い捨て)。再現手順:

  1. data/results/realtime/*/*/*.csv を全件連結し、Nコース_スタートタイミング / Nコース_艇番 / 1着_艇番 / 決まり手 を取り出す
  2. §1 の式でスリット量を作る
  3. data/previews/stt/(展示 ST)、data/programs/race_cards/(全国平均 ST)、 data/estimate/v1_basic/(強さpt)を レースコード で結合。 全国平均 ST と 強さpt は艇番順なので Nコース_艇番 で進入コース順に並べ替える
  4. 目的変数 = 1 着コース、時系列 split で HistGradientBoostingClassifier

前処理の注意: