# JRA-VAN 過去レース取得メモ（Manus 調査）

ユーザー提供: `JRA-VANデータ取得・分析 実践マニュアル（2020年以降・東京競馬場編）.md`

**今やること（STEP 1 から）:** [ops_jv_WINDOWS_STEPS.md](./ops_jv_WINDOWS_STEPS.md)

**Windows コマンドの書き方:** [ops_windows_cmd_guidelines.md](./ops_windows_cmd_guidelines.md)（cmd に貼る単位・`||` 禁止・bat 優先）

**oshim PC 固定パス:** `C:\Users\oshim\jrvltsql` / `venv32\Scripts\jltsql.exe`

## 結論（2026-06 追記）

**Manus が示した正ルートは `jrvltsql` → `keiba.db`（SQLite）→ Python で分析/取込。**

こちらが長時間試していた **Linux トンネル + pyjvlink setup(option=3/4)** は別経路。  
Windows 側 **JVLinkServer の COM 300秒制限**で 2020年 RA が取れず、`races` 2020年は **27件のまま**だった。

| 経路 | 用途 | 2020年 backfill |
|------|------|-----------------|
| **jrvltsql（Manus）** | Windows で JV-Link を直接使い `NL_RA`/`NL_SE` を SQLite に保存 | **推奨** |
| pyjvlink + SSH トンネル | Linux から差分取得・運用 cron | setup が通れば可。現環境は **COM timeout** |

---

## Manus 経路（推奨）

### 1) Windows で jrvltsql を入れて keiba.db を作る

```powershell
irm https://raw.githubusercontent.com/miyamamoto/jrvltsql/master/install.ps1 | iex
```

またはリポジトリ内:

```bat
cd C:\work\ai-horse-race.maspis.com.gitclone\scripts\windows
jrvltsql_fetch_2020_onwards.bat
```

**Manus 本線（どちらか1つ）:**

```bat
cd /d C:\Users\oshim\jrvltsql
quickstart.bat
```

対話: SQLite → **1) 簡易** → 開始 `2020-01-01` → 時系列 **N**

または **1年ずつ** RACE セットアップ（推奨・2020から）:

```bat
cd /d C:\Users\oshim\jrvltsql
venv32\Scripts\jltsql.exe fetch --from 20200101 --to 20201231 --spec RACE --option 4
```

2020 確認後に 2021, 2022 … と年を変える。2020〜2026 一括はしない。

→ `data\keiba.db` に `NL_RA`, `NL_SE`, `NL_HR`, `NL_O1`〜 等が入る。

**Manus に無い・使わない:** `jrvltsql.exe download`、`--spec O1` 単体、`--option 1` だけの過去一括（Imported 0 になりやすい）。

### 2) Manus サンプル（keiba.db を読む）

```python
import sqlite3
import pandas as pd

conn = sqlite3.connect(r"C:\Users\oshim\jrvltsql\data\keiba.db")
df = pd.read_sql_query("""
    SELECT Year, MonthDay, JyoCD, RaceNum, Hondai, Kyori, TrackCD
    FROM NL_RA
    WHERE JyoCD = '05' AND Year >= '2020'
    ORDER BY Year, MonthDay, RaceNum
""", conn)
print(len(df))
```

列名は `JvdYear` 等の別名がある場合あり。`import_jrvltsql_db.py` が別名を吸収する。

### 3) サーバー MySQL へ取込

```bash
# Windows から keiba.db をコピー
scp C:\Users\oshim\jrvltsql\data\keiba.db root@163.44.117.9:/root/keiba.db

# 新本番
cd /var/www/html/tools.kachiumaai.com
./scripts/import_keiba_db.sh /tmp/keiba.db 2020 2026
```

### 4) 完了判定

```sql
SELECT COUNT(*) FROM races WHERE circuit='JRA' AND YEAR(race_date)=2020;
-- 目安: 3000〜3500（全場。東京だけなら数百）
```

### 5) 払戻（回収率表示用・NL_HR）

`import_jrvltsql_db.py` は **NL_RA / NL_SE に加え NL_HR** を `payouts` へ取込する。  
既にレースだけ入っている場合は **払戻のみ** 再実行可:

```bash
./scripts/import_keiba_payouts.sh /root/keiba.db 2020 2026
```

完了の目安: `SELECT COUNT(DISTINCT race_id) FROM payouts WHERE bet_type='tansho';` が 1着確定レース数に近いこと。

### 6) 確定オッズ（p6 の勝率×オッズ・◎決定用・NL_O1）

払戻（HR）とは別。**レース前の全馬単勝オッズ**（確定オッズ）を `odds_lines` に入れる。

**カバレッジ確認（取込前に必ず）:**

Windows（cmd にそのまま貼る・1ブロック）:

```bat
cd /d C:\work\ai-horse-race.maspis.com.gitclone\scripts\windows
check_odds_count.bat
```

目安: `races_with_tanodds` が **18,000 以上**。

Linux サーバー:

```bash
python3 scripts/check_keiba_o1_coverage.py --sqlite /root/keiba.db
```

`with_odds` が年ごとに **レース数のおおむね80%以上** あること。  
`TanOdds` が NULL の NL_O1 行だけ多い keiba.db では、取込してもオッズは増えない（2026-06 時点で 6,730 / 22,308 レースのみ）。

**不足時（Manus 経路で RACE セットアップ再取得）:**

詳細: [ops_jv_o1_odds_troubleshooting.md](./ops_jv_o1_odds_troubleshooting.md)

`NL_RA_2020` が 6000 件あっても `TanOdds` が空のままなら、**option 1 では埋まらない**（差分のみ・Imported 0）。

```bat
cd /d C:\Users\oshim\jrvltsql
venv32\Scripts\jltsql.exe fetch --from 20200101 --to 20261231 --spec RACE --option 4
```

完了後に件数確認。`Imported` が 0 のままなら JV-Link / DataLab 契約を確認。

**取れたらサーバーへ（1ブロック）:**

```bat
cd /d C:\work\ai-horse-race.maspis.com.gitclone\scripts\windows
upload_keiba_to_server.bat
```

手動なら:

```bash
./scripts/backfill_odds_pipeline.sh /root/keiba.db
# 80%以上になったら p6 再予想:
./scripts/backfill_odds_pipeline.sh /root/keiba.db --repredict
```

取込のみ:

```bash
./scripts/import_keiba_odds.sh /root/keiba.db 2020 2026
```

取込後、p6 だけ再予想:

```bash
./scripts/repredict_p6_after_odds.sh
# またはバックグラウンド:
# nohup ./scripts/repredict_p6_after_odds.sh >> logs/import_p6_after_odds.log 2>&1 &
```

p6 の流れ（コード）: モデルでスコア → レース内で勝率100%に按分 → 各馬の勝率×確定オッズ → 最大が◎。

---

## pyjvlink トンネル経路（参考・現状は詰まり）

- option=1 だけでは 2020年 RA は足りない
- setup option=3/4 は **jv_open COM timeout（約300秒）** で失敗し続けた
- 試行ログ: `docs/ops_jv_fetch_param_results.md`

---

## 参照

- [jrvltsql](https://github.com/miyamamoto/jrvltsql)
- [JRA-VAN 蓄積系データの取得](https://support.jra-van.jp/jravan/detail?category=16&id=228)
- 取込スクリプト: `collectors/import_jrvltsql_db.py`
