【開発日記・完結】AIと「9割のレースを“見送る”競馬AI」を本気で作って、市場に負けた話(バックテスト編)

- 1.AIとゼロから競馬AIのバックテスト(過去データで買い方を検証する仕組み)を開発。本物のJRAデータに挑んだ完結編まで一気に読めます
- 2.きれいごと抜き。回収率149%の“ぬか喜び”、着順が全部ゼロの怪事件、そして本物のデータでの結末まで、失敗も数字も全部そのまま
- 3.結論から言うと、勝てませんでした。AIの1位馬13.7% vs 市場1番人気31.7%——市場に完敗し、1円も賭けずに撤退した理由を正直に書きます
この記事は「完成した攻略法」ではなく、進行中の“開発日記”です。姉妹編の『稼ぐ自動売買Bot編』に続いて、今回はAI(Claude Code)に『競馬AIを作って』とお願いしたら、どこまでいけるのか——その過程を、Day 1から順にリアルタイムで追記していきます。うまくいった日も、盛大に転んだ日も、隠さず書きます。プログラミング未経験でも楽しめるように書くので、AIで何かを作ってみたい人はブックマーク推奨です。
上から時系列(Day 1 → 最新)に並んでいます。いちばん下が最新の状況。数字は淡々と、事件が起きた日は熱く。そんな温度差ごと楽しんでください。※これは開発の記録であって、馬券の購入を勧めるものでも、当たる買い目を教えるものでもありません。
Day 1:下心「“期待値のある馬だけ”買えば勝てるのでは?」
きっかけは、いつもの下心です。「AIに過去の競馬データを全部読ませて、“オッズより強い馬”だけ買えば、理論上プラスになるやん?」。指はいつものように希望に満ちていました。ところがAIに『競馬AIのバックテストを作って』と頼むと、返ってきた最初の一言が予想外でした。『まず“買わないレースを決めましょう”』。……買う話をしてるのに、買わない話から始まった。
競馬AIの目的は「当たる馬を探す」ことじゃない。『人気と実力のズレを見つけて、割安な時だけ買い、それ以外は全部見送る』こと。“当てにいく”とだいたい負ける、というのがAIの第一声でした。
Day 2:まず“9割を捨てる”設計から始まった
AIが最初に書いたのは買い目でも予想でもなく、「買わないレースを弾くフィルタ」でした。曰く、条件が読みにくいレースで無理に張るのが一番の負けパターン。というわけで、こんなレースは初期設定でバッサリ除外します。
- 新馬戦・2歳戦(データが少なすぎて読めない)
- 障害レース・ハンデ戦(荒れやすい)
- 8頭以下 / 18頭以上(少なすぎ・多すぎで妙味が出にくい)
- 極端な不良馬場(実力が反映されない)
- 過去データが足りない馬が多いレース
- 1番人気が1.1倍みたいな“買っても旨みゼロ”のレース
"exclude": {
"maiden": true, // 新馬戦を除外
"two_year_old": true, // 2歳戦を除外
"jump": true, // 障害を除外
"handicap": true, // ハンデ戦を除外
"min_runners": 9, // 8頭以下は見送り
"max_runners": 17 // 18頭以上は見送り
}テスト用に用意した約2,500レースにこのフィルタをかけると、実際に“買う候補”に残ったのはおよそ3割。残り7割は「見送り」。『買わない勇気』を、AIは1行のルールで淡々と実行してくれました。人間は、これができないから負けるんですよね。
Day 3:6種類の買い方を、全部いっぺんに土俵へ
複勝・ワイド・馬連・馬単・三連複・三連単。この6種類を、単体で買った場合と、組み合わせた場合で、成績がどう変わるかを一気に比較できるようにしました。『どれが一番おいしいのか』を、感覚ではなく数字で殴り合わせる作戦です。ここまでは順調。問題は次の日に起きました。
Day 4:事件「これ、全然当たってへんやん」
できあがった管理画面を開いて、まず目に飛び込んできたのが『的中率 2.5%』の文字。真顔になりました。100回買って2〜3回。え、これ失敗作では? すかさずAIに詰め寄った時のやりとりが、あまりに“AIと開発する感じ”だったので、そのまま載せます。
的中率と回収率はまったくの別物。当てにいくほど、胴元の取り分(控除率20〜30%)に負けやすい。『当たらないけど、当たった時に大きい』を淡々と積むゲームだと、ようやく理解しました。
Day 5:三連単という“甘い罠”
券種ごとの成績を眺めていて、三連単だけ回収率106%と表示されているのを発見。おっ、プラスやん! また心が躍りました。が、AIが静かに続きを見せてきます。『その106%、最大70連敗・最大の落ち込み16万円です。たまたま大きい配当が1回当たって、良く見えているだけの可能性が高い』。70連敗。心が折れる音が聞こえました。
回収率だけを見て「勝てる」と判断してはいけない。連敗・最大ドローダウン・月別の安定性まで見て、初めて“使える条件か”が分かる。— 開発中のAIの助言より
『一番いい回収率の券種』を探し始めた瞬間、それは分析ではなく自分を騙す作業になる。だからこのシステムは、回収率だけでなく“連敗・最大DD・月別/年別の安定性・買い目の多さ”まで全部並べて表示するようにしました。都合のいい数字ではなく、一番つらい数字を信じる。
Day 6:最大の落とし穴「その数字、ニセモノです」
券種を全部乗せした欲張りセットで、回収率がなんと149%。ベンツの色を選び始めた——のも束の間、AIが冷や水を浴びせます。『念のため言っておくと、今のデータは“合成の練習用データ”です。本物の実力差が存在しない盤面なので、この149%は実際の期待値ではありません』。ベンツが軽自動車を通り越して、自転車になりました。
つまり今のところ、システムは完成しているのに、“食わせている過去データがニセモノ”。だから『これで稼げます!』とは口が裂けても言えません。数字が良く見えても、それが本物のデータで再現できなければ、ただの絵に描いた餅です。
Day 7(次回予告):本物のデータに挑む
というわけで次のステップは、JRA公式データ(JRA-VAN・月2,000円ほど)と契約して、1986年からの“本物”の過去レースを丸ごと読み込ませること。ここで初めて「的中率」も「回収率」も本当の意味を持ちます。
先に釘を刺しておくと、本物のデータで検証しても、控除率20〜30%という高い壁は変わりません。だから方針はシンプルです——『バックテストでプラスを“証明”できなければ、1円も賭けない』。夢は見つつ、足元は冷静に。ちなみにこの記事は、特定の馬券の購入を勧めるものではありません。馬券は20歳以上・自己責任で、余剰資金の範囲で楽しむものです。
▼ ここから下は、本物のJRAデータに挑んだ“完結編”です
Day 8:ついに本物のJRAデータと契約
というわけで、JRA公式データ(JRA-VAN・月2,000円ほど)と契約しました。1年分の“本物”のレースをまるごと読み込ませる作戦です。契約自体は5分で終わりました。地獄は、そこからでした。
データを取り込むための公式ソフト(JV-Link)が、かなり古い設計の部品でできていて、最新のPythonから呼ぶと『そんな部品、知りません』と門前払い。原因は32ビットと64ビットという“規格違い”。結局、32ビット専用のPythonをわざわざ別に用意して、ようやく握手できました。ここまでで半日。まだ1レースも読めていません。
本物のデータは「契約したら終わり」じゃない。読み込む“配管”を通すまでが、たいてい一番長くて地味。ここで心が折れる人が一番多い工程です。
Day 9:事件「着順が、全部ゼロ」
配管が通り、データが取れた。喜び勇んで中身を見たら——全馬の着順が『0着』。オッズも全部そろって『31.0倍』。人気はデタラメ。壊滅です。最初は「データが化けてる、詰んだ」と思いました。でもAIが疑ったのは、別の場所でした。
「データが壊れている」と思った時、その8割は“自分の読み方”が間違っている。犯人はたいてい自分の側にいる——プログラミングの永遠の教訓です。
Day 10:1年分を取り込む、地味な地獄
読み方は直った。次は1年分(約2,000レース)を一気に取り込みます。ところが取り込みソフトを長時間ぶん回すと、決まって100秒くらいでプログラムが“黙って”落ちる。エラーメッセージすら出さずに、スッと消える。いちばん困るタイプです。
原因はメモリの後始末の問題でした。AIの対処が、いかにも現場仕事で笑いました。曰く『1週間ずつに区切って読み込み、落ちたら新しいプロセスで“続きから”自動で再開する仕組みにしましょう』。完全に力技。でも、これが効く。約15分で1年分——着順・オッズ・走破タイム・騎手・通過順まで、ぜんぶ本物のデータが揃いました。
きれいに一発で通らない時は、“こまめに保存して、落ちたら続きから”が最強。カッコよさより、泥臭い執念のほうがゴールに近い。
Day 11:本物の回収率と、“控除率”という高い壁
いよいよ本物のデータでバックテスト。合成データ時代の149%は、どこまで下がるのか——。結果、全券種そろって回収率100%割れ。一番マシな馬連でも75%。ざっくり、1万円ぶん買ったら平均7,500円に減る計算です。
これは想定内。JRAの取り分(控除率)が2〜3割ある以上、“ふつうに買う”と平均でこのあたりに着地します。勝負はここから。AIに新しい手がかり(走破タイム・騎手・通過順)を足して賢くしたら——回収率は、むしろ下がりました。あれ?賢くしたのに悪くなった?
数十回しか買わない検証では、回収率は“たまたま”で大きくブレる。良くなった悪くなったと一喜一憂しても意味がない。ここで、もっと厳密な“物差し”が必要になりました。
Day 12:AI vs 市場、ガチンコ勝負の結果
そこで、ブレやすい回収率の勝負をいったんやめて、『AIと市場(オッズ)、どっちが着順を当てるか』を約440レース・数千頭でガチ比較しました。数が多いぶん、“たまたま”では言い逃れできない検証です。結果がこれです。
- AIが「1位」に推した馬の勝率:13.7%
- 市場の「1番人気」の勝率:31.7%
- AIと市場の予想が割れた時、AIの馬が上に来たのは、たったの31.2%
……完敗でした。市場(=みんなの予想が集まったオッズ)は、斤量も調教も血統も、直前の資金の流れまで全部織り込んでいて、こちらの数個の手がかりでは、まるで歯が立たない。「オッズは伊達じゃない」を、自分のデータで思い知らされました。
“市場は効率的”というのは、教科書の中の話だと思っていた。自分で集めたデータに殴られて、初めてそれが本当だと分かった。— 開発中の、しょんぼりした本人より
Day 13:最後の悪あがきと、正直な撤退
それでも諦めきれず、最後にいちばんシビアな検証をしました。『こっちの手がかりは、オッズが“知らない”情報を、1ミリでも持っているのか?』を機械学習で測ったのです。結果、オッズだけの予測に自作の手がかりを全部足しても、精度の改善はわずか0.4%。控除率2〜3割という壁の前では、無いのと同じでした。
というわけで、正直に書きます。このアプローチでは、競馬で勝てませんでした。しかも3通りの測り方(実際の収支・予想の対決・機械学習)が、そろって同じ「市場に負ける」を指しました。ここまで一致すると、もう言い訳のしようがありません。余剰資金であっても、“勝てる証明”ができない以上、1円も賭けません。Day 7で自分に課したルール——『バックテストでプラスを証明できなければ賭けない』——を、その通りに守って、ここで引きます。
AIは魔法の杖ではありませんでした。でも「勝てない」ことを、感覚ではなく数字で証明できたのは、大きな収穫です。夢に酔わず、ちゃんと負けを認められる——これも、AIと組んで開発する価値のひとつでした。
本物データの取り込み・解析・検証のしくみは、丸ごと手元に残りました。もし将来『市場がまだ見ていない新しい情報』を手に入れたら、その時はまたここに戻ってきます。……という負け惜しみを添えて、競馬AI編はいったん幕。ここまで読んでくれて、ありがとうございました。※この記事は特定の馬券購入を勧めるものではありません。馬券は20歳以上・自己責任で、余剰資金の範囲で楽しみましょう。
あわせて読みたい

【開発日記・連載中】AIと本気で「稼ぐ自動売買Bot」を作ってみた(毎週更新)
「Claude Code(AI)に頼めば、自動でお金を増やすBotが作れるのでは?」——そんな下心マシマシで始めた開発記を、リアルタイムの連載日記でお届けします。夢を見て、バグに泣き、数字に騙されかけ、少しずつ前に進む。完結していない“進行中”の記録です。この記事は開発の進捗に合わせて、下へ下へと追記していきます。
中小企業がAI自動化で失敗しないための進め方チェックリスト
中小企業がAI自動化で失敗しないための進め方チェックリスト
「導入したけど誰も使わなかった」を防ぐ。業務選定から運用定着まで、今日からすぐ動ける具体的な手順とプロンプト例を一挙公開。
AIで出した成果を『実績』として記録・発信する方法(数字の残し方)
AIで出した成果を『実績』として記録・発信する方法(数字の残し方)
AIを使って業務が楽になっても、それを「実績」として残せている人は少ない。数字の記録法から発信テンプレまで、今日から使える具体的な手順を解説します。

この記事は「株式会社オールベッド」が運営しています。
AIを武器に、一人で千人分。株式会社オールベッドは、LINE集客の自動化・コンテンツの大量生成・ファネル設計まで、自分たちで毎日まわしている運用をそのままお渡しするマーケティング会社です。「AIを何から始めればいいか分からない」段階から、あなたの隣で一緒に走ります。
会社について詳しく →AIを「読む」から「使う」へ。
記事だけでは動けないときは、AI導入の伴走コンサルでお手伝いします。まずは2分のAI診断か、LINEでの無料相談からどうぞ。あなたの事業のどこからAIを使えるか、その場でお伝えします。