インフラ構成図
ホスト・コンテナ・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 |
| 5432 | — | Homebrew PostgreSQL | 他PJ |
| 5433 | rag-postgres | PJ19 GCInsight RAG | PJ19 |
| 1521 | umanou-oracle | races / race_results / 特徴量 / PGQ グラフ | PJ38 ★ |
| 1523 | boat-oracle23ai | PJ33 艇脳 | 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
→
→
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.sh → race_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過大評価)を検出