今回は「今まで作ったものと全然違う」
1作目は金種計算ツール、2作目は合成オッズ計算機、3作目はLINEに手紙を届けるアプリ。どれもWebアプリとして画面を作る開発でした。
4作目は、方向性をガラッと変えました。
競馬のレース結果をAIで予測するシステムを作る。
画面はありません。Pythonでデータを集めて、機械学習モデルを訓練して、予測を出す——いわゆる「データサイエンス」の領域に踏み込んだ開発です。
使ったことのない言語、使ったことのないツール、理解していない概念ばかりでした。正直「自分にできるのか」と何度も思いました。でも、Claude Codeと一緒にやり切りました。
なぜ競馬AIを作ろうと思ったのか
きっかけは単純で、「競馬のデータって公開されているから、予測モデルが作れるんじゃないか」という思いつきです。
競馬は数字のスポーツです。着順・タイム・オッズ・馬体重・騎手・調教師・血統——膨大な数値データが毎週蓄積されていきます。これをうまく使えば、何か見えてくるのでは?
「AIが競馬を予測する」という研究は世界中で行われています。でも自分で一から作ってみることに意味があると思い、挑戦しました。
プロジェクト名は「Project Aegis」
開発コードネームを Project Aegis(イージス) としました。イージスは守りの盾という意味です。「リスクから資金を守る」という意思を込めました。
プロジェクトの全体像はこうです。
- データ収集: 過去のレース結果をスクレイピングで集める
- Eloレーティング計算: 馬の強さを数値化する
- 特徴量エンジニアリング: 予測に使う情報を整理する
- 機械学習モデルの訓練: LightGBMで着順を予測する
- 結果の評価: どれくらい当たるかを測る
順番に説明します。
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@5 | 0.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 までどうぞ!
