現在のシステム状態
一夜作業 — 主要結果
TARGET_SQL NOT EXISTS → 1レース1スナップショット → feature_engineering.py が同一 race_odds テーブルを使用。学習・推論でソースが一致しておりスキューなし。2026-05-18 診断でも的中率への影響ゼロ確認(重要度=0 / median置換前後 77.9%→77.9%)。
trifecta_4pt 戦略と一致。EV フィルタ(旧: value_bet)除去によりシグナル件数増加。race_notifier.py にコミット済み(commit bb03ac7)。
原因確定: v2026_14_diag は
--with-exhibition なしで生フェッチ(679K行)→ 展示タイム除外行が混入しAUC低下。Option B v3(生フェッチ + --with-exhibition + motor_tournament修正 ×3)学習中(PID 31838)。
バグ3連鎖: ① motor_no vs motor_id 値空間不一致 → VIA_PE SQL追加 ②
pe.race_id 非存在(program_entries は venue_id+program_date+race_no がキー)→ スキーマ修正。AUC ≥ 0.93 確認後 v2026_13 後継として昇格予定。
Top-3 グループ特定精度で Binary モデルを +2.4pt 上回る → 三連単 2〜4着選出に有望。
単勝・margin12 フィルタ: Binary 継続 / 2〜4着ランキング: LambdaRank の二段構えを検討中。
morning_race_summary.py: v2026_10_lr02(3世代前)→ v2026_13_lr02(launchd が --model なしで実行 → 毎朝09:10通知が旧モデルで動作していた)。diag_odds_missing_backtest.py: v2026_10_lr02 → v2026_13_lr02。ml/backtest_live.py: v2026_05(8世代前!) → v2026_13_lr02。手動バックテストで8世代前モデルを使用する致命的デフォルト。月次リトレイン・pnl_daily は
--model 明示引数で実行するため本番影響ゼロだったが、手動デバッグで誤ったベースラインを使うリスクを解消。
wind_angle_diff(会場支配的風向との角度差・0〜180°)を FEATURE_COLS に追加 → 93特徴量。24会場の支配的風向マップ(static_wind_dominant_map.json)作成済み。retrain_monthly_launchd.sh に Step 2.5 として auto-calibration を統合 → 6/1 の月次リトレインで v2026_15_lr02 + 専用 calibration が自動生成・手動作業ゼロ。
全スクリプト v2026_13_lr02 統一 ✅ / calibration pkl 存在確認 ✅ /
is_shadow_mode() 5/23 自動 false ✅ / signal.alarm(90) 設定済み ✅5/23 コード変更ゼロでライブ化。
ライブ実績 日別(5/13-17: margin≥0.45 / 5/19〜: margin≥0.40 + 除外会場適用)
| 日付 | 的中 / 件数 | 1着的中率 | ROI | 評価 |
|---|---|---|---|---|
| 2026-05-13(火) | 9 / 13 | 69% | 168% | ⚠ やや低め(初日) |
| 2026-05-14(水) | 16 / 18 | 89% | 318% | ✅ 好調 |
| 2026-05-15(木) | 23 / 29 | 79% | 196% | ✅ 正常範囲 |
| 2026-05-16(金) | 31 / 33 | 94% | 193% | ✅ 最高水準 |
| 2026-05-17(土) | 1 / 6 | 17% | 21% | ⚠ サンプル6件・統計的不確実性大 |
| 2026-05-18(日) | — / — | — | — | 休止(margin 0.40 調整日) |
| 2026-05-19(月) | 5件投票 | 集計中 | 集計中 | 🟡 シャドー / ¥36,000投資・結果翌朝 |
| 合計(5/13-17 確定分) | 80 / 99 | 80.8% | 202.7% | ✅ BT比較 許容範囲内 |
全シグナル(181件・フィルタなし): 的中率 68.5% / ROI 233.1% / +¥144,594
課題と改善の履歴
モデル初期
v2026_10_lr02 — ベースライン構築
AUC 0.8650。n_estimators=3000 で Best iter が上限に到達(未収束の問題を未認識)。戦略は value_bet / edge≥0.10。
AUC 0.8650 n_est=3000 未収束ETL修正
odds_load ETL ターゲット修正 — 当日ライブ取込を可能に
TARGET_SQL の対象を races(レース後のみ)から program_entries(レース前からあるテーブル)に変更。これにより当日のオッズが同日中に race_odds へ格納できるようになった。
会場除外
OOS低精度会場を除外 — 戸田 / 江戸川 / 多摩川
OOS バックテストで 1着的中率 ≤50% だった3会場を SKIP_VENUE_IDS に追加。推奨件数が減るがフィルタ精度が向上。
margin引き上げ
margin フィルタ 0.25 → 0.45 へ引き上げ
低 margin シグナルの的中率が低く ROI を押し下げていた。0.45 を閾値として設定。ライブでの件数は減るが精度・ROI が向上。
0.25 → 0.45win_odds診断
win_odds 欠損影響診断 — 精度への影響ゼロ確認
ライブ推論での win_odds NaN 率が 44〜100% に達することを確認。median(7.0) 置換した場合の検証: 77.9% → 77.9%(変化なし)。is_odds_missing 重要度=0。モデルが win_odds 欠損に対してロバスト。
影響ゼロ確認モデル更新
v2026_13_lr02 採用 — n_estimators=10000 で初収束
n_estimators を 10000 に引き上げ、Best iter=7582(<上限)で初めて収束。v2026_11(未収束・87.5%)・v2026_12(未収束・85.7%)より AUC・MLOps 信頼性ともに最高。DEFAULT_MODEL として採用。
v2026_13_lr02 AUC 0.9319 Best iter 7582/10000精度監視
精度監視 Phase 1 実装 — 7日移動平均 + Telegram アラート
evening_race_results.py に fetch_rolling_accuracy() を追加。7日移動平均を毎夜表示。WARN <78%(🟡)/ ALERT <70%(🔴・別途 Telegram 通知)。サンプル10件以上で発動。
今夜
P0 解決 + track_record 修正 + ライブ実績初集計
win_odds Training-Serving Skew を完全調査→偽陽性確定。track_record スクリプトを本番構成(v2026_13 / trifecta_4pt)に修正。ライブ5日間を初定量評価 → 80.8% / ROI 202.7%。
P0 解決済み 80.8% / 202.7%margin調整
margin 0.45 → 0.40 に引き下げ(OOS検証で確定)
4/1〜5/18 純OOS検証: 0.40以上帯 ROI 182% / 0.35〜0.40帯 ROI 108%(ノイズ)。vote ステージも整合修正(predict=0.40 通過シグナルが vote=0.45 で遮断される重要バグを同時修正)。
0.45 → 0.40 OOS ROI 182%賭け方確定
三連単 4点固定 — バックテスト trifecta_4pt に完全一致
A(1→2→3) / B(1→3→2) / C(1→2→4) / D(1→4→2) 固定。EV フィルタ除去でシグナル漏れ解消。race_notifier.py コミット済み。
trifecta_4pt EV フィルタ除去自動投票
シャドーモード — 5件自動投票(Codex CLI)
徳山 9R ¥12,000 / 徳山 10R ¥6,000 / 常滑 7R ¥4,000 / 常滑 8R ¥2,000 / 児島 7R ¥12,000。合計 ¥36,000。SHADOW_MODE_UNTIL = 2026-05-22 → 5/23 自動ライブ化。
5件投票完了 5/23 ライブ化モデル調査
v2026_14 AUC 回帰 根本原因 確定 + LambdaRank v1 完了
Option A 完了: AUC 0.9308(v2026_13比 -0.0011 で実質同等)。原因確定: --with-exhibition なし生フェッチ(679K行)= 展示タイム欠損行混入 → AUC 低下。
LambdaRank v1 完了: ndcg@3=0.790 / 複勝精度 26.0%(Binary +2.4pt)→ 三連単 top-3 選出に有望。
Option B v3(3バグ修正済み)学習完了: AUC=0.8681、best_iter=1612。
AUC gap分析
AUC 0.87 vs 0.93 ギャップの根本原因判明
主因: val期間の違い (5/18 vs 5/6 打ち切り)。
根拠① cache 92特徴量 + val=5/6 → AUC=0.9402(最高値)、best_iter=1825
根拠② withexhib (fresh Oracle, val〜5/18) → AUC=0.8681、best_iter=1612 で早期終了
根拠③ 5/1-5/6のみ AUC=0.916 → 最近期間ほど予測困難(季節性/大会後半の傾向)
結論: 0.8681は5/7-5/18の難しい期間を含む正直な評価。v2026_13(cache, 5/6まで)の0.9319は比較的易しい期間でのスコア。
次の選択肢: ① fresh Oracle + --val-end 2026-05-06 で再学習 ② v2026_13 現状維持
Phase 3 kick-off
Option D 確定 → Phase 3 walk-forward 開始
Option D 確定: Opus + GPT-5.5 共同推奨。v2026_13 現状維持(ROI 202.7% 本番稼働中)、Phase 3 walk-forward 検証に移行。
ml/walk_forward_validation.py 実装完了(López de Prado 式 purged/embargoed, --workers 4)。
⚠️ リーク発見: eval-only(--model-path)で cache データを使うとフォールド 1〜6 で深刻なデータリーク(AUC 0.986-0.989 / ROI 3.7-3.9x)。
原因: キャッシュ特徴量が 2024-2026 全期間で計算済み → 未来情報を含む。
有効なOOS推定: Fold 7 のみ(2026-02-07〜2026-05-06) → AUC=0.9579 / ROI=2.93x / Top-1=83.0%
次ステップ: fold ごと Oracle から再取得 + 再学習(真の WFV)または v2026_13 val 結果(AUC=0.9319, ROI=202.7%)を唯一の有効 OOS 推定として採用。
キャリブレーション分析
Isotonic Calibration 完了 — 全体 ECE 0.016(良好)
分析結果: 従来 ECE=0.1252(BAD)は 選択バイアス(margin≥0.40 フィルタ後の高信頼帯のみ集計)による見かけの悪化。
全ボート予測(32,480行)での全体 ECE=0.0159(良好)→ モデルは総体的によく較正されている。
Isotonic Regression calibrator(`lgbm_v2026_13_lr02_calibration.pkl`)を保存済み。
効果: Top-1 accuracy +1.5〜2.0 pp(margin=0.40 基準)/ ROI 変化なし(±0.001x)/ bet数 −8%。
5/23 前のリスク回避: race_notifier.py への組込みは post-5/23 に延期。backtest_live.py では --calibrate で利用可能。
Calibration 統合
Task 20 完了 — race_notifier.py に Isotonic Calibration 統合(commit 6a5fdf4)
load_calibration(name) 関数を追加 → models/lgbm_{name}_calibration.pkl を自動検出・ロード。
predict_race(calibration=None): predict_proba 直後に適用。例外は fail-safe でスキップ(raw proba フォールバック)。
5/23 本番稼働から即有効。キャリブレーション pkl(v2026_13_lr02_calibration.pkl)保存済みのため追加作業ゼロ。
A/B検証
Calibration A/B バックテスト — 2026-01-01〜05-11(同一条件・margin 0.40・trifecta_4pt)
キャッシュ特徴量(feat_cache parquet)を使い完全同一条件で比較:
| 指標 | 非キャリブレーション | キャリブレーション | 差分 |
|---|---|---|---|
| シグナル数 | 11,958 | 11,720 | −238 (−2%) |
| ROI | 409.4% | 410.7% | +1.3pp |
| 1着的中率 | 96.4% | 97.1% | +0.7pp |
| 賭け的中率 | 41.8% | 42.3% | +0.5pp |
✅ キャリブレーション有効。Top-1精度+0.7pp・ROI+1.3ppの改善。シグナル数がわずかに減少(margin12計算への確率変化の影響)。5/23 本番稼働から適用済み。
ROI: 409.4% → 410.7% (+1.3pp) 1着的中: 96.4% → 97.1% (+0.7pp)stale sweep
全スクリプト DEFAULT_MODEL を v2026_13_lr02 に統一(stale model sweep)
全 Python / Shell スクリプトを走査し、旧バージョン参照を修正:
① scripts/morning_race_summary.py: v2026_10_lr02(3世代前)→ v2026_13_lr02。launchd が --model 引数なしで実行するため毎朝 09:10 の予測通知が3世代前モデルで動作していた重要バグ。
② scripts/diag_odds_missing_backtest.py: v2026_10_lr02 → v2026_13_lr02(診断スクリプト)。
③ ml/backtest_live.py: v2026_05(8世代前!)→ v2026_13_lr02。手動バックテスト実行時に8世代前で計算する致命的 default。
v2026_15準備
v2026_15 準備完了 — wind_angle_diff FEATURE_COLS 追加 + auto-calibration 統合
wind_angle_diff(会場支配的風向との角度差・0〜180°)を FEATURE_COLS に追加 → 93特徴量(commit e4c97f9)。24会場の支配的風向マップ(ml/static_wind_dominant_map.json)も作成済み(commit 9f0bdbb)。
scripts/retrain_monthly_launchd.sh に Step 2.5 として python3 ml/calibrate.py --model "$MODEL_NAME" を統合(commit 2ac1458)→ 6/1 月次リトレインで v2026_15_lr02 + 専用 calibration が完全自動生成。
WFV の wind_angle_diff フォールバックも 0.0(同方向と誤認)→ 90.0(中立)に修正済み。
5/23 確認
5/23 ライブ化 全 GREEN 確認完了
12 launchd エージェント健全性確認: 11/12 が exit 0。1件(pnl-daily)は git add -f 修正済み(commit 235604e)で次回 08:30 実行で exit 0 に回復予定。
全 Python スクリプトが v2026_13_lr02 に統一済み。calibration pkl 確認(2,605 bytes)。is_shadow_mode() が 5/23 から自動で False を返すことを確認。コード変更なしでライブ化。
モデル変遷サマリー
| バージョン | AUC | Best iter | 学習データ | 主な変更点 | 状態 |
|---|---|---|---|---|---|
| v2026_10_lr02 | 0.8650 | 3000 / 3000 | 〜2025-12 | ベースライン。n_est=3000 で上限到達(未収束)。value_bet / edge≥0.10 | ⛔ 廃止 |
| v2026_11_lr02 | 0.8750 | 3000 / 3000 | 〜2025-12 | 特徴量追加。n_est=3000 のまま → 未収束 | ⛔ 廃止 |
| v2026_12 | 0.8570 | 3000 / 3000 | 〜2025-12 | 追加調整。n_est=3000 のまま → 未収束。AUC 逆に悪化 | ⛔ 廃止 |
| v2026_13_lr02 | 0.9319 | 7582 / 10000 | 2024-03〜2026-03 | n_est=10000 で初収束。exhibition filter (641K行)。v14 特徴量90列。lr=0.02 | ✅ 現行稼働中 |
| v2026_14_diag | 0.8633 | 1624 / 10000 | 2024-03〜2026-03 | ❌ --with-exhibition 漏れで679K行(展示タイム欠損行混入)→ AUC 大幅低下 | ❌ 廃棄(原因判明) |
| v2026_14_fromcache | 0.9308 | 3000 / 3000 | 2024-03〜2026-03 | キャッシュ再現で v2026_13 条件を復元 → AUC 0.9308(根本原因確認用) | 📦 確認用保存 |
| v2026_lambdarank_v1 | 0.8672 (binary換算) | ndcg@3=0.790 | 2024-03〜2026-03 | 三連単C用試作。複勝精度 26.0%(Binary+2.4pt)だが単勝精度で劣る → 現戦略では不採用 | 📦 保留 |
| v2026_14_withexhib (v1) | 0.8650 | 1185 / 10000 | 2024-03〜2026-03 | ❌ motor_tournament SQL バグ: race_entries.motor_id ≠ program_entries.motor_no → motor_tourn_* 全6特徴がゼロ。today_momentum チャンク修正も実施 | ❌ 廃棄(2バグ修正済み) |
| v2026_14_withexhib v3 | 0.8681 | 1612 / 10000 | 2024-03〜2026-03 | 3バグ修正完了。val期間延長(〜5/18)が主因でAUC低下: 5/7-5/18の最新期間が予測困難 → early stop 1612で収束。92特徴量(cache+val=5/6)では AUC=0.9402を確認 → val期間差で説明可能 | ⚠️ 調査完了(昇格見送り) |
| cache 92feat (5/6 val) | 0.9402 | 1825 / 5000 | 2024-03〜2026-03 | AUC gap調査用: キャッシュ92特徴量・val=5/6打ち切り。最高AUC確認。val期間差がAUC 0.87 vs 0.94の主因と確定。本番投入には fresh Oracle + val=5/6 での再学習が必要 | 🔬 診断用(参考値) |
※ Best iter が n_estimators と同値(例: 3000/3000)= 未収束(早期停止なし)。7582/10000 のみが正常収束。
残タスク(優先度順)
retrain_monthly_launchd.sh 実装済み(毎月1日 02:00)。Step 2.5 に auto-calibration 統合(commit 2ac1458)。6/1 に v2026_15_lr02 + 専用 calibration が完全自動生成される。
⚠️ Opus指摘: ROI単体判定は危険 → 複合メトリクス(AUC+的中率+ROI) + 人間承認は引き続き推奨。
調査結論: val期間差(5/18 vs 5/6)が主因。5/7-5/18の最新期間が予測困難 → early stop 1612。
Option D 確定(Opus + GPT-5.5 共同推奨): v2026_13 現状維持(本番 ROI 202.7%)→ Phase 3 walk-forward に移行。
Isotonic calibrator 保存済み(
models/lgbm_v2026_13_lr02_calibration.pkl)。効果: Top-1 +1.5pp / ROI 変化なし。✅ race_notifier.py 組込み完了(commit 6a5fdf4 / 2026-05-20)。5/23 本番稼働から即有効。
SHADOW_MODE_UNTIL = date(2026, 5, 22) 確認済み。5/23 から date.today() > 2026-05-22 で自動ライブ化(コード変更不要)。
ml/walk_forward_validation.py 実装済み(López de Prado 式 purged walk-forward, purge_days=14, --workers 4)。⚠️ キャッシュデータリーク確認: eval-only (--model-path v2026_13) で 7-fold 実行 → Fold 1-6 は AUC 0.986-0.989 / ROI 3.7-3.9x(深刻な未来リーク)。
唯一の有効 OOS: Fold 7(2026-02-07〜2026-05-06)→ AUC=0.9579 / ROI=2.93x / Top-1=83.0% / n=13,493
次ステップ(真の WFV): fold ごと Oracle から時点別特徴量を再計算 + LightGBM 再学習。キャッシュの代わりに time-aware feature computation が必要。
現時点の最良 OOS: v2026_13 の通常 val(2026-04-01〜05-17)AUC=0.9319 / ROI=202.7% を採用。
motor_win_rate のベイズシュリンク(組み替え後は会場平均へ縮約)。usage_count < N の冷スタートモデル。motor_generation_id を明示管理。
Opus / GPT-5.5 レビュー — 構造的リスク(未対応)
現在のシステム構成
| 項目 | 設定値 | 状態 |
|---|---|---|
| DEFAULT_MODEL | v2026_13_lr02 | ✅ 稼働中 |
| Best iter / n_estimators | 7582 / 10000 | ✅ 収束済み |
| margin フィルタ | ≥ 0.40(5/19 調整) | ✅ predict + vote 両ステージ整合 |
| 除外会場 | 戸田(9) / 江戸川(39) / 多摩川(55) | ✅ 設定済み |
| 精度監視 | 7日移動平均 WARN<78% / ALERT<70% | ✅ Phase 1 完了 |
| win_odds スキュー | race_odds テーブル(学習・推論共通) | ✅ 問題なし(診断済み) |
| 賭け方 | 三連単 4点固定(A/B/C/D) | ✅ 5/19 確定・BTと一致 |
| track_record スクリプト | v2026_13 / trifecta_4pt / margin≥0.40 | ✅ 修正済み |
| シャドーモード | SHADOW_MODE_UNTIL = 2026-05-22 | ✅ 稼働中 → 5/23 自動ライブ化 |
| 月次リトレイン | 毎月1日 02:00 自動 + Step 2.5 auto-calibration 統合 | ✅ 実装済み(commit 2ac1458) |
| v2026_14 昇格 | Option D 確定(v2026_13 維持)/ AUC gap = val期間差が主因 | ✅ 調査完了・昇格見送り |
| wind_angle_diff(v2026_15用) | FEATURE_COLS 追加済み 93特徴量(commit e4c97f9) | 🔵 6/1 月次リトレインで自動有効化 |
| stale model sweep | 全スクリプト v2026_13_lr02 統一(commits c02d312, b602bb7) | ✅ 5/20 完了 |