競馬予想ツール「Apogee」の開発日記 - 機械学習で勝率を算出するまで

はじめに

以前の記事で競馬予想の自動化に再挑戦すると書いたが、その続報をお届けしたい。現在開発中の競馬予想ツール「Apogee」が、ようやく形になってきた。まだ作成途中ではあるが、自分のやりたいことが少しずつ実現できているので、途中報告として記録を残しておく。

開発の現状

実装済みの機能

レースごとに各馬の勝率・連対率・複勝率を算出する段階まで完了した。これが予想システムの核となる部分だ。機械学習と統計の手法を組み合わせて、過去のデータから各馬がどれくらいの確率で上位に入るかを計算している。

機械学習モデルの選定

予測モデルにはLightGBMを採用した。

モデルの学習プロセスでは、過去のレース結果から各馬の着順を予測するパターンを学習させている。単純な線形回帰では捉えきれない、非線形な関係性もLightGBMなら効果的に学習できる。

予測モデルはいろいろ試そうと思っているが、とりあえず有名どころから。

特徴量エンジニアリングの取り組み

現状の特徴量

特徴量は現時点で10個程度に留めている。本当はもっと増やしたいところだが、特徴量エンジニアリングをある程度しっかり固めてから進めたかったので、まずは基礎的なものに絞った。

具体的には以下のような要素を特徴量として使用している。

  • 馬の基本情報(年齢、性別など)
  • 過去の成績データ
  • コース適性
  • 距離適性
  • 馬場状態への対応
  • 調教データ
  • 騎手・調教師の情報

意図的に除外した要素

意図的に除外しているのが、オッズや人気だ。オッズは他の投票者の予想を反映したものなので、これを特徴量に入れてしまうと、自分の予想というよりも群衆の予想をなぞることになってしまう。

期待値を計算する際にはオッズを使うが、各馬の能力を純粋に評価する段階ではオッズに頼らないアプローチを取っている。

開発環境とツール

Claude Codeとの共同開発

開発はClaude Codeと一緒に進めている。仕様を伝えると、コードの実装からテストまで効率的に進められるのが素晴らしい。特に機械学習のパイプライン構築では、細かい処理の実装をClaude Codeに任せることで、自分は全体設計や特徴量の検討に集中できた。

技術スタック

Apogeeの開発には以下の技術を使用している。

フロントエンド

  • React + TypeScript
  • Tauri(デスクトップアプリ化)
  • Mantine(UIコンポーネント)

バックエンド・ML

  • Python 3.11+
  • LightGBM(機械学習モデル)
  • PostgreSQL(データベース)
  • pandas、NumPy(データ処理)
  • Optuna(ハイパーパラメータ最適化)

デスクトップアプリとして開発しているのは、リアルタイムでの予想更新や、大量のデータ処理を快適に行いたかったからだ。

実際の予想画面

実際の予想画面がこちらだ。先日のスプリンターズステークスのデータで表示している。

Apogeeの馬柱画面

馬柱形式で、各馬の勝率・連対率・複勝率がパーセンテージとバーで視覚的に表示される。この画面を見れば、どの馬が上位に来る可能性が高いのか一目で分かる。

ちなみにスプリンターズステークスは非常に難しいレースだった。G1レースらしく実力が拮抗していて、予想も難しかっただろう。特徴量が10個程度しかない現段階では、まだ予測精度は高くないと思う。これから特徴量を増やしていくことで、より正確な予想ができるようになるはずだ。

UI/UXの改善

レース一覧のカード型デザイン

レース一覧もカード型のデザインに変更した。従来のリスト表示よりも視覚的に分かりやすく、必要な情報にすぐアクセスできる。

Apogeeのレース一覧画面

ただ、まだ情報量が少し物足りない。今後は以下のような情報も追加していきたい。

  • レースグレード(G1、G2など)
  • 出走頭数
  • 賞金額
  • 馬場状態

もっと見やすく、使いやすいインターフェースにしていくのが目標だ。

今後の開発予定

特徴量の拡充

最優先は特徴量の追加だ。現在10個程度の特徴量では、競馬の複雑さを十分に表現できていない。以下のような特徴量の追加を検討している。

  • 血統情報の詳細分析
  • ペース予測
  • 枠順の影響
  • 馬体重の推移
  • 休み明けの影響

特徴量が増えれば増えるほど、より細かいパターンを学習できるようになる。ただし、増やしすぎると過学習のリスクもあるので、バランスを見ながら慎重に進めたい。

データ自動更新機能

現在はデータを手動で更新しているが、これを自動化したい。レース情報や出馬表が公開されたら、自動的にシステムに取り込んで予想を更新する仕組みを作る予定だ。

JRAネット投票連携

予想結果を基にした馬券購入をスムーズにするため、JRAのネット投票システムとの連携を検討している。期待値の高い買い目を自動的にネット投票の画面に渡せるようにしたい。

自動購入機能

最終的には、期待値の高いレースを自動的に購入する機能も実装したい。ただしこれはかなり先の話で、まずは予想精度を十分に高めることが先決だ。

開発を通じて学んだこと

機械学習の奥深さ

機械学習モデルを実際に使ってみて、その難しさを実感している。データの前処理、特徴量の設計、モデルの選定、ハイパーパラメータのチューニングなど、やるべきことは山積みだ。

ただ、課題を一つずつクリアしていく過程は面白い。モデルの精度が少しずつ向上していくのを見るのは楽しい。

データの重要性

よく言われる「データが全て」という言葉を実感した。どれだけ優れたアルゴリズムを使っても、データの質が悪ければ良い結果は得られない。前処理や特徴量の設計に時間をかけることの大切さを改めて感じている。

まとめ

競馬予想ツール「Apogee」は、まだ開発途中だが着実に進んでいる。機械学習で各馬の勝率を算出する仕組みは完成し、実際に動作している。

今後は特徴量の拡充やUI/UXの改善を進めて、より使いやすく精度の高いツールにしていきたい。長期的には自動購入まで視野に入れているが、焦らず一歩ずつ進めていくつもりだ。

引き続きClaude Codeと共に開発を進め、自分にとって本当に使いやすい競馬予想ツールを作り上げていく。完成したらまた報告するので、楽しみにしていてほしい。