【競馬AI開発#32】Playwrightを使った馬券の自動投票システムを構築する
この【競馬AI開発】シリーズでは、競馬予想AIを作ることを通して、機械学習・データサイエンスの勉強になるコンテンツの発信や、筆者が行った実験の共有などを行っています。
■今回やること
これまでのシリーズでは、機械学習モデルの構築や期待値に基づく馬券購入戦略のシミュレーションまでを実装してきましたが、いよいよ実際の馬券購入を自動化する方法について解説します。
機械学習モデルで期待値の高い馬券を特定しても、すべてのレース・馬券の組み合わせを人間が手作業で投票するのは時間的に限界があり、刻々と変化するオッズに応じて期待値も変動するため、レース直前のタイミングで素早く投票する必要があります。
そこで、今回はPythonのPlaywrightライブラリを使用して、JRAの「IPAT」システムに自動ログインし、指定した馬券を自動購入するプログラムを作成していきます。
今回紹介する技術は、競馬だけでなくウェブサイト上の様々な作業を自動化するにあたっても、かなり応用範囲が広いと思います。
▼実際の実行の様子
下記のようなsample_dfに対して、
以下を実行することで画面が自動で遷移して投票が行われます。
voter = IPATVoter(kaisai_date="20250503")
voter.vote(race_id="202505020301", bet_df=bet_df, auto=False)意図しない投票を防ぐため、auto=Falseを選ぶと「購入」ボタンは自分で押すように設計しています。もし購入完了まで完全に自動化する場合は、
voter = IPATVoter(kaisai_date="20250503")
voter.vote(race_id="202505020301", bet_df=bet_df, auto=True)を選択できます。
【免責事項】
本記事で紹介する自動投票システムは、教育・研究目的で解説するものであり、実際の馬券購入を推奨するものではありません。
また、馬券購入に関わる自動化プログラムは、サービス提供者のシステムに過度な負荷をかけないよう、適切な間隔をあけて実行するなどの配慮が必要です。
なお、情報の正確さ・安全性の向上・不都合に対するサポートなどに対しては可能な限り力をいれておりますが、プログラムの実行に伴う損失や法的問題について、著者は一切の責任を負いませんので、このシステムを使用した馬券購入は自己責任で行ってください。
ソースコードは、下に進んでダウンロード・解凍すれば使うことができるので、適宜手元で参照・実行しながらお読みください。
ソースコードのダウンロード
■ディレクトリ構成
keibaAI-v3
├── .env ・・・IPATへのログイン情報を記載(各自で設定)
└── v3_3_0
└── src
├── dev.ipynb ・・・動画中で使用していたnotebook
└── auto_vote.py ・・・自動投票を行うクラスを定義■筆者の実行環境
・OS: Mac OS 14.2.1
・言語: Python 3.11.4
・エディタ: VSCode 1.99.2
VSCodeやPythonのインストール方法については様々な記事で紹介されているので、適宜参照して設定してください。
また、プロジェクト内では以下のライブラリを使用しています。(requirements.txt参照)
apscheduler==3.11.0
beautifulsoup4==4.12.3
lightgbm==4.5.0
matplotlib==3.8.2
numpy==1.26.4
pandas==2.2.2
playwright==1.49.1
python-dotenv==1.0.0
PyYAML==6.0.1
scikit_learn==1.4.0
selenium==4.23.1
tqdm==4.66.1
webdriver_manager==4.0.2ここから先は

【定期マガジン】競馬AI研究所
「競馬予想AIを1から作る」ことを通して、機械学習・データサイエンスの勉強になるコンテンツの発信や、筆者が行った実験の共有などを行っていき…
この記事が気に入ったらチップで応援してみませんか?


購入者のコメント
2v3_3_0で検証すると回収率が64%になってしまいます。
odds_sourceはjra-vanで20240217~20250504までのodds_tanpuku.csv、odds_umaren.csvがあります。by_scrapingはデータなし。Datasetやcreate_population.createなどの期間はダウンロードした時点から変更していません。
何かわかりそうでしたらアドバイスお願いします。
best result:
{'expect_return': 1.6484848484848484,
'n_hits': 7.0,
'return_rate': 0.6481566820276498,
'sharp_ratio': -1.2994004235773058,
'std': 0.27077359033307863,
'total_bet': 434.0,
'total_payoff': 281.3}
興味深く拝見しています