【個人開発】競馬AIを作った話。5年分のデータを集めてLightGBMで予測してみた

個人開発記録

今回は「今まで作ったものと全然違う」

1作目は金種計算ツール、2作目は合成オッズ計算機、3作目はLINEに手紙を届けるアプリ。どれもWebアプリとして画面を作る開発でした。

4作目は、方向性をガラッと変えました。

競馬のレース結果をAIで予測するシステムを作る。

画面はありません。Pythonでデータを集めて、機械学習モデルを訓練して、予測を出す——いわゆる「データサイエンス」の領域に踏み込んだ開発です。

使ったことのない言語、使ったことのないツール、理解していない概念ばかりでした。正直「自分にできるのか」と何度も思いました。でも、Claude Codeと一緒にやり切りました。


なぜ競馬AIを作ろうと思ったのか

きっかけは単純で、「競馬のデータって公開されているから、予測モデルが作れるんじゃないか」という思いつきです。

競馬は数字のスポーツです。着順・タイム・オッズ・馬体重・騎手・調教師・血統——膨大な数値データが毎週蓄積されていきます。これをうまく使えば、何か見えてくるのでは?

「AIが競馬を予測する」という研究は世界中で行われています。でも自分で一から作ってみることに意味があると思い、挑戦しました。


プロジェクト名は「Project Aegis」

開発コードネームを Project Aegis(イージス) としました。イージスは守りの盾という意味です。「リスクから資金を守る」という意思を込めました。

プロジェクトの全体像はこうです。

  1. データ収集: 過去のレース結果をスクレイピングで集める
  2. Eloレーティング計算: 馬の強さを数値化する
  3. 特徴量エンジニアリング: 予測に使う情報を整理する
  4. 機械学習モデルの訓練: LightGBMで着順を予測する
  5. 結果の評価: どれくらい当たるかを測る

順番に説明します。


Step 1:5年分のレースデータを集めた

まず必要なのはデータです。2021年〜2025年、全国10会場のレース結果をスクレイピングで収集しました。

スクレイピングとは、Webページの情報をプログラムで自動的に読み取ることです。手作業では絶対に無理な量のデータを、プログラムが代わりに集めてくれます。

収集したデータの規模はこうです。

項目件数
レース数約40,000〜50,000レース
出走記録約60万〜75万件
ユニーク馬約15,000〜20,000頭

これを集めるのに 約24〜30時間 かかりました。PCを動かしたまま寝て、起きたらまだ動いていた、という状況が何日か続きました。

Claude Codeがスクレイピングのコードを書いてくれましたが、「途中で止まっても続きから再開できる」という仕組みを設計してくれたのが助かりました。何度か途中で止まりましたが、そのたびに再実行するだけで続きから動いてくれました。


Step 2:Eloレーティングで馬の強さを数値化した

Eloレーティングという仕組みを使って、馬ごとの「強さ」を数値で表しました。

Eloレーティングはもともとチェスで使われているランキング方式です。強い相手に勝てば評価が上がり、弱い相手に負ければ大きく下がる——という仕組みです。これを競馬に応用しました。

初期値は全馬1500。強い馬に勝つたびに数値が上がり、弱い馬に負けると下がります。5年分のレース履歴を積み重ねることで、各馬の「実力値」が浮かび上がってきます。

この「チェスの仕組みを競馬に使う」というアイデアは面白かったです。実際にEloレーティングが予測モデルで一番重要な特徴量になったことが、後でわかります。


Step 3:89個の特徴量を用意した

機械学習では、予測に使う情報を「特徴量」と呼びます。今回は合計89個の特徴量を用意しました。

たとえばこんなものです。

  • 直近3・5・10戦の平均着順・勝率
  • 現在のEloレーティング・最高値・上昇トレンド
  • 騎手の勝率・平均着順
  • 調教師の勝率・平均着順
  • 同距離・同会場・同馬場状態での成績
  • 父馬(血統)の芝・ダート別成績
  • 出走間隔(何週ぶりのレースか)
  • 馬体重・体重変化

「これ、全部考慮しながら予想してたら頭爆発する」という量です。AIに任せることでこれを一度に処理できます。


Step 4:LightGBMで予測モデルを訓練した

LightGBMという機械学習ライブラリを使って、着順予測モデルを訓練しました。

LightGBMとは何か——簡単に言うと「大量のデータからパターンを学習して予測する」エンジンです。競馬予測では「このレースでこの馬が1着になる可能性が高い」を数値で出すことができます。

「ランキング学習」という手法を使いました。1着・2着・3着の順番を予測することに特化したアプローチです。


結果:1着的中率20%

モデルを訓練して、テストデータで評価した結果がこうです。

指標結果
1着的中率20.4%
3着内的中率40.5%
NDCG@50.787

1着的中率20%をどう見るか。

競馬は1レースに平均16頭前後が出走します。ランダムに選んだ場合の1着的中率は約6%です。AIは20%なので、ランダムの約3倍の精度ということになります。

もちろん「3倍当たるなら儲かるのか」という話は別で、オッズや賭け金の管理が重要になります。でも「データとAIで競馬を予測する」という実験としては、意味のある結果が出たと思っています。


重要だった特徴量TOP3

モデルが「何を重視して予測したか」も確認しました。

1位:Eloレーティングの百分位数

そのレースに出走した馬の中で、Eloレーティングが何パーセントに位置するか。「このレースでの相対的な強さ」です。絶対的な強さではなく相対評価が重要というのは、競馬をよく知っている人なら納得できる結果です。

2位:平均Eloとの差分

出走馬の平均Eloレーティングからの乖離。レース全体の水準と個別馬の差を見ています。

3位:距離

距離適性はやはり重要でした。短距離が得意な馬と長距離が得意な馬は違う、ということをAIも学習していました。


Claude Codeがなければ無理だった

今回の開発で、Claude Codeの力を一番強く感じました。

機械学習のコードは複数のファイルが複雑に絡み合います。データ収集・前処理・特徴量計算・モデル訓練・評価——それぞれ別のファイルで、お互いに連携しています。

Geminiのようなチャット型のAIでは、「このファイルとこのファイルを合わせてこう直して」という複雑な指示が伝わりにくいです。

Claude Codeはファイルを自分で読んで、複数ファイルにまたがる修正を一度にやってくれます。「Eloレーティングの計算がおかしい」と伝えると、関係するファイルを全部確認して、原因を特定して、修正してくれました。

この開発でClaude Codeなしだったら、おそらく完成していなかったと思います。


正直な感想

競馬をAIで予測するのは、思っていたより奥が深かった。

データを集めるだけでも大変で、特徴量を考えるだけでも大変で、モデルを評価するだけでも大変でした。それぞれの工程に「なぜこうなるのか」という理解が必要で、理解するたびに新しい疑問が生まれる、という繰り返しでした。

でも、それが楽しかったです。

「自分が設計した仕組みで、データがパターンを見つけていく」という感覚は、Webアプリを作るときとはまた違うおもしろさがありました。


おわりに

Project Aegisはまだ進行中です。現在は予測モデルが動いている段階で、次は「どのレースにいくら賭けるか」という投資判断の部分を整備しています。

「競馬AIって作れるの?」と思っていた方の参考になれば嬉しいです。

感想・フィードバックは X(旧Twitter)@katasukeee08 までどうぞ!

タイトルとURLをコピーしました