
【競馬AI開発#25】 全馬券種の直前オッズを無料で取得する方法
この【競馬AI開発】シリーズでは、競馬予想AIを作ることを通して、機械学習・データサイエンスの勉強になるコンテンツの発信や、筆者が行った実験の共有などを行っています。
■今回やること
今作成している競馬予想AIでは、各馬の予測勝率とオッズから期待リターンを計算しているため、予測勝率だけでなくレース直前のオッズを正確に取得する必要があります。
$$
\text{期待リターン} = \text{機械学習による予測勝率} \times \text{オッズ}
$$
本番運用時に使う単勝オッズを取得するソースコードについては、前回の記事で実装しました。
次に、シミュレーションに使うオッズを取得する方法について考えていきたいのですが、過去のレースについてWeb上に表示されている情報は、レース終了後の確定オッズしか存在しないので、実際に賭ける時のオッズとは乖離が発生してしまいます。
よって、通常はシミュレーションに使用する直前オッズの取得に「時系列オッズViewer」というソフトを使用する必要があるのですが、以下のようなデメリットがあります。
取得できる馬券種が限られている(単勝・複勝・枠連・馬連のみ)
取得間隔に制限がある(5~10分間隔)
JRA-VAN DataLabの会員になる必要がある(月額2,090円)
Windowsでしか動作しない
そこで、レース直前になったらスクレイピングが自動で実行されるようにスケジュールを組んでおき、シミュレーションに使う「直前オッズ」のデータを溜めておく方法を考えます。こうすることで、
全ての馬券種の直前オッズを
1分の取得間隔で
無料で
WindowsだけでなくMacでも
取得することができます。具体的には、以下のようなステップで自動取得システムを作成します。
netkeiba.comの開催ページから対象レースidと発走時刻を取得
JRA公式サイトから直前オッズをスクレイピングするコードを作成
1の発走時刻のn分前になったら2のコードを起動するようにスケジュール
サーバー上での運用など、スケジュール実行環境を整える
今回の記事では1と2について取り扱います。
もちろんこの方法では「これから開催されるレース」のデータしか取得できないので、十分なデータが溜まるまで待たなければいけないデメリットがありますが、今後の自動投票などの展開を考えても、一度このタイミングで、このような「スケジュール実行のための技術」を検証しておく目的も大きいです。
今回使用するソースコードは、以下からダウンロード・解凍すれば使うことができるので、適宜手元で参照・実行しながらお読みください。
■筆者のプロフィール
東京大学大学院卒業後、データサイエンティストとしてWEBマーケティング調査会社でWEB上の消費者行動ログ分析などを経験。
現在は、大手IT系事業会社で、転職サイトのレコメンドシステムの開発を行っています。
オッズ自動取得のステップ
上で紹介した各ステップについて、もう少し詳しく見ていきます。
■ステップ1:発走時刻テーブルの取得
まずはnetkeiba.comの開催ページから、(race_id, 発走時刻)の組を取得します。

https://race.netkeiba.com/top/race_list.html?kaisai_date=20250111

これで、このテーブルを使えば、「post_timeのn分前」に「スクレイピング対象のrace_id」を指定するように、スケジュール実行コードを作成することができます。
■ステップ2:直前オッズの取得
JRA公式サイトから直前オッズを取得するコードを作っておきます。

# JRAからオッズのHTMLを取得
await scraper.scrape_odds_html(race_id="202506010209")

このように、レース直前の時刻におけるページ全体のhtmlさえ溜めておけば、後から様々な加工方法を考えることができます。
■ステップ3:スケジュール実行の設定
ステップ1で取得したタイムテーブルを用いて、各発走時刻のn分前にステップ2のコードを自動実行するようにスケジュールを組んでおきます。
■ステップ4:運用環境の選択
ステップ3の自動実行コードをローカルPCで実行しても良いですが、その場合PCを常時起動しておく必要があります。
そこで、今後の自動投票の運用に向けて練習にもなりますし、サーバーを借りてそこで実行する方法も検討していきます。
ソースコード
この記事が気に入ったらチップで応援してみませんか?