馬脳 Umanou V29

LightGBM LambdaRank 215 features Config D 確定 更新: 2026-05-22 23:00

DIRT モデル

linear
label_gain = [0, 1, 2, 3, 4]
lambdarank_v28_linear_dirt.pkl
calibrator_v28_linear_dirt.pkl

TURF モデル

exp
label_gain = [0, 1, 3, 7, 15]
lambdarank_v28_exp_turf.pkl
calibrator_v28_exp_turf.pkl

V29 変更点

soft → exp
TURF最適variant変更
ZOGENSA 1/10スケール修正後
処理パイプライン
flowchart LR
    subgraph Input["入力"]
        A["Oracle 23ai
NL_SE / NL_RA / NL_UM"] end subgraph FE["特徴量エンジニアリング"] B["oracle_features.py
215 features"] end subgraph Model["モデル推論"] C["LambdaRank
softmax正規化"] end subgraph Cal["キャリブレーション"] D["Isotonic Regression
calibrator.pkl"] end subgraph Cap["キャップ"] E["pred_prob cap
MAX = 0.80"] end subgraph EV["EV計算"] F["ev_ratio
= pred_prob / implied_prob"] end subgraph Sig["シグナル生成"] G["戦略フィルタ
DIRT:3 / TURF:3
→ Telegram通知"] end A --> B --> C --> D --> E --> F --> G classDef input fill:#1e3a5f,stroke:#3b82f6,color:#bfdbfe classDef process fill:#1e293b,stroke:#475569,color:#94a3b8 classDef safety fill:#78350f,stroke:#fbbf24,color:#fef3c7 classDef output fill:#14532d,stroke:#4ade80,color:#dcfce7 class A input class B,C,D process class E safety class F,G output
安全機構
⚠️ pred_prob キャップ (MAX_WIN_PROB = 0.80)
softmax正規化で pred_prob が 1.0 に達すると EV = pred_prob / implied_prob が異常値に。
競馬の統計的上限(圧倒的1番人気でも勝率~65%)を踏まえ 0.80 でクリップ。
適用タイミング: Calibration → Ensemble → ★cap(0.80) → EV計算
⏱ Oracle接続タイムアウト (signal.alarm 90s)
launchd StartInterval 環境で Oracle がハングすると全インターバルがスキップされる問題の対策。
Python 側で signal.alarm(90) → sys.exit(1) を設定。
macOS に /usr/bin/timeout は存在しないため Python シグナルで実装。
Isotonic Regression Calibrator

sklearn IsotonicRegression を WF-CV OOF 予測値に fit。レース内再正規化後に適用。
効果: LambdaRank の raw スコアは順序のみ最適化されるため確率解釈が崩れる。 Isotonic Regression で単調変換し、実勝率にキャリブレーション。
制約: calibrator 出力が 0.80 を超える場合あり(dirt: cal(0.80)=1.0)→ cap で抑制。

V29 決定経緯(2026-05-22)
日付決定事項根拠
05-18ZOGENSA 1/10 スケール修正VIEW上で ×10 復元していなかった → 特徴量にゴミが入っていた
05-19TURF 最適variant soft → expZOGENSA修正後 WF-CV再評価: exp が全4戦略で最高ROI・利益
05-22EV乖離ベース賭け金5段階導入ev_ratio高い馬に自信度に応じて厚く張る → 期待値最大化
05-22Config D 確定(単勝¥300/multi¥500 base)三連複が利益79%生成(ROI 706%)→ 三連複重視配分
05-22芝 uma_oana30_dyn(馬連)削除馬連的中の73%が三連複と重複。利益貢献7%。資金効率改善
05-22ダート馬連は維持馬連単独的中47%(三連複外れ時に平均¥18k回収)→ 保険機能
賭け金 Config D(2026-05-22 確定)

単勝(tan_sat25 / tan_oana30)

EV乖離賭け金
base(〜3.0)¥300
≥ 3.0¥600
≥ 4.0¥900
≥ 5.5¥1,200
≥ 7.0¥1,500

馬連・三連複(uma / san_dyn)

EV乖離賭け金
base(〜1.5)¥500
≥ 1.5¥1,000
≥ 2.0¥1,500
≥ 3.0¥2,000
≥ 4.0¥2,500
📐 設計根拠
三連複が全利益の79%を生成(ROI 706%) → 三連複重視。
単勝は的中率25%だが1回¥1,067回収(ROI 264%)→ 薄く広く。
芝の馬連は三連複と73%重複 → カット。ダート馬連は47%独自的中 → 維持。
日次平均投資: ¥86k / 最大損失: ¥107k / 推奨初期予算: ¥50万
本番戦略構成(2026-05-22 確定)

DIRT 3戦略

戦略券種条件
tan_sat25単勝EV≥2.5 × rank≤2
uma_oana30_dyn馬連odds≥30 × rank≤4 × 動的パートナー
san_dyn15三連複odds≥15 × rank≤4 × 動的パートナー

TURF 3戦略(馬連カット)

戦略券種条件
tan_sat25単勝EV≥2.5 × rank≤2
tan_oana30単勝odds≥30 × rank≤3
san_dyn20三連複odds≥20 × rank≤4 × 動的パートナー
※ 芝 uma_oana30_dyn 削除: 馬連的中の73%が三連複と重複、利益貢献7%のみ
DIRT 3バリアント戦略比較(WF-CV @¥100/点)
戦略VariantBetsHits投資回収利益ROI的中率
tan_sat25
単勝サテライト
linear460143¥46,000¥174,980¥128,980380.4%31.1%
soft ◀572200¥57,200¥269,270¥212,070470.8%35.0%
exp443146¥44,300¥205,280¥160,980463.4%33.0%
uma_oana30_dyn
馬連大穴軸
linear ◀1,00457¥100,400¥816,000¥715,600812.7%5.7%
soft1,08761¥108,700¥673,840¥565,140619.9%5.6%
exp91150¥91,100¥619,180¥528,080679.7%5.5%
san_dyn15
三連複大穴軸
linear ◀2,803175¥280,300¥1,760,520¥1,480,220628.1%6.2%
soft2,926151¥292,600¥1,556,450¥1,263,850531.9%5.2%
exp2,726168¥272,600¥1,671,850¥1,399,250613.3%6.2%

DIRT 合計利益

¥2,324,800
★ linear — 馬連+三連複が圧倒

soft 合計利益

¥2,041,060
単勝は最強だが総合で及ばず

exp 合計利益

¥2,088,310
中間ポジション
TURF 3バリアント戦略比較(WF-CV @¥100/点)
戦略VariantBetsHits投資回収利益ROI的中率
tan_sat25
単勝サテライト
linear430150¥43,000¥200,070¥157,070465.3%34.9%
soft ◀423156¥42,300¥208,980¥166,680494.0%36.9%
exp420155¥42,000¥207,080¥165,080493.0%36.9%
tan_oana30
単勝大穴
linear10312¥10,300¥73,910¥63,610717.6%11.7%
soft13818¥13,800¥88,770¥74,970643.3%13.0%
exp ◀12416¥12,400¥88,990¥76,590717.7%12.9%
uma_oana30_dyn
馬連大穴軸
⛔ 芝カット
linear81451¥81,400¥448,390¥366,990550.8%6.3%
soft90954¥90,900¥515,640¥424,740567.3%5.9%
exp83960¥83,900¥595,650¥511,750710.0%7.2%
san_dyn20
三連複大穴軸
linear1,821112¥182,100¥1,106,320¥924,220607.5%6.2%
soft1,882110¥188,200¥1,114,740¥926,540592.3%5.8%
exp ◀1,779120¥177,900¥1,232,870¥1,054,970693.0%6.7%

linear 合計利益

¥1,511,890
全戦略で3位

soft 合計利益

¥1,592,930
V28時代の選択 — 単勝だけ僅差1位

TURF 合計利益(馬連カット後)

¥1,296,640
★ exp — tan_sat25+tan_oana30+san_dyn20
週次運用フロー
flowchart TD
    subgraph Weekly["📅 週次(金曜)"]
        W1["JRDB週次取得
金 05:30"] W2["馬場データ収集
金 09:30"] end subgraph Hourly["🔄 常時"] H1["JVLink Collector
毎時(1h interval)"] end subgraph RaceDay["🏇 レース当日(土日 09:00)"] R1["race_signal_today.py"] R2["Oracle特徴量生成
215 features"] R3["LambdaRank推論
dirt=linear / turf=exp"] R4["Isotonic Calibration"] R5["pred_prob cap 0.80"] R6["EV計算 + 戦略フィルタ"] R7["Telegram通知
+ shadow_wfcv.tsv"] end W1 --> H1 W2 --> R1 H1 --> R1 R1 --> R2 --> R3 --> R4 --> R5 --> R6 --> R7 classDef weekly fill:#1e3a5f,stroke:#3b82f6,color:#bfdbfe classDef hourly fill:#312e81,stroke:#818cf8,color:#c7d2fe classDef race fill:#14532d,stroke:#4ade80,color:#dcfce7 classDef safety fill:#78350f,stroke:#fbbf24,color:#fef3c7 class W1,W2 weekly class H1 hourly class R1,R2,R3,R6,R7 race class R4 race class R5 safety
launchd ジョブ一覧
📡
umanou-collector
JVLink データ収集(差分取得)
毎時(StartInterval 3600)
📊
umanou-jrdb-weekly
JRDB 週次データ取得(KYI/SRB/CYB等)
金曜 05:30
🌿
umanou-baba-scraper
馬場状態スクレイピング(クッション値・含水率)
金 09:30 / 土 06:30 / 日 06:30
🏇
umanou-race-signal
race_signal_today.py — シグナル生成 + Telegram通知
土日 09:00
💰
umanou-odds-archive
オッズ履歴アーカイブ
週次
データフロー
flowchart LR
    subgraph Src["データソース"]
        JV["JVLink COM
keiba-vm"] JRDB["JRDB
週次ファイル"] BABA["netkeiba
馬場情報"] end subgraph Store["Oracle 23ai"] NL["NL_RA / NL_SE
NL_UM / NL_KS / NL_CH"] JT["JRDB_HJA / JRDB_HJC
実払戻テーブル"] BS["baba_snapshots"] VW["VIEWS
RACES / RACE_ENTRIES
RACE_RESULTS / HORSES"] end subgraph ML["ML パイプライン"] FE["oracle_features.py
215 features"] TR["train_dirt.py / train_turf.py
WF-CV 4fold"] MDL["models/
lambdarank_v28_*.pkl
calibrator_v28_*.pkl"] SIG["race_signal_today.py
6戦略シグナル
Config D 賭け金"] end subgraph Out["出力"] TG["📱 Telegram"] LOG["📁 shadow_wfcv.tsv
signal_history.tsv"] end JV --> NL JRDB --> JT BABA --> BS NL --> VW VW --> FE BS --> FE FE --> TR --> MDL FE --> SIG MDL --> SIG JT --> SIG SIG --> TG SIG --> LOG classDef src fill:#1e3a5f,stroke:#3b82f6,color:#bfdbfe classDef store fill:#312e81,stroke:#818cf8,color:#c7d2fe classDef ml fill:#14532d,stroke:#4ade80,color:#dcfce7 classDef out fill:#78350f,stroke:#fbbf24,color:#fef3c7 class JV,JRDB,BABA src class NL,JT,BS,VW store class FE,TR,MDL,SIG ml class TG,LOG out
明日(05-23 金)のテスト項目
🔵 目的
V29 モデル(dirt=linear / turf=exp)が本番パイプラインで正常に動作することを確認。
土曜(05-24)のシャドーラン開始前に全フローを end-to-end で検証。

1. モデルファイル確認

  • ☐ lambdarank_v28_linear_dirt.pkl 存在確認
  • ☐ lambdarank_v28_exp_turf.pkl 存在確認
  • ☐ calibrator_v28_linear_dirt.pkl 存在確認
  • ☐ calibrator_v28_exp_turf.pkl 存在確認
  • ☐ 各pkl のロード + feature_cols 数チェック

2. Oracle VIEW 動作確認

  • ☐ RACES VIEW — race_id 16桁生成OK
  • ☐ RACE_ENTRIES — bataiju ×10 / zogen ±×10
  • ☐ RACE_RESULTS — time_seconds 変換
  • ☐ baba_snapshots JOIN 確認
  • ☐ ZOGENSA サンプル値確認(平均0.02前後)

3. race_signal_today.py dry-run

  • ☐ --dry-run --track-type dirt で正常完了
  • ☐ --dry-run --track-type turf で正常完了
  • ☐ TURF で exp モデルが読み込まれること確認
  • ☐ Calibration applied ログ出力あり
  • ☐ pred_prob cap ログ(clipped件数)確認
  • ☐ signal.alarm タイムアウト設定ログ確認

4. 戦略シグナル検証

  • ☐ DIRT: tan_sat25 / uma_oana30_dyn / san_dyn15 出力
  • ☐ TURF: tan_sat25 / tan_oana30 / san_dyn20 出力(馬連なし)
  • ☐ bet_amount 列が shadow_wfcv.tsv に出力されること
  • ☐ 単勝 bet_amount: ¥300〜¥1,500 の範囲を確認
  • ☐ 馬連/三連複 bet_amount: ¥500〜¥2,500 の範囲を確認
  • ☐ signal_history.tsv に追記されること
  • ☐ Telegram 通知に戦略別投資額・合計投資額表示あり

5. launchd ジョブ確認

  • ☐ umanou-race-signal loaded 確認
  • ☐ umanou-collector loaded + 正常動作
  • ☐ umanou-baba-scraper loaded 確認
  • ☐ 各ジョブのログファイル書き込み確認

6. 過去日テスト

  • ☐ --date 2026-05-17(先週土曜)で実行
  • ☐ 出力シグナル数が妥当(0ではない)
  • ☐ EV値の範囲が妥当(2.5〜10程度)
  • ☐ DIRT/TURF 両方でシグナルあり
✅ テスト完了条件
上記全項目クリア → 05-24(土)からシャドーラン開始。
100bet 蓄積後(約2-3週間)に実績ベースで戦略レビュー → P1(KYI適性コード)へ進行。
❌ ブロッカー発生時
Oracle VIEW エラー → views_nl_to_features.sql 再適用
モデル pkl 読み込み失敗 → feature_cols 不一致の可能性 → train 再実行
Telegram 通知不達 → BOT_TOKEN / CHAT_ID 環境変数確認