【競馬アプリ】新馬チェッカーを作った話。Claude Codeとのやり取りは、思っていたより人間くさかった

AI競馬アプリ
スポンサーリンク
スポンサーリンク

新馬戦を見ていると「この馬、走るな」と思うことがたまにあります。でも正直、そのままにしてしまうんですよね。秋になって重賞を勝った馬の戦績を見て「あ、あの新馬戦の馬だ」と気づく。毎年その繰り返しでした。

だったら、新馬戦の時点で気になった馬を記録して、ちゃんと答え合わせまでしてくれる仕組みを作れないか。今回はその「新馬チェッカー」というアプリを、Claude Code(AI)とどうやって作っていったか、というやり取りの中身を書いてみようと思います。前に書いたnoteはアプリの紹介が中心だったので、今回は制作過程のほうです。

最初に伝えたのはコンセプトだけ

僕がClaude Codeに伝えたのは、こんな感じの方針でした。TARGET(僕が28年使っている競馬データソフト)のデータをフル活用して、新馬戦から注目馬をピックアップする。過去の重賞勝ち馬を遡って、新馬戦でどんな走りをしていたかを調べ、基準を作る。毎週、成績データを更新したらチェッカーを走らせて、注目馬をWebアプリに出す、と。

技術的な実装は僕は一切していません。日本語で「こういうアプリが欲しい」と伝えただけです。

AIの提案が、AI自身のデータで却下される

面白かったのはここからです。まず過去5年分の平地重賞勝ち馬474頭について、デビュー戦がどうだったかを全部調べてもらいました。結果、新馬戦を勝っていた馬が49%、負けたけど2戦目で勝った馬が27%。合わせると76%が2戦目までに勝ち上がっている。この数字が出た時点で「新馬戦とその直後だけ見ればいい」という方針に自信が持てました。

で、そのあとの基準作りの過程で、AI自身が「同じ日の未勝利戦と時計を比べれば馬場差を消せます」と提案してきたんです。もっともらしい話だったので、じゃあそれで、と進めてもらったのですが、実際に過去のレースに当てはめて検証したら、芝ではほとんど効果がありませんでした。ダートでは効くのに、芝では無効。AIは自分の提案を、自分の検証であっさり却下していました。ここはむしろ信用できるところだなと思います。

代わりに効いていたのは、レースの前半と後半どちらが速かったかを表す指標(後半が速い、いわゆるスローの上がり勝負を差し切った馬)や、TARGET独自の補正タイム指数でした。ダートでは補9という指数が一番効いていて、数値が100を超える馬は重賞馬率が35.7%まで跳ね上がる、という結果も出ました。感覚ではなく、数字で基準を組み立てていく感じが新鮮でした。

文字化けと、補9が届いていなかった話

順調に見えて、実はちゃんとつまずいています。

週次で回すためのバッチファイルを作ってもらったんですが、実行したら「〒謌千クセ繝・・繧ソ」みたいな謎の文字列が出て動かない。原因を聞いたら、AIがファイルを新しい文字コード(UTF-8)で書いてしまっていたことが分かりました。Windowsのバッチファイルは古い形式(Shift-JIS)じゃないと日本語のコメントが化けてしまうんです。これを伝えたら、すぐに書き直して直してくれました。

その数日後には「先週の新馬戦がリストに出てこない」という別のトラブルも起きました。調べてもらったら、TARGET側で補9というデータがその週だけ未登録で、全馬が本来より低く採点されていたのが原因でした。データを取得して再実行したら直ったんですが、実はその次にもう一度「まだ出てこない」と伝えたんですよね。今度こそバグかと思ったら、これは正常でした。その週はたまたま基準を超える馬がいなかっただけで、アプリはちゃんと仕事をしていたんです。

でも、これはこれで問題でした。注目馬が0頭の週は画面に何も表示されないので、動いていないのか、単に該当馬がいないのか区別がつかない。なので「直近のチェック済み新馬戦」という欄を追加してもらって、0頭でも「何レース見て、一番点数が高かった馬は何点だったか」が分かるようにしました。沈黙と故障の区別がつかないと、道具として信用できないんですよね。

「最終地点はダービーとオークス」と伝えたら、中身が変わった

作っている途中で、僕はこう伝えました。新馬に注目するのは、クラシックロードで活躍するかを見たいから。最終地点はダービーとオークスで、そのあとは古馬混合になって鮮度が落ちる。時計が優秀で新馬を勝っても2戦目が走らなければ意味がないし、逆に時計が平凡でも2戦目を勝って重賞に届く馬を拾いたい、と。

そうしたら、アプリの「正解の定義」まで変わりました。それまでは「いつか重賞を勝てば成功」だったのが、「デビューから3歳の6月末まで、つまりダービー・オークスまでに重賞を勝つ」に絞られて、それを過ぎた馬は評価を凍結する仕組みになりました。使命をひとこと伝えただけで、道具の中の判定ロジックまで作り直されたのは、ちょっと不思議な感覚でした。

この定義変更で分かったこともあって、ダート路線は3歳6月までにJRAの重賞がほぼ存在しないので、クラシックという観点では参考程度にしかならない、ということが数字ではっきり出ました。逆に2戦目の勝ち方は新馬戦以上にシグナルが強くて、連勝している馬の重賞到達率は4割超え、というのも分かりました。

過去2世代の皐月賞・桜花賞・ダービー・オークス、合わせて8レースにこの基準を当てはめてみたところ、5レースの勝ち馬を新馬戦か2戦目の時点で拾えていました。ちなみにこれはあくまで過去のデータへの当てはめの話で、実戦の成績ではありません。念のため。

人間の眼とAIの、静かな勝負

もうひとつ、途中でこんなやり取りがありました。函館の新馬戦をコースレコードで勝った馬がいて、僕は「これは時計もレースぶりも良い」と思ったんですが、AIの基準では点数が足りず見送りになっていました。なので「僕の注目馬」として手動で登録できる仕組みを作ってもらいました。

これが地味に良い仕組みで、登録したときにAIの基準が何点だったかも一緒に記録されるんです。つまり、僕の勘とAIのロジック、両方が同じリストの上で答え合わせされる。どちらが正しかったかは、その馬が実際に走るかどうかで決まります。

そしてある日、僕はこう伝えました。最終的には人間の目を介さずにAIだけで的中率を上げていきたい、と。僕の注目馬は、いわばAIの対戦相手というわけです。今のところ、AIのロジック単体の的中率は10.5%で、目標にしている15%にはまだ届いていません。四大クラシックは8レース中3レースを取りこぼしていて、その内訳を見ると「2戦目で重賞にいきなり直行して勝つ馬は、新馬戦の時点では点数が伸びにくい」という弱点も見つかっています。負けを認めて、次の改良の材料にする、という段階です。

できたのはここまで、実戦はこれから

というわけで、新馬チェッカーは今のところこんな形になりました。週末にTARGETのデータを更新してバッチファイルを実行すると、新馬戦の注目馬が自動で抽出されて、騎手のコメントやスポーツ紙の記事まで添付された状態でWebページに出てくる。過去のデータをもとに作った基準ですが、実戦の答え合わせはこれからです。今年デビューした世代が来年のクラシックを迎えたときに、初めて本当の成績が分かります。

正直、この2日間だけでもcp932の文字化けやら、補9の届いていないデータやら、細かいところで何度もつまずきました。でもその都度、伝えれば直る、直ったところからまた次の課題が見える、というのを繰り返していたら、いつのまにか結構ちゃんとしたアプリになっていました(^^ゞ

競馬予想が当たるかどうかは別として、自分の見立てとAIのロジックを同じ土俵で競わせる仕組みを作れたのは、なかなか面白い体験でした。来年のダービー、オークスが終わったら、また答え合わせの結果を報告しようと思います。

※本アプリは個人使用を目的に作成されています。

サンプル 新馬チェッカー

コメント