コードを書いた量は、ほぼゼロに近い。
それなのに、データ収集スクリプトが動き、機械学習モデルが学習を回し、今日のレース予想が毎朝自動で生成される。そんな競艇AI予想システムが、僕の手元に存在している。
「Claude Codeって何ができるの?」
その問いに対する、僕なりの答えがこの記事だ。
なぜ「競艇」だったのか
最初から競艇を選んでいたわけじゃない。
AIで予測できるものを探していた。株価、競馬、スポーツ……いくつか候補を比べた末に「競艇」に行き着いた理由は、二つある。
一つ目は、データが整っている。
競艇には公式APIが存在する。出走表(programs)、レース結果(results)、展示タイム(previews)の3系統のデータが、きれいな構造で公開されている。スクレイピングに使ったエネルギーの大半を「どうデータを設計するか」に使えた。
二つ目は、当たりやすい。
競馬のような混戦と違い、競艇は6艇しか出ない。しかも1コースを走る1号艇の勝率は全国平均で50%を超える。どんな競技より「理屈が通りやすい」世界だ。
控除率は25%。つまり購入金額の75%しか払い戻しがない。それでもROI(回収率)が90%を超えるモデルを作れれば、「賭けることへの参加コスト」として十分に戦える。
それが出発点だった。
Claude Codeに丸投げしてみた
開発はすべてClaude Codeとのセッションで進めた。
最初の指示はこうだった。
「競艇のAI予想システムを作りたい。データはBoatrace Open APIから取れる。Pythonで作って、最終的にはWebで公開したい。」
それだけで、Claude Codeは動き始めた。
スクレイピングスクリプトの設計、フォルダ構成、データのスキーマ設計。さらにLightGBMでのモデル学習、評価スクリプト、予想HTMLの出力まで。「どのファイルを作るか」「どんな特徴量を使うか」「エラーが出たらどう直すか」──すべてClaude Codeが担った。
たとえば、特徴量エンジニアリングはこんな具合に指示しただけで進んだ。
「選手ごとのスタートタイミングのばらつきを特徴量にしたい。
過去10レースの標準偏差で出して、LightGBMに食わせられる列にして。」
するとClaude Codeが、こういう関数を自動で生成してくる。
def st_stability(df, window=10):
"""選手の直近nレースにおけるSTの標準偏差(安定性指標)"""
return (
df.sort_values("race_date")
.groupby("racer_id")["st"]
.rolling(window, min_periods=3)
.std()
.reset_index(level=0, drop=True)
)
僕がやったことは何か。
「ここの1号艇への重みをもう少し強くしたい」とか、「この会場のデータが偏っているから調整できるか」とか、そういう方向性の指示だけだ。
実装する人間ではなく、チームのディレクターに近い立場で、開発が進んでいった。
技術スタック
このシステムは、外部サービスへの依存を最小限にしたローカル完結設計だ。
- 言語・ML: Python + LightGBM + pandas(DBなし・JSONファイルで完結)
- データ取得: Boatrace Open API(出走表・結果・展示タイム)+ boatrace.jp スクレイピング(ライブオッズ)
- 予測出力: 静的HTML + JSON(APIサーバーなし)
- 自動化: Windows Task Scheduler(朝7:30 予想生成 / 夜21:30 結果集計)
- 会場補正: IsotonicRegression で24会場それぞれの予測バイアスを補正
LightGBMを選んだのは、表形式データへの強さと学習速度の速さが理由だ。競艇データは数値・カテゴリ混在の典型的な表形式で、LightGBMとの相性がいい。ニューラルネットワーク系と違い、特徴量の重要度が可視化できるのも、「どのデータが効いているか」を確認しながら進める上で助かった。
データを触って気づいたこと
「1号艇が強い」とは、競艇ファンなら誰でも知っている。
でも、「知っている」と「データで確認する」は、全然違う体験だった。
実際にデータを見ると、会場ごとに1号艇の勝率が大きく違う。たとえば、インコースが有利な静水の会場と、波が高く荒れやすい会場では、1号艇の勝率に10〜20ポイント近い差が出る。「知識」だったものが「数値」になる瞬間、何か腑に落ちる感覚がある。
直感がデータで裏付けられる体験。
これが機械学習の面白さの一つだと思う。「みんながそう言っているから」じゃなく、「データがそう言っているから」という根拠が生まれる。
選手ごとのスタートタイミング(ST)の安定性、展示タイムと本番タイムの相関、特定の会場での艇番の優位性……。探せば探すほど、「競艇にはロジックがある」という手応えが積み重なっていった。
バックテストの全データ
バックテストの前提条件と結果を整理する。
- 期間: 2025年5月〜2026年4月(Boatrace Open APIが提供する全期間)
- 対象: 全国24会場・約5万4000レース
- 戦略: 単勝式・EV(期待値)がプラスのレースのみ賭ける
- オッズ: 履歴平均オッズ使用(ライブオッズは現在統合中)
- 買い目選択: モデルのTop-1予測(最も勝率が高いと判定した艇)
結果として、控除率25%の市場でROI96.3%を達成した。ランダムに買い続けると75%しか戻らない世界で、96.3%まで回収率を引き上げられている。
なお、ライブオッズを使ったEV戦略はROIがさらに改善する見込みだが、数日分のデータ蓄積後に再バックテストを予定している。履歴平均オッズを使うと本命艇の配当が低く採算が取りにくいが、ライブオッズで「モデル確率 > 市場暗示確率」のレースだけに絞ることで、より精度の高い賭け方ができると考えている。
ROI96.3%までの道のり──バージョンアップの記録
「ROIが出た」と言っても、一発で出たわけじゃない。
Claude Codeと一緒に、ひたすらトライアンドエラーを繰り返した。
| バージョン | 精度(Top-1) | ROI | 主な改善 |
|---|---|---|---|
| v1 | ~57% | 91.5% | 基本特徴量(約100個)でベースライン構築 |
| v3 | 58.46% | 92.6% | 特徴量を270個に拡張 |
| v4 | 58.5% | 94.1% | 299個・会場別傾向を加味 |
| v5 | 58.60% | 93.3% | 351個・微調整 |
| v6.1 | 58.80% | 96.3% | 展示ST z-scoreを追加(399個) |
v1はシンプルなベースライン。艇番・選手の直近成績・会場の基本統計など約100個の特徴量で組んだ。ROI91.5%はこの段階の数値だ。
v3〜v4では選手の会場別成績、艇のモーター整備履歴、展示タイムの移動平均などを追加。特にv4で会場補正(IsotonicRegression)を導入したことで、得意会場と苦手会場でモデルの重みを分けられるようになり、ROIが94%台に乗った。
v5は微調整フェーズで、特徴量数を増やしたものの精度は横ばい。「増やせばいいわけではない」と学んだバージョンでもある。
v6.1の決め手になった改善は意外とシンプルだった。「展示スタートタイムのレース内z-score(st_zscore)」──同じレースで他艇と比べてスタートが速かったかどうかを数値化したもの。この変数が重要度の上位20位以内に入り、ROIが96.3%に跳ね上がった。「絶対値より相対値」という発見だった。
「詰まった」記憶がほぼない
開発中に一番驚いたのは、「詰まらなかった」ことかもしれない。
スクレイピングで詰まれば、Claude Codeがエラーメッセージを読んで原因を特定する。特徴量設計で迷えば、どんな変数が予測に有効かを一緒に考えてくれる。モデルの精度が出なければ、調整方法を提案してくれる。
僕がこれまでのプログラミング経験で「詰まる」のは、大抵「どう実装するか」を調べる時間だった。Claude Codeはその時間をほぼゼロにした。
替わりに使う時間が増えたのは、「何を作るか」「どこに向かうか」を考えることだ。
今、どこにいるのか
現在、システムは毎朝・毎晩、自動で動いている。
Windows Task Schedulerに登録したスクリプトが、朝7:30に予想を生成し、夜21:30に結果を集計する。僕が手動でやることは、ほぼゼロだ。
タスクの登録も、Claude Codeに一言投げただけだった。
# 予想生成: 平日朝7:30
schtasks /Create /TN "BoatracePredict" /TR "python D:\boatrace\predict.py" ^
/SC DAILY /ST 07:30 /F
次のステップはライブオッズとの統合によるEV(期待値)戦略の実装と、Xアカウントでの公開だ。「AI予想を公開して、有料情報として価値があるか」──そこが次の検証点になる。
「AIで賭け事が攻略できるか」というより、「データとAIで、不確実なものにロジックを持ち込めるか」を試し続けている感覚だ。
この記事で伝えたかったこと
競艇AIを作った話をしてきたけど、本当に伝えたかったのは別のことだ。
「アイデアがある。でも実装できない。」
そのギャップを、Claude Codeは埋めてくれる。
スクレイピングも、モデル学習も、Task Schedulerの自動化も──僕が書いたコードはほとんどない。それでも、動くシステムが手元にある。
エンジニアじゃなくても、ディレクターとして動けばシステムは作れる。
それが2026年のAIツールの現実だと、今は思っている。
よくある質問
競艇AIは本当に稼げますか?
ROI96.3%はバックテストの数値であり、実戦での保証ではありません。控除率25%を考えると依然として期待値はマイナスです。本記事はAI開発・Claude Code活用の体験記として読んでください。
Claude Codeを使うには何が必要ですか?
Claude ProまたはMaxプランのサブスクリプション(月$20〜)が必要です。ターミナル操作の基礎(ファイルパスの概念、コマンド実行)があれば、プログラミング経験がなくても多くのことができます。
競艇のデータはどこから取りましたか?
Boatrace Open API(公式GitHub)から取得しています。出走表・結果・展示タイムの3系統が公開されており、個人開発での利用が可能です。
このシステムは公開されますか?
EV戦略の実証が完了後、X(@m333studio)で予想を公開予定です。フォローしておくと更新が届きます。
関連ツールを見る
この記事で紹介したツール・サービスをまとめてチェック。
![]()