馬脳 (Umanou) 運用フロー

LightGBM LambdaRank / JVLink COM + JRDB + Oracle 23ai Free / 最終更新: 2026-05-23 v6

🎯 シャドーラン準備中(5/24〜) V29 DEFAULT: dirt=linear / turf=exp Config D: 単勝¥300〜¥1,500 / 馬連三連複¥500〜¥2,500

① パイプライン全体像

データソース — 3系統 → Oracle 23ai

JVLink COM

基盤データ(keiba-vm → Oracle)

  • 1
    NL_RA → RACES
    開催情報(距離・コース・天候・馬場・頭数)
  • 2
    NL_SE → RACE_ENTRIES / RESULTS
    出走情報・成績・着順・タイム・体重
  • 3
    NL_SE → HORSES / JOCKEYS / TRAINERS
    マスタ + 血統グラフ(pedigree_edges → 32d埋め込み)
  • 4
    NL_O1/O2 → ODDS_TAN / FUKU
    単勝・複勝オッズ(ev_ratio計算 / 直前オッズ)
  • 5
    NL_DM/TM → MINING / PRED_TIMES
    JRA公式予測タイム・対戦スコア
jrvltsql 直接INSERT / 全特徴量の基盤(VIEWs経由)
JRDB FTP

独自指数・調教・直前情報(Mac mini → Oracle)

  • 1
    KYI — 出馬表(JRDB独自指数)
    IDM・脚質・ペース予想・適性コード → V15/V26
  • 2
    SED/SKB — 成績・前走詳細
    後3F・コーナー順位・スピード指数・馬具コード
  • 3
    CHA/CYB — 調教・仕上がり
    追い切り指数・仕上がり指数 → V13/V14/V28
  • 4
    TYB — 直前情報(発走15分前)
    パドック評点・オッズ評点・馬具変更・気配 → V16/V26
  • 5
    BAC/UKC/KKA/KAB — マスタ・血統
    系統コード・父/母父連対率・場/騎手/厩舎
jrdb_fetch_and_load.sh / 12テーブル / TYBは当日ETL未接続
馬場スクレイプ

当日コンディション(JRA HP → Oracle)

  • 1
    含水率 / クッション値
    芝・ダート別 → V27馬場適応特徴量
  • 2
    天候 / 馬場状態
    良/稍重/重/不良
scrape_baba.py / 当日09:00実行

データソース役割分担

JVLink = 基盤(レース・成績・オッズ・血統グラフ・MINING)。215特徴量の大半がVIEWs経由で依存。生オッズはJVLinkのみが提供。
JRDB = 独自指数・調教・直前情報。JVLinkにない分析済みスコア(パドック評点・オッズ評点・仕上がり指数等)を補完。12テーブル利用中。
馬場スクレイプ = 当日の含水率・クッション値。JRA HP直接取得。

レース当日パイプライン — 推論 → フィルタ → 通知

特徴量 → 推論
  • 1
    oracle_features.py — 特徴量生成
    215特徴量 / JVLink VIEWs + JRDB 12テーブル + 馬場 + Graph DB
  • 2
    LambdaRank推論 — pred_prob算出
    dirt=linear / turf=exp / Isotonic Regression calibrator / cap=0.80
フィルタ → 通知
  • 3
    戦略フィルタ — 6戦略でベット判定
    DIRT 3(tan_sat25 / uma_oana30_dyn / san_dyn15)+ TURF 3(tan_sat25 / tan_oana30 / san_dyn20)
  • 4
    Telegram通知 — 全ベット推奨を送信
    戦略別投資額 / 対象レース / 推奨馬券

② レース当日タイムライン

前日金曜 05:00 — JRDB データ更新
jrdb_fetch_and_load.sh — KYI(今週末出馬表)+ SED/SKB(前週成績)+ HJA/HJC(前週払戻)
✅ launchd: com.reraflow.umanou-jrdb-weekly
当日土日 09:00 — 馬場コンディション取得
scrape_baba.py — クッション値・含水率・天候・馬場状態
⚠️ 要変更: 現launchd=金/土09:30 → 土日09:00に移動予定
当日土日 09:15 — ① 暫定推論(出馬表+馬場/オッズなし)
race_signal_today.py — oracle_features.py → LambdaRank推論 → 暫定候補レース抽出(オッズは③で反映)
フィルタ落ちした候補もデータとして記録(将来の学習データ用)
✅ launchd: com.reraflow.umanou-race-signal / signal.alarm(3600) ハング対策
当日09:30 — ② 候補レースにスクリプトセット
暫定候補の各レースに対し、直前情報取得スクリプトをスケジュール
各レース発走10分前にトリガーされるジョブを動的生成(発走時間は朝に確認)
⚠️ 発走遅延時の対処: 遅延検知→ジョブ再スケジュール or 手動トリガーが必要(要設計)
❌ 未実装 — 現状は朝の一括推論のみ
直前各レース -10分 — ③ TYB取得 + 直前再推論
TYBデータで本来精度の推論を実行(学習時にTYB 8特徴量を使用しているため必須):
JRDB TYB(発走15分前配信 → 10分前なら確実に取得可能)
 paddock_idx / kehai_code / bagu_henkou / ashimoto_joho / batai_code / sogo_idx / naraishi_kubun
馬体重(当日発表)
直前オッズ → implied_prob / ev_ratio 再計算(生オッズ = JVLink NL_O1)
馬場状態変化(雨による変更等)

TYBパーサー実装済み / 当日ETL(race_day_fetch.sh)未作成 / OZパーサー未着手
❌ 未実装
直前各レース -5分 — ④ 買い目・金額確定
6戦略フィルタ → Config D スケーリング(1X〜5X)→ 最終ベット確定 → Telegram通知
DIRT: tan_sat25 / uma_oana30_dyn / san_dyn15 | TURF: tan_sat25 / tan_oana30 / san_dyn20
❌ 未実装 — 現状は朝の暫定推論でベット確定
レース後各レース +30分 — ⑤ 結果通知
投票したレースの着順・払戻・ROIをTelegram通知
❌ 未実装
19:00 — ⑥ 日次サマリー通知
当日全投票の成績サマリー — 的中率・ROI・累積損益 → Telegram
フィルタ落ち候補のデータも含めて記録(将来の学習データ)
❌ 未実装
週次月曜 06:00 — オッズアーカイブ
archive_odds.py — 7日超のNL_O1をParquet(zstd)退避 → Oracle DELETE
✅ launchd: com.reraflow.umanou-odds-archive

現状(シャドーラン Phase 1)

①の朝一括推論のみ実装済み。②〜⑥は段階的に実装予定。シャドーラン中は①の結果をそのまま記録し、100ベット蓄積後にGO/NO-GO判断。

③ モデル・ベット戦略

V29 特徴量数
215
V14+V15+V16+V17+V26-V33 全フラグON
キャリブレーション
Isotonic
pred_prob cap = 0.80
WF-CV期間
134日
2023-01 〜 2024-03
ダート variant
linear
label_gain=[0,1,2,3,4]
芝 variant
exp
label_gain=[0,1,3,7,15]

Config D — EV乖離ベース5段階スケーリング

単勝
¥300 〜 ¥1,500 — EV≥7.0→¥1,500 / ≥5.5→¥1,200 / ≥4.0→¥900 / ≥3.0→¥600 / else→¥300
馬連・三連複
¥500 〜 ¥2,500 — EV≥4.0→¥2,500 / ≥3.0→¥2,000 / ≥2.0→¥1,500 / ≥1.5→¥1,000 / else→¥500
日次平均投資
約 ¥86,000 / 最大損失 ¥107,000 / 最大連続負け 2日
推奨資金
¥500,000(安全: ¥800,000)

6戦略ポートフォリオ(ダート3 + 芝3)

ダート — linear

3戦略

  • 1
    tan_sat25 — 単勝サテライト
    EV≥2.5 × rank≤2 → 単勝¥300〜¥1,500
  • 2
    uma_oana30_dyn — 馬連大穴軸
    odds≥30 × rank≤4 → 動的相手 → 馬連¥500〜¥2,500
  • 3
    san_dyn15 — 三連複大穴軸
    odds≥15 × rank≤4 → 動的相手 → 三連複¥500〜¥2,500
芝 — exp

3戦略

  • 1
    tan_sat25 — 単勝サテライト
    EV≥2.5 × rank≤2 → 単勝¥300〜¥1,500
  • 2
    tan_oana30 — 単勝大穴
    odds≥30 × rank≤3 → 単勝¥300〜¥1,500
  • 3
    san_dyn20 — 三連複大穴軸
    odds≥20 × rank≤4 → 動的相手 → 三連複¥500〜¥2,500

芝 uma_oana30_dyn カット(2026-05-22)

馬連が三連複と73%重複 → 投資効率悪化。芝は単勝2 + 三連複1の3戦略に絞り、ダートのみ馬連を維持。

WF-CV バックテスト結果(Config D)

ダート linear — 合計利益 ¥2,324,800

  • tan
    tan_sat25: ROI=1,755%
    1,715 bets — 全3バリアント中最高
  • uma_oana30_dyn: ROI=812%
    2,767 bets — 馬連大穴でプラス
  • san_dyn15: ROI=628%
    7,711 bets — 三連複も十分なリターン

芝 exp — 合計利益 ¥1,808,390

  • tan
    tan_sat25: ROI=1,088%
    1,229 bets — exp が圧倒的
  • tan_oana30: ROI=710%
    622 bets — 大穴単勝で高ROI
  • san_dyn20: ROI=693%
    2,914 bets — 閾値≥20で最適化

④ launchd ジョブ一覧(6件)

plist名 スケジュール スクリプト 内容 状態
umanou-race-signal 土日 09:00 race_signal_today.py メインパイプライン: 推論→戦略→通知 ✅ 稼働中
umanou-jrdb-weekly 金 05:00 jrdb_fetch_and_load.sh JRDB FTP → Oracle(SED/SKB/KYI/HJA/HJC) ✅ 稼働中
umanou-baba-scraper 金/土 09:30 scrape_baba.py JRA HP → 馬場コンディション ✅ 稼働中
umanou-odds-archive 月 06:00 archive_odds.py NL_O1 → Parquet退避 → Oracle DELETE ✅ 稼働中
umanou-train-lambdarank 手動 / 月次 train_lambdarank.py モデル再学習(V28→V29→...) ✅ 登録済

⚠️ keiba-vm portproxy 注意

Windows リブートで netsh interface portproxy が揮発 → JVLink が JRA認証サーバーに接続不可。register_portproxy_task.ps1 でタスクスケジューラ永続化済み。リブート後に要確認。

⑤ シャドーラン・運用判断基準

シャドーラン(5/24〜)

開始日
2026-05-24(土) — launchd 自動実行で開始
蓄積目標
100ベット — 約2〜3週間で到達見込み
GO判断
ROI ≥ 120% → 実資金運用開始
NO-GO
ROI < 100% → モデル見直し / 戦略パラメータ調整
記録ファイル
shadow_wfcv.tsv / signal_history.tsv / bankroll_log.tsv

実運用移行後の検証フロー

出金基準
累積利益が初期資金の50%超 → 超過分を出金
馬券購入
Telegram通知 → 手動購入(将来: IPAT/即PAT自動化)
月次リトレイン
3ヶ月ウィンドウでモデル更新(AUC劣化時は即対応)

⑥ V29 決定経緯

日付 決定事項 理由
05-22 ZOGENSA修正 → V29 3-variant再比較 exp labelの前走着順差(ZOGENSA)計算に誤りがあり修正。芝最適がsoft→expに変動
05-22 DEFAULT変更: dirt=linear / turf=exp ZOGENSA修正後のcompare_v29_variants.py結果: dirt linearが合計利益最大 / turf expが最大
05-22 芝 uma_oana30_dyn カット 馬連と三連複の73%重複を解消。芝は単勝2+三連複1の3戦略に
05-22 Config D 採用 EV乖離ベース5段階スケーリング。単勝¥300〜¥1,500 / 馬連三連複¥500〜¥2,500
05-22 芝三連複閾値 ≥20(san_dyn20) san_dyn15では低オッズ帯の的中が多すぎてROI低下。≥20でフィルタ強化
05-24 シャドーラン開始予定 100ベット蓄積 → ROI≥120%でGO判断

⑥ 既知問題・トラブルシューティング

症状 原因 対処 状態
Oracle VIEW エラー ODDS_TAN / RACE_ENTRIES ビュー未定義 views_nl_to_features.sql 再適用 ✅ 解消
モデル pkl 読み込み失敗 feature_cols不一致(旧モデル/新特徴量) train_lambdarank.py 再実行 ✅ 解消
Telegram 通知不達 BOT_TOKEN / CHAT_ID 環境変数未設定 .env にTELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID 設定 ✅ 解消
Oracle接続ハング Docker再起動後にリスナー復旧待ち signal.alarm(3600) でタイムアウト強制終了。launchd が再起動 ✅ 対策済
JVLink データ取得停止 portproxy がリブートで揮発 register_portproxy_task.ps1 で永続化。リブート後要確認 ✅ 対策済
NL_SE.BATAIJYU 1/10スケール 43.4 = 434kg として格納 V28互換のため温存。V29以降で修正予定 ⏳ 既知

⑦ ロードマップ

完了済み

V28 全フラグON 215特徴量(AUC +0.07)
Graph DB(h2h_pagerank / pedigree_emb 32d)
NL_O1 オッズ backfill 35,488行
V29 ZOGENSA修正 + 3-variant再比較
Config D 賭け金スケーリング実装
芝馬連カット + san_dyn20閾値最適化
launchd 5 plist 登録・稼働確認

進行中

🔧E2Eテスト(5/23 金 — チェックリスト確認)
🎯シャドーラン開始(5/24 土〜)
🎯100ベット蓄積 → GO/NO-GO判断
🔧P1: KYI適性コード追加(kyori_tekisei / ju_tekisei)

将来

📅TYB当日ETL接続(パーサー済み / race_day_fetch.sh 未作成)
📅直前オッズ取得(JVLink NL_O1 / OZパーサー未着手)
📅②〜⑥ ステップ段階実装(スクリプトセット→直前再推論→結果通知→日次サマリー)
📅月次自動リトレイン(3ヶ月ウィンドウ)
💡自動投票API連携(IPAT / 即PAT)
🔬CatBoost / XGBoost アンサンブル検証