① パイプライン全体像
データソース — 3系統 → Oracle 23ai
JVLink COM
基盤データ(keiba-vm → Oracle)
-
1
NL_RA → RACES
-
2
NL_SE → RACE_ENTRIES / RESULTS
-
3
NL_SE → HORSES / JOCKEYS / TRAINERS
-
4
NL_O1/O2 → ODDS_TAN / FUKU
-
5
NL_DM/TM → MINING / PRED_TIMES
JRDB FTP
独自指数・調教・直前情報(Mac mini → Oracle)
-
1
KYI — 出馬表(JRDB独自指数)
-
2
SED/SKB — 成績・前走詳細
-
3
CHA/CYB — 調教・仕上がり
-
4
TYB — 直前情報(発走15分前)
-
5
BAC/UKC/KKA/KAB — マスタ・血統
馬場スクレイプ
当日コンディション(JRA HP → Oracle)
-
1
含水率 / クッション値
-
2
天候 / 馬場状態
データソース役割分担
JVLink = 基盤(レース・成績・オッズ・血統グラフ・MINING)。215特徴量の大半がVIEWs経由で依存。生オッズはJVLinkのみが提供。
JRDB = 独自指数・調教・直前情報。JVLinkにない分析済みスコア(パドック評点・オッズ評点・仕上がり指数等)を補完。12テーブル利用中。
馬場スクレイプ = 当日の含水率・クッション値。JRA HP直接取得。
レース当日パイプライン — 推論 → フィルタ → 通知
特徴量 → 推論
-
1
oracle_features.py — 特徴量生成
-
2
LambdaRank推論 — pred_prob算出
フィルタ → 通知
-
3
戦略フィルタ — 6戦略でベット判定
-
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分前にトリガーされるジョブを動的生成(発走時間は朝に確認)
⚠️ 発走遅延時の対処: 遅延検知→ジョブ再スケジュール 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パーサー未着手
❌ 未実装
・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
❌ 未実装 — 現状は朝の暫定推論でベット確定
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 — 単勝サテライト
-
2
uma_oana30_dyn — 馬連大穴軸
-
3
san_dyn15 — 三連複大穴軸
芝 — exp
3戦略
-
1
tan_sat25 — 単勝サテライト
-
2
tan_oana30 — 単勝大穴
-
3
san_dyn20 — 三連複大穴軸
芝 uma_oana30_dyn カット(2026-05-22)
馬連が三連複と73%重複 → 投資効率悪化。芝は単勝2 + 三連複1の3戦略に絞り、ダートのみ馬連を維持。
WF-CV バックテスト結果(Config D)
ダート linear — 合計利益 ¥2,324,800
-
tan
tan_sat25: ROI=1,755%
-
馬
uma_oana30_dyn: ROI=812%
-
三
san_dyn15: ROI=628%
芝 exp — 合計利益 ¥1,808,390
-
tan
tan_sat25: ROI=1,088%
-
穴
tan_oana30: ROI=710%
-
三
san_dyn20: ROI=693%
④ 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 アンサンブル検証