flowchart LR
subgraph Input["入力"]
A["Oracle 23ai
NL_SE / NL_RA / NL_UM"]
end
subgraph FE["特徴量エンジニアリング"]
B["oracle_features.py
215 features"]
end
subgraph Model["モデル推論"]
C["LambdaRank
softmax正規化"]
end
subgraph Cal["キャリブレーション"]
D["Isotonic Regression
calibrator.pkl"]
end
subgraph Cap["キャップ"]
E["pred_prob cap
MAX = 0.80"]
end
subgraph EV["EV計算"]
F["ev_ratio
= pred_prob / implied_prob"]
end
subgraph Sig["シグナル生成"]
G["戦略フィルタ
DIRT:3 / TURF:3
→ Telegram通知"]
end
A --> B --> C --> D --> E --> F --> G
classDef input fill:#1e3a5f,stroke:#3b82f6,color:#bfdbfe
classDef process fill:#1e293b,stroke:#475569,color:#94a3b8
classDef safety fill:#78350f,stroke:#fbbf24,color:#fef3c7
classDef output fill:#14532d,stroke:#4ade80,color:#dcfce7
class A input
class B,C,D process
class E safety
class F,G output
sklearn IsotonicRegression を WF-CV OOF 予測値に fit。レース内再正規化後に適用。
効果: LambdaRank の raw スコアは順序のみ最適化されるため確率解釈が崩れる。
Isotonic Regression で単調変換し、実勝率にキャリブレーション。
制約: calibrator 出力が 0.80 を超える場合あり(dirt: cal(0.80)=1.0)→ cap で抑制。
| 日付 | 決定事項 | 根拠 |
|---|---|---|
| 05-18 | ZOGENSA 1/10 スケール修正 | VIEW上で ×10 復元していなかった → 特徴量にゴミが入っていた |
| 05-19 | TURF 最適variant soft → exp | ZOGENSA修正後 WF-CV再評価: exp が全4戦略で最高ROI・利益 |
| 05-22 | EV乖離ベース賭け金5段階導入 | ev_ratio高い馬に自信度に応じて厚く張る → 期待値最大化 |
| 05-22 | Config D 確定(単勝¥300/multi¥500 base) | 三連複が利益79%生成(ROI 706%)→ 三連複重視配分 |
| 05-22 | 芝 uma_oana30_dyn(馬連)削除 | 馬連的中の73%が三連複と重複。利益貢献7%。資金効率改善 |
| 05-22 | ダート馬連は維持 | 馬連単独的中47%(三連複外れ時に平均¥18k回収)→ 保険機能 |
| EV乖離 | 賭け金 |
|---|---|
| base(〜3.0) | ¥300 |
| ≥ 3.0 | ¥600 |
| ≥ 4.0 | ¥900 |
| ≥ 5.5 | ¥1,200 |
| ≥ 7.0 | ¥1,500 |
| EV乖離 | 賭け金 |
|---|---|
| base(〜1.5) | ¥500 |
| ≥ 1.5 | ¥1,000 |
| ≥ 2.0 | ¥1,500 |
| ≥ 3.0 | ¥2,000 |
| ≥ 4.0 | ¥2,500 |
| 戦略 | 券種 | 条件 |
|---|---|---|
| tan_sat25 | 単勝 | EV≥2.5 × rank≤2 |
| uma_oana30_dyn | 馬連 | odds≥30 × rank≤4 × 動的パートナー |
| san_dyn15 | 三連複 | odds≥15 × rank≤4 × 動的パートナー |
| 戦略 | 券種 | 条件 |
|---|---|---|
| tan_sat25 | 単勝 | EV≥2.5 × rank≤2 |
| tan_oana30 | 単勝 | odds≥30 × rank≤3 |
| san_dyn20 | 三連複 | odds≥20 × rank≤4 × 動的パートナー |
| 戦略 | Variant | Bets | Hits | 投資 | 回収 | 利益 | ROI | 的中率 |
|---|---|---|---|---|---|---|---|---|
| tan_sat25 単勝サテライト |
linear | 460 | 143 | ¥46,000 | ¥174,980 | ¥128,980 | 380.4% | 31.1% |
| soft ◀ | 572 | 200 | ¥57,200 | ¥269,270 | ¥212,070 | 470.8% | 35.0% | |
| exp | 443 | 146 | ¥44,300 | ¥205,280 | ¥160,980 | 463.4% | 33.0% | |
| uma_oana30_dyn 馬連大穴軸 |
linear ◀ | 1,004 | 57 | ¥100,400 | ¥816,000 | ¥715,600 | 812.7% | 5.7% |
| soft | 1,087 | 61 | ¥108,700 | ¥673,840 | ¥565,140 | 619.9% | 5.6% | |
| exp | 911 | 50 | ¥91,100 | ¥619,180 | ¥528,080 | 679.7% | 5.5% | |
| san_dyn15 三連複大穴軸 |
linear ◀ | 2,803 | 175 | ¥280,300 | ¥1,760,520 | ¥1,480,220 | 628.1% | 6.2% |
| soft | 2,926 | 151 | ¥292,600 | ¥1,556,450 | ¥1,263,850 | 531.9% | 5.2% | |
| exp | 2,726 | 168 | ¥272,600 | ¥1,671,850 | ¥1,399,250 | 613.3% | 6.2% |
| 戦略 | Variant | Bets | Hits | 投資 | 回収 | 利益 | ROI | 的中率 |
|---|---|---|---|---|---|---|---|---|
| tan_sat25 単勝サテライト |
linear | 430 | 150 | ¥43,000 | ¥200,070 | ¥157,070 | 465.3% | 34.9% |
| soft ◀ | 423 | 156 | ¥42,300 | ¥208,980 | ¥166,680 | 494.0% | 36.9% | |
| exp | 420 | 155 | ¥42,000 | ¥207,080 | ¥165,080 | 493.0% | 36.9% | |
| tan_oana30 単勝大穴 |
linear | 103 | 12 | ¥10,300 | ¥73,910 | ¥63,610 | 717.6% | 11.7% |
| soft | 138 | 18 | ¥13,800 | ¥88,770 | ¥74,970 | 643.3% | 13.0% | |
| exp ◀ | 124 | 16 | ¥12,400 | ¥88,990 | ¥76,590 | 717.7% | 12.9% | |
| uma_oana30_dyn 馬連大穴軸 ⛔ 芝カット |
linear | 814 | 51 | ¥81,400 | ¥448,390 | ¥366,990 | 550.8% | 6.3% |
| soft | 909 | 54 | ¥90,900 | ¥515,640 | ¥424,740 | 567.3% | 5.9% | |
| exp | 839 | 60 | ¥83,900 | ¥595,650 | ¥511,750 | 710.0% | 7.2% | |
| san_dyn20 三連複大穴軸 |
linear | 1,821 | 112 | ¥182,100 | ¥1,106,320 | ¥924,220 | 607.5% | 6.2% |
| soft | 1,882 | 110 | ¥188,200 | ¥1,114,740 | ¥926,540 | 592.3% | 5.8% | |
| exp ◀ | 1,779 | 120 | ¥177,900 | ¥1,232,870 | ¥1,054,970 | 693.0% | 6.7% |
flowchart TD
subgraph Weekly["📅 週次(金曜)"]
W1["JRDB週次取得
金 05:30"]
W2["馬場データ収集
金 09:30"]
end
subgraph Hourly["🔄 常時"]
H1["JVLink Collector
毎時(1h interval)"]
end
subgraph RaceDay["🏇 レース当日(土日 09:00)"]
R1["race_signal_today.py"]
R2["Oracle特徴量生成
215 features"]
R3["LambdaRank推論
dirt=linear / turf=exp"]
R4["Isotonic Calibration"]
R5["pred_prob cap 0.80"]
R6["EV計算 + 戦略フィルタ"]
R7["Telegram通知
+ shadow_wfcv.tsv"]
end
W1 --> H1
W2 --> R1
H1 --> R1
R1 --> R2 --> R3 --> R4 --> R5 --> R6 --> R7
classDef weekly fill:#1e3a5f,stroke:#3b82f6,color:#bfdbfe
classDef hourly fill:#312e81,stroke:#818cf8,color:#c7d2fe
classDef race fill:#14532d,stroke:#4ade80,color:#dcfce7
classDef safety fill:#78350f,stroke:#fbbf24,color:#fef3c7
class W1,W2 weekly
class H1 hourly
class R1,R2,R3,R6,R7 race
class R4 race
class R5 safety
flowchart LR
subgraph Src["データソース"]
JV["JVLink COM
keiba-vm"]
JRDB["JRDB
週次ファイル"]
BABA["netkeiba
馬場情報"]
end
subgraph Store["Oracle 23ai"]
NL["NL_RA / NL_SE
NL_UM / NL_KS / NL_CH"]
JT["JRDB_HJA / JRDB_HJC
実払戻テーブル"]
BS["baba_snapshots"]
VW["VIEWS
RACES / RACE_ENTRIES
RACE_RESULTS / HORSES"]
end
subgraph ML["ML パイプライン"]
FE["oracle_features.py
215 features"]
TR["train_dirt.py / train_turf.py
WF-CV 4fold"]
MDL["models/
lambdarank_v28_*.pkl
calibrator_v28_*.pkl"]
SIG["race_signal_today.py
6戦略シグナル
Config D 賭け金"]
end
subgraph Out["出力"]
TG["📱 Telegram"]
LOG["📁 shadow_wfcv.tsv
signal_history.tsv"]
end
JV --> NL
JRDB --> JT
BABA --> BS
NL --> VW
VW --> FE
BS --> FE
FE --> TR --> MDL
FE --> SIG
MDL --> SIG
JT --> SIG
SIG --> TG
SIG --> LOG
classDef src fill:#1e3a5f,stroke:#3b82f6,color:#bfdbfe
classDef store fill:#312e81,stroke:#818cf8,color:#c7d2fe
classDef ml fill:#14532d,stroke:#4ade80,color:#dcfce7
classDef out fill:#78350f,stroke:#fbbf24,color:#fef3c7
class JV,JRDB,BABA src
class NL,JT,BS,VW store
class FE,TR,MDL,SIG ml
class TG,LOG out