🐴 PJ38 馬脳 Umanou システム構成 · 更新: 2026-05-23 v5.0 ✅ V30 全6モデル完了 🤖 181特徴量 / AUC 0.878〜0.899 ✅ レース当日パイプライン②〜⑤ 👉 シャドーラン 2026-05-24〜
インフラ構成図
ホスト・コンテナ・VM の物理配置と接続ポート。
⚠️ データ取得ルール(絶対): 全 JV データは JVLink COM(keiba-vm / jrvltsql)経由のみ。 JVServlet HTTP 直取得・GateServlet・Mac-native 方式は JRA-VAN 利用規約 NG。ToS 承認は不要(JVLink COM 使用時は不問)。
flowchart TB subgraph JRA["🌐 JRA-VAN サーバー"] API["JV-Data
UM / KS / CH / RA / SE
CK / HC / DM / TM"] end subgraph VM["🖥️ keiba-vm 192.168.64.4 Windows 11 / UTM"] COM["JVLink 4.9 COM 32bit OCX
✅ JVLink COM 経由のみ(規約)"] JRVL["jrvltsql v1.4.0
+ oracle_handler.py Python 3.12 x64
database.type = oracle"] BAT["jltsql_initial_fetch.bat
👉 次アクション"] end subgraph Mac["💻 Mac localhost / 192.168.64.1 (VM視点)"] ORA[("⚙️ umanou-oracle :1521
Oracle 23ai Free FREEPDB1
8 テーブル / 4 PGQ グラフ")] ETL["ETL / Feature
oracle_features.py 59列
build_pedigree / build_h2h"] ML["LightGBM
model_dirt.pkl
36ヶ月ウィンドウ"] end API -->|"JVLink COM"| COM COM --> JRVL --> BAT BAT -->|"MERGE INTO
192.168.64.1:1521"| ORA ORA --> ETL --> ML
ポートコンテナ用途PJ
5432Homebrew PostgreSQL他PJ
5433rag-postgresPJ19 GCInsight RAGPJ19
1521umanou-oracleraces / race_results / 特徴量 / PGQ グラフPJ38 ★
1523boat-oracle23aiPJ33 艇脳PJ33
データパイプライン v5.0(レース当日②〜⑤追加)
4データソース: JVLink COM(keiba-vm) + JRDB HTTP/FTP(週次+当日TYB) + JRA公式スクレイピング(自動) + JRA馬場CSV(手動) → Oracle 23ai → 181特徴量(V30) → LightGBM 6モデル → シグナル生成 → Telegram 通知 + シャドーログ。
レース当日フロー: ①暫定推論(09:00) → ②Orchestrator(09:30) → ③TYB再推論(-10分) → ④買い目確定 → ⑤結果通知(+30分)。全自動 launchd 2ジョブ体制。
flowchart LR subgraph JVLink["🔗 JVLink COM(keiba-vm)"] R1["UM / KS / CH / RA / SE
マスタ + 成績"] R2["CK 出走別着度数
6864B / 頭"] R3["HC 調教タイム
坂路4区間ラップ"] R4["DM 走破タイム予測
TM 対戦スコア"] R5["O2 馬連 / O5 三連複オッズ
SCP pickle → ingest_o2o5_from_vm.sh"] end subgraph JRDB["📊 JRDB(HTTP/FTP 週次 + 当日)"] J1["KYI 競走馬情報・ペース予測"] J2["SED 成績拡張 / BAC レース基本"] J3["SKB 馬具(ブリンカー等)"] J4["CYB 騎手ランク / KAB 開催場別"] J5["CHA / KKA / UKC / ZED
調教・条件別・血統・前走スナップ"] J6["TYB 外厩(当日 race_day_fetch)"] J7["外厩コメントZIP(gaikyu)
load_gaikyu.py HTTP Basic Auth"] end subgraph JRA["🌐 JRA公式サイト"] A1["馬場クッション値・芝/ダート含水率
scrape_baba.py requests+BS4
launchd: 金09:30 / 土日06:30"] A2["馬場計測CSV(手動DL)
load_baba_csv.py
load_track_conditions.py"] end subgraph Oracle["⚙️ Oracle 23ai FREEPDB1"] T1[("horses / jockeys
trainers / races
race_results")] T2[("horse_career_stats
dirt馬場別・距離別・競馬場別
生産者EB勝率")] T3[("training_log
lap_200_0 etc")] T4[("mining_predictions
⚠️ リーク対策必須")] TJ[("jrdb_kyi / jrdb_sed / jrdb_skb
jrdb_cyb / jrdb_kab / jrdb_cha
jrdb_kka / jrdb_ukc / jrdb_bac
jrdb_gaikyu")] end subgraph Graph["🕸️ Oracle PGQ グラフ(4本)"] G1["pedigree_graph
父 / BMS → 血統2世代"] G2["competition_graph
H2H 対戦履歴"] G3["collaboration_graph
騎手 × 調教師"] G4["breeder_pedigree_graph
生産者 × 父系 × ダート適性"] end subgraph Feature["📐 oracle_features.py(181列 V30)"] F1["fundamental 98列
タイム・血統・脚質・ローテ等
SED/SKB 脚質・馬具特徴量含む"] F2["V13 CYB/KAB 3列"] F3["V14 CHA/KKA/UKC 19列"] F4["V15 KYI ペース 6列"] F5["V16 TYB/外厩 10列
V17 Graph深層 17列
V30 odds_idx + odds_in_enc ★TOP5"] end subgraph Signal["🎯 ① race_signal_today.py(毎土日 09:00 暫定推論)"] LGB["V30 LightGBM 6モデル
3variant × 2track"] EV["EV計算
ev_ratio = pred_prob / implied_prob
NL_O1 実オッズで ev_ratio_realtime も計算"] PICK["シグナル選定
①単勝 EV≥2.5 rank≤2
②馬連 EV≥1.5 軸→流し
③大穴軸三連複 EV≥3.0"] end subgraph RaceDay["🔄 レース当日パイプライン(② Orchestrator 09:30〜)"] ORCH["② race_orchestrator.py
threading.Timer スケジューラ
signal.alarm(43200)"] LIVE["③ race_live_infer.py
TYB取得 + 再推論(-10分)
④ 買い目確定"] NOTIFY["⑤ race_result_notifier.py
着順・払戻照合(+30分)
result_pnl.tsv 記録"] end subgraph Out["📤 出力"] TG["📱 Telegram 通知
暫定シグナル + 確定買い目 + 結果"] SH["📄 shadow_wfcv.tsv
WF-CV 4戦略 ログのみ
ev_ratio / ev_ratio_realtime"] PNL["📄 result_pnl.tsv
実績PnL(+30分自動記録)"] end R1 -->|"jrvltsql MERGE INTO"| T1 R2 --> T2 R3 --> T3 R4 --> T4 R5 -->|"ingest_o2o5_from_vm.sh"| T1 J1 & J2 & J3 & J4 & J5 & J6 -->|"jrdb_fetch_and_load.sh"| TJ J7 -->|"load_gaikyu.py"| TJ A1 & A2 -->|"races UPDATE"| T1 T1 --> G1 & G2 & G3 & G4 T2 --> G4 G1 & G2 & G3 & G4 --> F1 T1 & T2 --> F1 TJ --> F1 & F2 & F3 & F4 & F5 F1 & F2 & F3 & F4 & F5 --> LGB --> EV --> PICK PICK --> TG & SH PICK -->|"シグナル対象race_id"| ORCH ORCH -->|"-10分"| LIVE LIVE -->|"+30分"| NOTIFY NOTIFY --> TG & PNL
ML 設計(V30 確定 · 2026-05-23 / 181特徴量 / 6モデル)
Dirt / Turf 別 LightGBM LambdaRank。3 variant(linear/exp/soft) × 2 track = 6モデル。181特徴量(V30: odds_idx + odds_in_enc 追加)。
V30 結果: soft_dirt AUC=0.899 Top-1=48.1% EV=263% / linear_dirt(DEFAULT) AUC=0.884 Top-1=44.9% EV=183% / exp_turf(DEFAULT) AUC=0.887 Top-1=45.2% EV=175%
V29→V30: 全6モデルでTop-1改善。odds_idx/odds_in_enc が全モデルTOP5 feature importance。
flowchart TD subgraph Filter["🎯 対象レースフィルタ(Dirt / Turf 別)"] FD["Dirt: track_code=20 1000〜2400m 3歳以上"] FT["Turf: track_code=10 1000〜3600m 3歳以上"] end subgraph CV["📊 Walk-forward CV(4 fold × 3ヶ月 val 2023-01〜2024-01)"] CV1["Fold1: train 36m val 2023-01〜04"] CV2["Fold2: train 36m val 2023-04〜07"] CV3["Fold3: train 36m val 2023-07〜10"] CV4["Fold4: train 36m val 2023-10〜2024-01"] end subgraph LGB["⚡ LightGBM LambdaRank V30(181特徴量 / 6モデル)"] LABEL["3 variant: linear / exp / soft
× 2 track: dirt / turf"] AUC["soft_dirt AUC=0.899 Top-1=48.1% EV=263%
linear_dirt★DEFAULT AUC=0.884 EV=183%
exp_turf★DEFAULT AUC=0.887 EV=175%"] end subgraph Strat["🎯 WF-CV確定ポートフォリオ"] SD["DIRT: 単勝sat25(312%) / 馬連sat15(409%)
単勝大穴≥10(297%) / 三連複TOP3(248%)"] ST["TURF: 単勝sat25(331%★) / 単勝大穴≥30(397%)
馬連sat15(365%) / 三連複sat(313%)"] SS["シャドーのみ: 三連複大穴軸EV3.0
DIRT 886% / TURF 377%(高分散)"] end subgraph Leak["🔒 リーク対策(確認済み)"] L1["当走タイム禁止 → 前走 lag のみ"] L2["DM/TM → レース内相対ランク変換"] L3["Graph cutoff: val 開始日で切断"] end FD & FT --> CV1 & CV2 & CV3 & CV4 --> LGB Leak -.->|"必須"| LGB LGB --> AUC --> SD & ST & SS
特徴量グループ(V30 181列 確定 — odds_idx/odds_in_enc 追加)
🎯 V30 オッズ分析 (2) ★TOP5
odds_idx(時系列オッズ指数 1.5-4.5)
odds_in_enc(オッズ印 1-5 / race top5)
JRDB独自分析 ≠ 生オッズ / NULL 63.9%
⭐ タイム・末脚 (5) 最重要
last3f_time
last3f_rank_in_race
last3f_vs_class_median
class_adjusted_time_diff
median_past3_diff
🧬 血統・Graph派生 (8)
pedigree_dirt_score_d2
pedigree_confidence
sire_dirt_winrate
bms_dirt_winrate
breeder_dirt_eb_winrate ★new
first_dirt_x_breeder ★new
is_first_dirt
inbreeding_coeff (削除候補)
🏇 展開・脚質 (4)
sashi_style_code ★CK直取得
avg_corner_pos_norm
senkou_yuri_index
pace_x_kyori
🌧️ 馬場状態別適性 (4) new
dirt_good_eb_winrate
dirt_yielding_eb_winrate
dirt_heavy_eb_winrate
dirt_soft_eb_winrate
🏋️ 坂路調教 (2) new
last_keiko_days_ago
last_keiko_best_lap
🤖 DM/TM メタ (5) new ⚠️
dm_rank_in_race
tm_rank_in_race
dm_tm_rank_diff
dm_pred_error
prev_dm_actual_diff
🤝 騎手・調教師 (4)
jockey_dirt_eb_winrate ↑CK
trainer_dirt_eb_winrate ↑CK
jockey_venue_eb_winrate ↑CK
jockey_trainer_synergy
📊 その他 (27)
H2H × 2 / キャリア × 3
ローテ × 3 / 交差項 × 4
馬体・馬場 × 6
レース構造 × 11
進捗 — 2026-05-23 更新
V30 全6モデル完了 + レース当日パイプライン②〜⑤実装完了。2026-05-24 (土) からシャドーラン開始。
launchd 2ジョブ体制: ①暫定推論(09:00) + ②Orchestrator(09:30 → ③TYB再推論 → ④買い目 → ⑤結果通知)。
次の判断ポイント: 200-300ベット蓄積 → shadow_wfcv.tsv + result_pnl.tsv で実エッジ検証 → 本番移行。
データ収集・ETL
JVLink + JRDB / Oracle
V30 全6モデル完了
181特徴量 / AUC 0.878〜0.899
WF-CV 戦略確定
4戦略 / ROI 250〜400%
🔵
シャドーラン中
👈 今ここ / 毎土日 09:00
100ベット蓄積
≈ 2026-06-21
本番移行判断
2026-06末
flowchart TD subgraph Done["✅ 完了(2026-05-23 まで)"] S1["データ収集・ETL 完了
JVLink COM + JRDB 週次"] S2["V30 LightGBM 全6モデル
3variant×2track / AUC 0.878〜0.899"] S3["odds_idx + odds_in_enc 追加
全モデルTOP5 feature importance"] S4["シグナル生成 + Telegram 通知
launchd ① 毎土日 09:00 自動化"] S5["レース当日パイプライン②〜⑤
orchestrator(09:30) → live_infer(-10m)
→ 買い目確定 → result_notifier(+30m)"] end subgraph Now["🔵 進行中 — シャドーラン蓄積 2026-05-24〜"] S6["shadow_wfcv.tsv + result_pnl.tsv
全自動記録(launchd 2ジョブ体制)"] end subgraph Next["⬜ 次フェーズ"] S7["200-300ベット蓄積後 ROI 実測
shadow ROI ≈ WF-CV → 本番移行"] S8["フロントエンド + 課金"] end S1 --> S2 --> S3 --> S4 --> S5 --> S6 S6 --> S7 --> S8 classDef done fill:#14532d,stroke:#4ade80,color:#dcfce7 classDef current fill:#1e3a8a,stroke:#60a5fa,color:#bfdbfe classDef next fill:#292524,stroke:#57534e,color:#a8a29e class S1,S2,S3,S4,S5 done class S6 current class S7,S8 next
🔵 レース当日 全自動フロー(launchd 2ジョブ)
09:00 launchd① → run_race_signal.sh → 暫定推論 + Telegram
09:30 launchd② → run_orchestrator.shrace_orchestrator.py
発走-10分race_live_infer.py(TYB取得 + V30再推論 + 買い目確定)
発走+30分race_result_notifier.py(着順・払戻照合 + PnL記録)

threading.Timer + signal.alarm(43200) / 遅延追跡120秒毎 / 最終R+40分で自然終了
✅ WF-CV 確定ポートフォリオ
DIRT: 単勝sat25 ROI312% / 馬連sat15 ROI409%
  単勝大穴≥10 ROI297% / 三連複TOP3 ROI248%
TURF: 単勝sat25 ROI331%★ / 単勝大穴≥30 ROI397%
  馬連sat15 ROI365% / 三連複sat ROI313%
シャドーのみ: 三連複大穴軸EV3.0(高分散・要実測)
👉 本番移行判断基準(≈2026-06末)
shadow_wfcv.tsv の ROI が WF-CV の ±20% 以内
→ 本番ベット開始・Kelly額設定

乖離ありの場合: FLB補正 / フィルタ調整 / V24 再訓練
san_oana_ev30 は分散が大きく別途判断
✅ シャドーログ列構成
date / track / race_id / strategy
combo / pred_rank / tan_odds
ev_ratio — WF-CV と同一(前日オッズ)
ev_ratio_realtime — NL_O1 当日実オッズ EV
※ 両者の乖離でFLB(人気馬EV過大評価)を検出