🐴 PJ38 馬脳 Umanou システム構成 · 更新: 2026-05-21 v4.0 ✅ V32 WF-CV 確定 🤖 153特徴量 / AUC 0.87 👉 シャドーラン中 → 100bet蓄積
インフラ構成図
ホスト・コンテナ・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
データパイプライン v4.2
4データソース: JVLink COM(keiba-vm) + JRDB HTTP/FTP(週次) + JRA公式スクレイピング(自動) + JRA馬場CSV(手動) → Oracle 23ai → 153特徴量 → V32 LightGBM → シグナル生成 → Telegram 通知 + シャドーログ。
毎土日 09:00 launchd 自動実行。JRDB 週次(10種)+ JRA馬場スクレイピング(金09:30 / 土日06:30)は事前自動フェッチ済み。
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(153列 V32)"] 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列"] end subgraph Signal["🎯 race_signal_today.py(毎土日 09:00)"] LGB["V32 LightGBM
dirt / turf 別モデル"] 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 Out["📤 出力"] TG["📱 Telegram 通知
シグナル + シャドーサマリー"] SH["📄 shadow_wfcv.tsv
WF-CV 4戦略 ログのみ
ev_ratio / ev_ratio_realtime"] SL["📄 signal_log.tsv
本番シグナル記録"] 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 & SL
ML 設計(V32 確定 · 2026-05-21)
Dirt / Turf 別 LightGBM 2値分類。153特徴量。Walk-forward CV 4fold × 3ヶ月 val(2023-01〜2024-01)。
WF-CV 結果: Dirt AUC=0.8621 / EV回収率=170.6% Turf AUC=0.8709 / EV回収率=180.6%
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(153特徴量)"] LABEL["Label: is_winner sample_weight: tan_odds.clip(25)"] AUC["Dirt AUC=0.8621 / EV=170.6%
Turf AUC=0.8709 / EV=180.6%"] 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
特徴量グループ(V32 153列 確定)
⭐ タイム・末脚 (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-21 更新
V32 WF-CV 確定・シャドーラン開始: 2026-05-21 より毎土日 09:00 launchd 自動実行。
次の判断ポイント: 100ベット蓄積(≈2026-06-21)→ shadow_wfcv.tsv ROI ≈ WF-CV → 本番移行。
データ収集・ETL
JVLink + JRDB / Oracle
V32 学習完了
153特徴量 / AUC 0.87
WF-CV 戦略確定
4戦略 / ROI 250〜400%
🔵
シャドーラン中
👈 今ここ / 毎土日 09:00
100ベット蓄積
≈ 2026-06-21
本番移行判断
2026-06末
flowchart TD subgraph Done["✅ 完了(2026-05-21 まで)"] S1["データ収集・ETL 完了
JVLink COM + JRDB 週次"] S2["V32 LightGBM 学習
Dirt AUC=0.8621 / Turf AUC=0.8709"] S3["WF-CV 戦略ポートフォリオ確定
Dirt 4戦略 / Turf 4戦略"] S4["シグナル生成 + Telegram 通知
launchd 毎土日 09:00 自動化"] S5["シャドーラン実装
commit 26004e7 + c7303b1
ev_ratio_realtime 列追加"] end subgraph Now["🔵 進行中 — シャドーラン蓄積"] S6["shadow_wfcv.tsv に記録中
tan_sat25 / tan_oana30
uma_sat15 / san_oana_ev30"] end subgraph Next["⬜ 次フェーズ(≈2026-06-21〜)"] S7["100ベット蓄積後 ROI 実測
shadow ROI ≈ WF-CV → 本番移行"] S8["V24 改善
bataiju ×10修正 + 再訓練"] 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
🔵 毎土日 09:00 自動実行フロー
launchd → run_race_signal.sh
race_signal_today.py --track-type dirt
race_signal_today.py --track-type turf

① NL_O1/O2 当日実オッズ取得
② V32 LightGBM 推論 + EV計算
③ シグナル選定 → Telegram 通知
④ WF-CV 4戦略シャドー評価 → shadow_wfcv.tsv
✅ 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過大評価)を検出