AIで競馬予想する仕組みを作ってみる。【競馬編#1】

IT

皆さんはどのように競馬予想をしていますか?

今の時代には、様々な媒体(競馬新聞やスピード指数、予想屋など)にて、
無料から有料まで幅広く、競馬予想の情報が介在しています。

最近ではこのようなコンテストも開かれています。

日本一の競馬予想AIを決めるAI大会を開催!AI競馬予想マスターズ2023 | netkeiba.com
最も優れたAI予想家を決めようじゃないか!よく当たり・よく儲かるAIはどのAIか?netkeiba presents AI競馬予想マスターズを開催!

AIによる競馬予想は、精密に順位予想することができるそうです。

しかし、機械学習による競馬予想で一躍有名になったMambaのサイトにある文章を読んでもらうと分かるのですが、

テストデータセット(中央競馬の2017年7月〜2018年6月の全レース)で、Mambaが各レースの「最も1着になる確率が高い」と予測した馬の単勝馬券を購入し続けたとき、その的中率は約31.9%、回収率は79.3%でした。(表1)

同期間において、1番人気の的中率は約31.6%、回収率は75.7%でした。 したがって、この集計方法では、Mambaは1番人気よりも0.3ポイント的中精度が高いと言えます。 年間のレース数は3500ほどですので、1番人気より年間で約10回多く的中したということですが、圧倒的な差があるとは言い切れません。 回収率も、1番人気を購入し続けた場合よりも3.6ポイント高いものの、概ね単勝馬券の控除を引いた払戻率に収束しています。 多くの人が様々なデータを用い、優れた予想を行った結果形成されるオッズは精度が高く、各馬券の的中確率をおおよそ言い当てていると考えられます。

https://dmv.nico/ja/articles/keiba_ai_mamba_article/

AIによる精密な順位予想で全てのレースに挑んだ場合の単勝回収率は、1番人気の単勝回収率に近似・収束してしまいます。つまり、精密な順位予想だけでは競馬予想は不十分と言えます。

今回は、
AIを用いた競馬予想を実現するべく、まずは機械学習で順位予想をする仕組みを構築してみました。

はじめに

本題に入る前に、ブログ管理者の経歴を書き残しておきます。

  • Python歴:ほぼ0年間(C言語、Java、HTML、SQLが分かるレベル)
  • 競馬歴:5年間(たまに競馬をやる。オッズやボックス買い、競走馬の血統が分かるレベル)

競馬でどのように馬券を買えばよいかは分かるものの、Pythonが絡む技術は全く分かっていませんでした。

この間にスクレイピングを学んだばかりだったので、データを取ってくるところはすぐにわかったのですが、データを入れる先のデータフレームの考え方までは修得しておらず、
「pandasって何?美味しいの?」という理解度しかありませんでした。

このような残念な状態から、おおよそ1カ月程度で機械学習で順位予想する仕組みの構築まで進めました。

参考にしたサイト

以下のサイトを参考に構築しました。

いずれのサイトの手法もPython上で、

  • データフレーム(Pandas)
  • スクレイピング(selenium)
  • 機械学習(LightGBM)

の3点をベースに仕組みを構築しています。

ちなみに、いずれのサイトも仕組みの本質は同じです。

競馬予想で始める機械学習〜完全版〜
競馬予想AIを作りながら機械学習の勉強ができるYouTubeチャンネル「競馬予想で始めるデータ分析・機械学習」の内容に沿って、競馬予想AIのソースコードを全て公開します! 一度購入した後も、ソースコードは随時更新されていきます。
第1回 競馬予想プログラムを作りたい [機械学習、python, lightGBM] - 工学系大学院生のブログ
競馬の予測を行います

開発環境

開発環境は以下の通りです。一般的な方よりもCPUとRAMに性能に自信があります。

  • OS:Windows10 Pro
  • CPU:Intel Core i9 (11世代)
  • RAM(メモリ):64GB
  • SSD:1TB
  • その他:Virtual Studio Code + WSL2

率直な感想

めっちゃ疲れました…。

ぶっちゃけ、Githubで公開されているコードを落とすだけではうまくいかないことが多いです。
これは今回に限った話ではなく、ITに絡む場面では頻繁に起こりうることです。
そして、こういう時こそITエンジニアとしての腕が試されるところでもあります。

今回の機械学習の構築においては、

  • 過去10年間のデータをスクレイピングするのに約2週間
  • 機械学習の仕組みを動かすためのデバッグに約2週間

計1ヵ月間もかかりました。

個人的には、デバッグ作業を通して得られる知識はとても多く、かなり良い経験になったと思っています。(また、実際に動いた仕組みでお金を稼ぐことができれば、相当な自信にも繋がるでしょう。)

しかし、競馬予想を機械学習で実現しようと考えられている方(ITエンジニアも含む)の多くはこのデバッグで挫折されているのではないかと思います。

これから自前の競馬予想を構築される方のために「自前のAI競馬予想を難しくさせる要因」をまとめてみました。参考になれば幸いです。

自前のAI競馬予想を難しくさせる要因①:コードが壊れている

単純にコードが壊れていることがあります。

その原因は、

  1. 現在とコードを書いた時点とで、ソフトやパッケージのバージョンに大きな差が発生してしまい、引数の渡し方が変更になっている場合
  2. コード作成者が、コード改修やリファクタリング(ソフトウェアの挙動を変えることなく、その内部構造を整理する)に失敗している場合

と大きく2つに分けられると思います。

1の場合は、エラー文をGoogle検索することで対処法が見つかることが多いので早期解決できることが多いです。

しかし、2の場合は、コードの内部構造を理解して自分自身でデバッグしなくてはなりません。

骨が折れますが、コードをしっかり読み解きつつ、そのコードの入手先のGithubにあるIssue(解決済みのものも含む)も確認してみましょう。

自前のAI競馬予想を難しくさせる要因②:計算リソースが不足している

計算リソースとは、CPU・RAM(メモリ)・GPU(グラボ)・SSD(HDD)らの性能を意味します。

快適に機械学習するためには、そこそこのCPUまたはGPUが必要です。
また、データを保持するためのRAMやSSDも必要です。
(SSD上の競馬予想関係のコード・データは全部で7GB程度でした)

ゲーミングPCをお持ちの方は、あまり性能不足に悩まされることはないと思いますが、性能不足で困っている人は何かしらの方法(性能の良いPCを買う、Google Colaboratory:Colab,etc.を利用する)で解決する必要があります。

自前のAI競馬予想を難しくさせる要因③:スクレイピングに時間がかかる

初回に限り、とても時間がかかります。こればかりはしょうがないです。

賢い方法としては、分散コンピューティングを用いる方法があります。
(しかし、それを実装している間に、過去10年間のデータは落としきれると思います。別のことをして有意義に時間を使いましょう。)

自前のAI競馬予想を難しくさせる要因④:そもそも精密な順位予想だけでは意味がない

AIは順位予想を確率で提示しますが、その確率だけで馬券の購入をしてしまうのは危険です。

馬券購入にあたっては、期待値(あるいは、それに準じた指標)を算出することをおすすめします。

精密な順位予想だけでは意味がなく、オッズも判断材料に加えた上で適切な買い目(どのような馬券で、どの馬に、いくら賭けるか)を見出す必要があります。

期待値(見返り)が少ないレースであれば、そのレースは馬券を買わずに見送るという選択も重要になってきます。(麻雀でいう、オリの判断と同じです)

今後の展望

競馬で勝つには精密な順位予想だけでは足りないということを説明しました。

要約すると、

  1. 精密な順位予想をしつつ、[機械学習]
  2. 勝負するレースとそうでないレースを見極め、[強化学習#1]
  3. 勝負するレースで(平均)期待値が最も高い馬券を、[強化学習#2]
  4. 買い続けていく[軍資金]

以上の取り組みが必要です。

また、今回せっかく機械学習のモデルを組んでみたので、2024年からは競馬予想を公開していこうと思います!

おわり