競艇のAI予想をClaude Codeで作ったら、ROI96.3%まで来た話

PR本記事はアフィリエイト広告を含みます。リンク経由でのご購入により運営者に成果報酬が支払われることがありますが、読者への価格や条件は変わりません。

コードを書いた量は、ほぼゼロに近い。

それなのに、データ収集スクリプトが動き、機械学習モデルが学習を回し、今日のレース予想が毎朝自動で生成される。そんな競艇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)で予想を公開予定です。フォローしておくと更新が届きます。

関連ツールを見る

この記事で紹介したツール・サービスをまとめてチェック。

おすすめ

エックスサーバー

国内シェアNo.1のレンタルサーバー。WordPressブログをすぐに始められる。このブログも実際にXserverで運営しています。

Xserverを見てみる →

ムカイ
この記事を書いた人

ムカイ

個人事業主エンジニア。C#フルリモート案件に参画しながら、Claude Codeを使ってAI×副業の自動化・コンテンツ制作を実践中。「稼ぐ仕組みを作るのが好き」がモットー。

コメントを残す