競艇の締切前オッズからは「市場が考えている勝率(市場確率)」を計算できます。自作のLightGBMモデルをこの市場確率と比べると、筆者のデータではモデルがわずかに正確(logloss 1.2255 対 1.2747)でした。ただし、精度が高いことと儲かることは別問題です。
この記事では、シリーズ第3回として、LightGBMによる1着確率の予測、市場確率とのブレンド、オッズの保守的な割引と期待値ゲート、少数件の高ROI戦略を採用しない判断、事前登録した採用基準をまとめます。
この記事の結論
- LightGBMで各艇の1着確率を出す。同じレース6艇内の相対値(平均との差・順位)を特徴量に加える。
- 1号艇が圧倒的に有利なため、確率の校正は枠ごとに行う。
- モデルと市場の確率を50:50でブレンドし、市場が成立しない(有効オッズ5艇未満)ときはモデルだけを使う。
- 締切前オッズは締切までに下がりやすいので、不利側に割り引いてから期待値を計算する。
- 52件でROI +46.0%の条件は、試行回数と件数を考えて採用しなかった。
- 前方評価の採用基準(200件以上・95%信頼区間下限 > 0・前半ROIもプラス)を事前に登録した。
モデル設計:6艇の中での相対的な強さを見る
入力は、選手の過去成績、モーターとボートの成績、展示の情報、枠や会場の条件です。それぞれの値に加えて、同じレースの6艇の平均との差や、6艇の中での順位を特徴量にしました。強い選手でも、同じレースに自分より強い選手がいれば勝ちにくいためです。
枠別の確率校正と保存物
- 1号艇〜6号艇でもともとの勝ちやすさがまったく違うため、校正は枠ごとに分ける(isotonic校正)。
- 保存時は分類器だけでなく、校正器・特徴量一覧・カテゴリの対応表・戦略パラメータをまとめて保存し、推論時の前処理のずれを防ぐ。
モデルと市場の精度比較(T4ライブデータ)
| logloss(小さいほど良い) | 1番手の的中率 | |
|---|---|---|
| モデル単独 | 1.2255 | 57.8% |
| 市場単独 | 1.2747 | 55.6% |
loglossは、外れたときにどれだけ自信過剰な確率を付けていたかも罰する指標です。どちらの指標でもモデルがわずかに上回りましたが、データがまだ少ないため確定的な結論ではありません。
また、1番手の的中率が高くても、低オッズの艇ばかり選べば回収率は伸びません。精度の表と収支の表は分けて見ています。
モデル確率と市場確率をブレンドする
# 概念例: 市場が成立する場合だけ50:50で確率を混ぜる
p = 0.5 * prob_win_cal + 0.5 * market_probability
if market_frames < 5:
p = prob_win_cal # 市場が成立しないときは、明示的にモデルだけを使う
どちらの確率を使ったかも台帳に記録します。
期待値の計算:オッズを不利側に割り引く
中心の戦略 current_blend_liveEV では、ブレンド確率と締切前オッズから期待値を計算します。4分前のオッズは締切までに動き、人気が集まる艇ほど下がりやすいため、オッズ水準ごとのずれやすさを調べ、少し不利になる前提で割り引いてから期待値を出します。確定オッズを予測に使うのではなく、買う直前の判断を現実に近づけるための補正です。
# 概念例
p_blend = blend(model_probability, market_probability)
odds_safe = live_odds * (1.0 - slippage_buffer)
ev = p_blend * odds_safe
if market_ready and minutes_to_close >= 2 and ev >= 1.0:
record_decision("candidate", p_blend=p_blend, ev=ev, stake=0)
else:
record_decision("skip", reason=gate_reason, stake=0)
固定している戦略パラメータ
| 項目 | 値 |
|---|---|
| 推定期待値の候補基準 | 1.30 |
| ライブ期待値の基準 | 1.25 |
| ブレンドの重み | 0.50 |
| 有効なオッズ | 5艇以上 |
| 判断の余裕 | 1分以上 |
| 1ベット / 1レース上限 / 1日上限 | 100円 / 500円 / 5,000円 |
| ストップロス | 1日の損失3,000円で停止 |
stake=0 は計算漏れではなく、検証用のペーパー候補であることを示しています。
52件でROI +46.0%の条件を採用しなかった理由
gate_buffer_160 という条件は、過去のT4データでROI +46.0%でした。しかし次の理由で現行戦略には昇格させず、記録として残すだけにしました。
- 件数が52件しかなく、運だけでも出うる数字である
- 多数の条件を試した後で「一番良かったもの」として見つけた値である
条件比較で固定するもの
オッズを観測する時点、オッズの割引、券種、100円固定、1日の上限、評価期間を固定し、変えるのは1つずつにします。変えた値は戦略IDに含めます。testを見ながら期待値の基準だけを動かすと、改善ではなくtest期間への当てはめになります。
評価の分け方と事前登録した採用基準
データは、直近12か月をtest、その前の12か月をvalidation、それ以前をtrainに分けています。これから先のレースで記録する前方評価では、採用基準を事前に決めて登録しました。
- 精算済みの件数が200件以上
- ブートストラップで求めた95%信頼区間の下限が0より大きい
- 期間を前半と後半に分けたとき、前半のROIもプラス
1つでも満たさない限り、候補は stake=0 のままです。
まとめ
- 競艇AIは「6艇内の相対的な強さ」と「枠別の校正」が重要。
- 市場確率は比較対象であると同時に、ブレンドの材料にもなる。
- 締切前オッズは不利側に割り引いて期待値を計算する。
- 少数件・多重比較で見つけた高ROIは採用しない。採用基準は先に決める。
- 確率モデル・オッズ補正・候補判定・精算を別部品にすると、補正だけを変えて比較できる。
次回は、過去データでの結果と直近の前方評価を並べ、なぜ今は採用しないのかを解説します。
注意:本記事は個人開発・データ分析の記録です。的中や利益を保証するものではなく、舟券の購入を勧めるものでもありません。