# 06. ベース予想・期待値予想 仕様

## 用語

| 名称 | profile_key | 説明 |
|------|-------------|------|
| **ベース予想** | `base_forecast` | オッズ・期待値を入れる**前**の予想。全馬の順位・◎〇▲△・勝率見立て |
| **期待値予想** | `ev_forecast` | ベース予想に単勝オッズを掛けた期待値層を載せたもの。**公開画面はこちら** |

`p6_latest` は廃止。CLI の `--profile p6_latest` は `ev_forecast` へのエイリアス（後方互換のみ）。

---

## 処理の全体像

```
┌─────────────────────────────────────────────────────────┐
│ ベース予想（オッズ無し）                                  │
│  ① 特徴量 → LightGBM → 第2段階補正 → 堅実順位            │
│  ② 全馬に勝率見立て（按分しない）                         │
│  ③ ◎〇▲△ = 堅実順位 1〜4 位                            │
└─────────────────────────────────────────────────────────┘
                          ↓
┌─────────────────────────────────────────────────────────┐
│ 期待値予想（ev_forecast のみ）                           │
│  ④ 確定単勝オッズを付与                                   │
│  ⑤ expected_roi = (win_rate - min_prob) × odds × 100   │
│  ※ ◎の付け替えはしない                                   │
└─────────────────────────────────────────────────────────┘
```

---

## ベース予想（詳細）

### 入力
- レース・出走馬・過去走（直近10走）
- LightGBM モデル（`--model-path` / `--model-meta-path`）

### ステップ

| # | 処理 | モジュール | 内容 |
|---|------|------------|------|
| 1 | 特徴量 | `ai/feature_engineering.py` | 近走・芝ダ・距離・競馬場・上がり・斤量など |
| 2 | モデルスコア | `ai/stage1_screening.py` | `model_win_prob`（0〜1）を保存。`score` = prob×100 |
| 3 | 第1.5段階 | — | **OFF**（ベース予想・期待値予想とも） |
| 4 | 第2段階 | `ai/stage2_factors.py` | コース適性・展開・騎手・競馬場ナレッジで加減点 |
| 5 | スコア拡散 | `_apply_within_race_score_spread` | 同一レース内の差をやや強調 |
| 6 | 足切り判定 | `passed` | 通過率50%の閾値（順位ではない） |
| 7 | 堅実順位 | `ai/win_rate.assign_rank_accuracy` | `score_accuracy` 降順で 1〜N 位 |
| 8 | 勝率見立て | `ai/win_rate.assign_win_rates` | 全馬に `win_rate` を付与（下記） |

### 勝率見立てのルール

- **按分しない**（全馬合計100%が目的ではない）
- 基本値: `model_win_prob`（LightGBM 生出力）
- **切（0%）**:
  - `model_win_prob < 0.5%`（`below_threshold`）
  - `passed=false`（第1段階足切り、`stage1_screen_fail`）
- 順位が下だから切る、は**しない**

### 印

| 印 | 堅実順位 |
|----|----------|
| ◎ | 1位 |
| 〇 | 2位 |
| ▲ | 3位 |
| △ | 4位 |

---

## 期待値予想（詳細）

ベース予想の ①〜⑧ を**そのまま**実行したあと、以下を追加する。

| # | 処理 | モジュール | 内容 |
|---|------|------------|------|
| 9 | オッズ付与 | `ai/stage3_value.attach_win_odds` | `odds_lines`（tansho）→ `win_odds` |
| 10 | 期待値 | `ai/stage3_value.apply_ev_forecast` | 下記式 |

### 期待値の式

```
effective_prob = max(0, win_rate - min_prob)
expected_roi   = effective_prob × min(win_odds, odds_cap) × 100
```

既定パラメータ（`ai/prediction_profiles.py`）:
- `min_prob` = 0.03
- `odds_cap` = 80

### やらないこと

- `win_rate` の全馬按分（合計100%化）
- `prob × odds` による◎の付け替え
- オッズを使った順位の上書き

---

## 本命自信度

- モジュール: `ai/race_confidence.py`
- ◎（堅実1位）の「自信度」0〜100
- スコア差・◎の `win_rate`・競馬場の過去実績を合成
- 勝率そのものではない（賭け金目安）

---

## 取込・再計算

```bash
# ベース予想のみ
python3 scripts/import_all_race_ai_compare_profiles.py --profile base_forecast

# 期待値予想（公開用）
python3 scripts/import_all_race_ai_compare_profiles.py --profile ev_forecast

# 両方
python3 scripts/import_all_race_ai_compare_profiles.py --profile all
```

オッズ取込後の再予想:

```bash
./scripts/repredict_ev_after_odds.sh
```

DB テーブル: `all_race_ai_profile_compare`（`profile_key` = `base_forecast` / `ev_forecast`）

---

## 予想1〜5（legacy）との関係

`p1_pundit` 〜 `p5_value` は `forecast_pipeline=legacy` のまま維持（比較・検証用）。
公開の「最新予想」は **期待値予想（ev_forecast）** のみ。

---

## 変更履歴

- 2026-06-02: `p6_latest` / `prob_odds` による◎付け替えを廃止。ベース予想・期待値予想に再編。
