
【競馬AI開発#29】全馬券種の直前オッズデータを抽出・加工する方法
この【競馬AI開発】シリーズでは、競馬予想AIを作ることを通して、機械学習・データサイエンスの勉強になるコンテンツの発信や、筆者が行った実験の共有などを行っています。
■今回やること
競馬予想AIを開発するにあたって、単に「どの馬が勝ちやすいか」を予測するだけでなく、その馬券の期待値を正確に計算することが重要となってきます。
期待値 = 的中確率(機械学習で予測) × オッズ競馬のオッズはレース直前まで刻々と変化し、特に発走直前のオッズは実際に馬券を購入する際の判断材料として非常に重要です。
しかし、多くの競馬サイトで提供されているオッズデータは、レース終了後に確定したオッズであり、実際に購入時点で表示されていたオッズとは異なります。
そこで、正確な「レース直前オッズ」を取得したいと思った時、以下の二つのどちらかの方法を取る必要があります。
JRA-VAN DataLab.の有料サービス
過去レースの「直前オッズ」をすぐに取得できる
ただし、単勝・複勝・枠連・馬連の4種類の馬券のみで、取得間隔も5〜10分と限られている
JRA公式サイトからスクレイピングしてデータを溜める
すべての馬券種(単勝・複勝・枠連・馬連・ワイド・馬単・三連複・三連単)に対応
自由な間隔(例: 1分ごと)でデータを取得可能
ただし、データが溜まるまで待つ必要がある
1については、前回の記事で取得方法を詳しく扱いました。
今回は、2の方法により、スクレイピングしたhtmlを一発でpandas.DataFrameの形の加工するソースコードを完成させていきます。
extractor = OddsExtractor()
# 抽出したい期間を指定
extractor.collect_html_paths(start_date="20250301", end_date="20250315")
extractor.extract_odds_sanrentan()

特にワイド・三連複・三連単といった組み合わせ馬券の直前オッズを取得できるのは、調べて限りではこれが唯一の方法になると思います。
ソースコードのダウンロード
■ディレクトリ構成
jra_odds/
└── by_scraping/
├── src/
│ ├── scrape_jra_odds.py # JRAから直前オッズのスクレイピングをするクラスを定義
│ ├── execute.py # スクレイピングを実行するスクリプト
│ ├── extract_odds_table.py # htmlからオッズテーブルを抽出するクラスを定義
│ ├── main.ipynb # htmlからオッズテーブルを抽出する処理を実行
│ └── dev.ipynb # 開発用・動画デモンストレーション用ノートブック
└── data/
├── html/
│ └── 20250215/ # 開催日
│ ├── time_table.csv # 発走時刻テーブル
│ └── 202505010501/ # レースID
│ ├── 0_YYYYMMDDHHMMSS.html # 単勝・複勝
│ ├── 1_YYYYMMDDHHMMSS.html # 枠連
│ ├── 2_YYYYMMDDHHMMSS.html # 馬連
│ ├── 3_YYYYMMDDHHMMSS.html # ワイド
│ ├── 4_YYYYMMDDHHMMSS.html # 馬単
│ ├── 5_YYYYMMDDHHMMSS.html # 3連複
│ └── 6_YYYYMMDDHHMMSS.html # 3連単
└── table/
├── odds_tanpuku.csv # 単勝・複勝の加工済みオッズテーブル
├── odds_umaren.csv # 馬連の加工済みオッズテーブル
├── odds_wide.csv # ワイドの加工済みオッズテーブル
├── odds_umatan.csv # 馬単の加工済みオッズテーブル
├── odds_sanrenpuku.csv # 三連複の加工済みオッズテーブル
└── odds_sanrentan.csv # 三連単の加工済みオッズテーブル