これは何:
弊社 Qiita 連載「建築 × AI」シリーズの 番外編 です。 真面目な業務記事を 期待 して来た方、 ごめんなさい。 今回は 馬 の話です。
ML 検証の 読み物 であって、 馬券購入の 勧誘 では ありません。 数字 は 全部 自分の hold-out / バックテスト 結果。 実購入は 検証用 の 最小額。
税務 の くだり は 一般論 です。 個別判断 は 税理士 へ。
馬券 は 自己責任。 私 の 損失 は 私 が 背負います。 🐴
第0章 オチを先に言います 🎯
- 弊社は 東海地区 で 建築設計事務所 を やっています。 本業 で は JWW (Jw_cad) の 図面 を AI に 自動生成 させる プロジェクト を 地道 に 進め中。 Qiita 本編シリーズ も だいたい その話 です。
- ある週末、 魔 が 差して 「競馬予想 AI」 を 個人プロジェクト として 作り 始めて しまった。
- 約 1 ヶ月 で 単勝 ROI 約 140% (= 100 円 賭けたら 平均 140 円 戻る 計算) という モデル が hold-out 上 で 出て しまった。
- 今週末 (2026 年 5 月 23・24 日) の 中央競馬 で 実戦 検証 します。
- そして、 まだ 1 円 も 当たって いない 段階 で 税金 と 過去 の 馬券裁判 を 調べ 始めて 半日 溶かしました。 これが 本記事 の メインディッシュ です。 タイトル 回収 です。
- 賭ける 金額 ・ 買い目 ・ 結果 は 来週 月曜 (5 月 25 日) の 続編 で 全公開予定。
- 勝っても 負けて も 晒します。 たぶん 負けます。 そのときは そっと 心 の 中 で 笑って ください。 🙏
📅 続編予定: 5/25 月 22 時頃 「実戦結果編」 公開、 本記事末尾からリンクします。
第1章 なぜ 建築屋 の 社長 が 競馬AI を?
事 の 発端 は 取引先 の 社長 (大 の 競馬好き) と の 打ち合わせ でした。
取引先 の 社長: 「最近 の AI ってさぁ、 競馬 とか 当たるん でしょ?」
自分: 「(うわ、 また 始まった…)」
これ、 IT 周辺 で 生きていると 死ぬほど 聞かれる 質問 ランキング 上位 に 入って いる と 思うん ですが、 皆さん どう 答えて ますか? 弊社 は いつも 「いや〜、 ギャンブル は 胴元 が 一番 強い ので 無理 ですよ」 と 適当に 流して いました。
が、 その日 ふと、
「胴元 が 強い って、 本当 か?」
と 自分 に 問い返して しまった。 これ が 半月後 に GPU マシン 2 台 を 数週間 占有 する 個人開発プロジェクト に 化ける 1 行 に なります。
ちょっと まじめ に 算数 を します。 JRA の 単勝 ・ 複勝 の 控除率 は およそ 20% (払戻率上限 約 80% で 運用)。 何の情報優位 も 無く 賭けると、 平均 で 100 円 が 80 円 に 目減り する 市場 です。
ということは、 「市場 (= 確定オッズ に 織り込まれた 集合知) が まだ 拾えて いない 情報優位」 を 機械学習 で 抽出 できれば、 長期 で 回収率 100% 超 の 余地 が 理論上 存在 する。
これ、 言葉 を 変えると 「JRA という 市場 で、 集合知 を 機械学習 で 出し抜けるか?」 という、 まあまあ 健全 な テーマ じゃ ないか? と 自分 を 騙し に 来ました。 騙されました。 これ は その 懺悔 と 自慢 を 兼ねた 記録 です。
第2章 システム全体像 🛠
まずは 構成 から。 全体像 は こんな 感じ です。
※1: 「あるレガシーな Windows GUI ソフト」 とだけ書いておきます。 馬好き と JRA データ 利用経験 のある人 なら ピンと来るはず。 これが Linux で動かないので、 結局 Win マシンが 1台 ハブとして 必須。 これが地味に運用上の最大ボトルネックです。
技術スタック:
- 学習: LightGBM + Optuna ( + 一部 自作 補正)
- 特徴量: 約 40 次元 (内訳は 次章で 大分類だけ 紹介)
- 推論: ARM 系 GPU マシン 2 台 (本番 cron 機 + 計算機、 専用線で 直結)
- 通知: 自作 SMTP スクリプトで自分の Gmail に 予想 と エラー を 投げる
- コード生成と設計レビュー: Claude Opus 4.7 (1M context) ← これがいなかったら 5 年 かかってた
第3章 何を 食わせて 何を 予想 しているのか 🤔
ここが 一番 気になる パート だと 思うので、 設計思想 と 失敗筋 を ある程度 書きます。 「全部 教えろ」 は 勘弁 してください。 弊社 も 1 ヶ月 かけて 1 個 ずつ 削って 足して 出した もの な ので。
3.0 データ の 時系列 分割 (時系列リーク 対策 の 核)
競馬 ML で 一番 信用 できない モデル は 「時系列分割 が 雑な モデル」 です。 過去 と 未来 を 1 日 でも 混ぜたら ROI は あっという間 に 200% を 超え、 そして 実戦 で きれいに 死にます。 弊社 の パイプライン は こう 切って います:
- 学習 に 使う のは 2025-11 まで。 hold-out (2025-12) は モデル選定 と ハイパラ確定 が 終わって 一度しか 見ない。
- 補助評価 として 2018-2025 の 月次 walk-forward (各月 を 順に 評価期間 に 回す) も 実施。 「ある 1 ヶ月 が たまたま 強かった だけ」 を 排除 する 目的。
- live (2026-05) は モデル 凍結 後 の 完全 未知 データ。 ここで 初めて 馬券 を 買う。
3.1 入力データの 内訳 (約 40 次元 を 大分類で)
予想時点で取得可能? 列 が ○ の もの だけ を 使い、 × は 一切 使いません。 これ が 時系列 リーク 監査表 です。
| 大分類 | 例 | 予想時点 で 取得可能? | 採用 |
|---|---|---|---|
| 馬の属性 (基本) | 性別、 年齢、 父系統、 母父系統 | ○ (出走表 確定時点) | ✅ |
| 馬の属性 (動的) | 馬体重 と その 変動傾向 | △ (前走時点 まで を 使用) | ✅ |
| 馬の戦績 | 直近 N 走の 着順傾向、 上がり 3F の 偏差、 同条件 適性 | ○ (前走 終了時点 まで で 集計) | ✅ |
| 騎手・厩舎 | 当該条件 勝率 / 連対率、 騎手 × 厩舎 相性 | ○ (前走終了時点 まで) | ✅ |
| コース・条件 | 距離、 芝/ダート、 コース形態、 馬場状態、 斤量、 枠順 | ○ (出走表 + 当日 発表) | ✅ |
| 血統 (5代) | 父〜高祖父母 系統 と 近交係数 | ○ (静的情報) | △ 全件取得中 |
| 払戻総額 ベース 指標 | 過去 レース の 合計票数 から 算出 (※当該レース の 票数 は 使わない) | ○ (過去レース 確定後) | ✅ |
| ❌ 当該レース 確定 オッズ | 単勝オッズ、 人気順 | × (レース直前 にしか 確定 しない) | ❌ |
| ❌ 当該レース の 結果 由来 値 | 当該レース から 計算した どんな 統計 も | × (未来情報) | ❌ |
| ❌ 競馬専門サイト 指数 | 一部 サイト は 結果反映 が 速い ため リーク 疑い | × (検証 で ROI 不安定) | ❌ |
| ❌ 天候 (現地観測) | 風速 / 気温 | × (馬場状態 で 代替済) | ❌ |
⚠ オッズ を あえて 使わない 理由 は 2 つ:
- オッズ は レース 直前 に しか 確定 せず、 「前日朝 に 予想 を 出す」 運用 要件 を 満たせない
- オッズ系 を 入れる と モデル は 「人気馬 を 当てに 行く」 だけ の つまらない 子 に 育ち、 妙味 の ある 中穴 を 推せなく なる
3.2 学習方法 と 評価方法
- アルゴリズム: LightGBM (目的関数 は ランキング学習 寄り の カスタム)
- 学習データ: 2018 年 〜 2025 年 11月 まで の 中央競馬 全レース (約 数百万 行 ベース)
- 第 1 評価 (hold-out): 2025 年 12 月 の 約 4 週
- 第 2 評価 (月次ローリング): 2018 〜 2025 年 を 月次 walk-forward で 検証し、 年別 / 月別 ROI を 並べて 「ある月 1本 だけ で 偶然 強かった のでは ない」 ことを 確認
- 不確実性評価: ブートストラップ で 単勝 ROI の 信頼区間 (95% CI)、 最大ドローダウン、 的中時オッズ分布 を 推計
- 評価指標: ROI (回収率) と 上位馬 hit 率 を 同時に 見る (片方 だけ だと 危ない)
- ハイパラ最適化: Optuna (現在 別マシンで 数百試行 走らせ中、 火曜 朝 完了予定)
特徴量の 取捨選択 は ablation (ある特徴量群を抜いたモデルと 入れたモデルを 比較) で 機械的に 判定しています。 「直感で 効きそう」 を 信用しない。 直感は 平気で 嘘 を つきます。
時系列リーク防止 が 最大の関心事:
競馬 ML で 一番 多い 「水増し ROI」 の 原因 は、 学習データ に 未来の情報 を 紛れ込ませて しまう こと です。 例: ある馬 の 「シーズン通算成績」 を 各レース 時点 の 特徴量 に 使う、 など。 こ れを やると 学習時 ROI は ぐんぐん 伸びる が、 実戦 で 死ぬ。 私 の パイプライン では、 特徴量 を 生成 する 時点 で 「その時 まで に 利用可能 だった 情報」 だけ で 計算 する 規約 を 厳密 に 守って います (検査用 の レビュー スクリプト で 各特徴量 の 計算時刻 と 参照時刻 の 整合 を 機械的 に チェック)。
3.3 一番 効いている (たぶん) 軸
これは 競馬 ML 界 で わりと 共通認識 だと 思います:
- 「同じ条件 で 過去 どう走ったか」 系: コース、 距離、 馬場、 距離 + 斤量、 斤量変化 — の 適性 が 一番 安定して 効く
- 騎手 × 厩舎 の 相性: ベタな ように 見えて 効く
- 時系列の リーク防止: ある時点 で 知り得ない 情報 (例: そのレース の 結果から 導いた 数字) を 過去側の 特徴量に 混ぜない、 これを 1 つ でも やったら 全 数字 が ウソに なる
逆に、 私が 散々 入れ替えて 結局 効果が 安定しなかった のは、
- オッズ系・人気系 (ROI を 下げる方向に 振れがち)
- 競馬専門サイト の 「指数」 系 (学習データに リーク しやすく、 また スクレイプ コスト に 見合わない)
- 天候 / 風速 / 気温 (馬場状態 で すでに 取れている 情報 と 被る)
ROI を 110〜120% に 載せる ところまで は 公開されている 知見 で 多くの人 が 到達 できる 領域 だと 思います。 そこから 先 は データ前処理 の 職人技 と 試行錯誤 の 量 で、 私 も 1 ヶ月 かけて 1 つ 1 つ 削って 足して の 繰り返し でした。
第4章 しくじり 名場面集 😇
開発中 に 踏んだ 地雷 を 並べます。 これ を 笑い飛ばす ため の 記事 と 言って も 過言 では ない。
4.1 「toroku」 列 が 全行 77 で 固定 されている 事件
最初にやったのは、 各レース の 登録頭数 と 出走頭数 を 生バイナリ から 読み出す 処理 でした。 仕様書 (古い PDF) を 頼り に offset 31 から 2 バイト で 読んだら、 全行 77 で 揃ってる。
私: 「日本の競馬 って 1 レース 77 頭 走るん でしたっけ?」
Claude Opus: 「いいえ、 通常 最大 18 頭 です」
私: 「ですよね」
しばらく悩んだ末に、 そのバイト位置は実は ASCII の "77" という 固定フラグ であって、 登録頭数 は 別の場所 (offset を 4 つ ズラした 位置) に 居ました。 当然 この 生データ には 公式 ドキュメント が ろくに ない。
教訓: 「常識的に あり得ない 値」 が 一面 並んでいる時は、 自分の オフセット計算 を 疑え。 バイナリ仕様書を信用するな、 実データを信用しろ。
4.2 「血統スクレイプ 950 馬」 で 精度が ガタ落ち
馬の 5代血統 (祖父母 → 高祖父母… 計 30 頭) を 入れたら モデル精度 が 上がるはず、 と 仮説を 立てて、 とりあえず 新しい馬 950 頭分 の 血統情報 を、 公開された 公式の 個人利用範囲 で、 利用規約 と robots.txt を 確認したうえで、 十分に低頻度 (1リクエストあたり 数秒待機 / 並列度 1) で 取得しました。 取得手順 や 具体 URL は 本記事 では 紹介しません (権利関係 と 規約遵守 の 観点 で、 各自 で 一次情報 を 当たって ください)。
そして組み込んで再学習させたら…
モデル: ROI 108% (前モデル 140% から マイナス 32 ポイント)
崩壊です。 なぜか?
原因はシンプルで、学習データ 全 211,000 頭 のうち、 血統情報 が ある のが 950 頭 (= 約 0.45%) しか 無かった ため。 LightGBM 君は、 99% が NaN で 1% 弱 だけ 値が ある カラム を 「これ ノイズ じゃん」 と 適切に 学習してくれず、 むしろ 既存特徴量 との 偽の相関 を 拾って 大コケ しました。
教訓: 欠損カバレッジが極端に低い特徴量はモデルを破壊する。 入れるなら全件、 入れないならゼロ件。 半端な部分集合が一番怖い。
対策: 全 21 万頭 を 同じ 低頻度ルール で スクレイプし直し中 です。 ETA は約 5日。 マシン は 24時間 稼働 です。 これ も 面白おかしくて、 「血統データ の ために 5 日 かけて 21 万件 を 数秒/req で 順番 に 取得 する」 って 文字 に すると 完全 に バカ ですよね。 でも やってる。
4.3 票数データ を 統合 したら ROI が 下がる 謎
オッズが 直接 使えない 条件 (前日 予想 だと オッズが 固まってない ため) でも 「払戻総額」 = 票数 の 合計 から 人気度合い を 推定できる はず、 と 考えて、 別ファイル から 票数系 の 数値 を 取り出して 特徴量 に 追加 しました。
結果: ROI -13 ポイント。
なぜ? と 1日 悩んで 気がついた のは、 当たり前 と 言えば 当たり前 の 話 で、 「票数 ∝ 人気 ∝ オッズ」 なので、 オッズを 使わない 約束 を 票数経由 で 破っていた だけ でした。 しかも 人気馬偏重 になって 単勝の 妙味 が 消える。
教訓: 「直接使ってないからリークじゃない」 と思った特徴量が、 1ホップ先で 普通に リークしている。 競馬は 情報の連鎖が 濃いので、 こういうのが ザラに 起きます。
これ、 同じ罠を 業務系の機械学習でも たくさん 見かけます。 「ユーザ ID 入れてないから個人特定リークじゃない」 → 「でも IP + UA で 95% 識別できてました」 みたいな。 競馬は機械学習の練習台として 異常に 優秀 です。
第5章 当たる前 から 税金 を 心配し始めた 男 の 半日 💸
ここが この記事 の タイトル回収 パート です。 ROI 140% の モデル が hold-out で 出た 瞬間、 自分 は 重大 な 事 に 気付いて しまいました。
自分: 「これ、 もし 本当 に 勝ち続けたら、 税金 どうなるん やろ?」
落ち着いて ください。 自分 は まだ 1 円 も 当てて いません。 何なら 来週 月曜 までに 1 円 も 払戻 が ない 可能性 すら ある。 hold-out 上 の 数字 と 実戦 の 数字 は 別物。 そんな こと は 機械学習 を やった こと の ある 人間 なら 全員 知って いる。
にも かかわらず、 ここで 国税庁 タックスアンサー と 過去 の 裁判例 を 半日 かけて 調査 し 始めた の が この男 (私) です。 馬券 を 1 枚 も 買って いない 段階 で。 取らぬ狸 を 通り 越して 狸 の 子孫 の 進学費用 まで 心配 して いる 状態 です。
5.1 競馬の払戻金 は どの 所得?
国税庁 の 一般的 な 整理 は こう とされて います (※あくまで 概念整理 です。 個別事案 は 必ず 税理士 または 所轄税務署 に 確認してください):
- 競馬 の 払戻金 は 一般 には 一時所得 として 扱われる ことが多い
- 一時所得 の 課税対象 = ( 払戻金 − その的中馬券の購入額のみ − 特別控除 50万円 ) × 1/2
ここで 重要 なのは 「この扱い に なると 外れた馬券 の 購入額 は 経費 と されない」 という 点。 例えば、 1年間 で 100 万円 賭けて 110 万円 取り戻し、 そのうち 当たった馬券 の 購入額 が 10 万円 だった と すると、
- 課税対象 ≒ (110 − 10 − 50) × 1/2 = 25 万円 が 一時所得 に
外れ馬券 90 万円 は 無かったこと に される のが この 扱い の 怖い ところ。 一方、 趣味 で 年に 数回 賭ける 程度 なら 50 万円 特別控除 の おかげで 課税対象 に なる ことは ほぼ ない、 と 一般 に は 説明 されます。
5.2 例の 「馬券裁判」 シリーズ
ところが ですね、 私が 半日 溶かした のは ここから 先 です。 過去 に 「外れ馬券 を 経費 に できる か」 を 争った 有名 な 裁判 が あります。
-
大阪 馬券裁判 (最高裁 平成27年3月10日 判決)
- 元会社員 が 独自 の ソフト で JRA 全レース を ほぼ網羅的 に 自動購入 し、 数年 で 数十億 円 を 賭け、 数億 円 の 黒字 を 出した 事案
- 国税 は 「一時所得 ・ 外れ馬券 は 経費 に ならず」 と 課税 → 当人 は 「これ は 営利目的 で 継続的 に やってる 雑所得 だ、 外れ馬券 は 必要経費 だ」 と 主張
- 最高裁: 当該事案 では 雑所得、 外れ馬券 も 必要経費 と 認定 (当人 勝訴)
-
札幌 馬券裁判 (最高裁 平成29年12月15日 判決)
- こちら も 同様 に 自動 ・ 大量 ・ 継続 購入 ケース で、 雑所得 + 外れ馬券 経費 が 認定
ただし どちら も 「営利目的 で 継続的 に 行われた」 こと、 つまり 趣味 を 超えた 事業性 が 認められた、 と 整理 されて います。 国税庁 の 整理 も この 2 判決 を 受けて 「自動的 に 多数 を 継続購入 する など の 例外的 な 購入態様 に 限り 雑所得 として 扱い 得る」 と、 限定的 な 方向 で 整理 されて いると 報じ られて います (※具体的 な 適用判断 は 個別事案 ごと に 異なる ので、 該当 し得る 規模 で 運用 する 場合 は 税理士 への 事前相談 が 推奨 され ます)。
5.3 「で、 俺の 場合 は?」 の 検討会 (脳内)
ここから 私 は 1人 で 検討会 を 開きます。 当事者 私、 反論役 私、 司会 私。
司会私: 「では、 ご相談者 の 状況 を ご説明ください」
当事者私: 「自作 AI モデル で 中央競馬 の 予想を 出して、 毎週末 上位レース のみ を 限定額で 単勝購入 する 予定です」
反論役私: 「自動 投票 では?」
当事者私: 「いいえ、 目視で 確認 して 手動 投票 します」
反論役私: 「全レース 購入 では?」
当事者私: 「いいえ、 モデル が 強気の 上位 数レース のみ に 絞ります」
反論役私: 「継続性 は?」
当事者私: 「まだ 1 円 も 当ててません」
司会私: 「ご相談者、 そもそも 課税の 心配 を する 段階 に 達して おりません。 本日 は お引取り ください」
…という 結論 が 半日 かけて 出ました。 半日 返して ほしい。
ただ、 真面目な 話 として、 機械学習 で 一定 の 期待値 が 出る モデル を 持っている なら、 「将来 黒字 が 安定 した 場合 の 申告区分 を 事前 に 整理 しておく」 のは 経営者 と して は むしろ 健全 だ、 と 自分 を 慰めて おきます。 (ホビーが 法人 の 経費 に ならない こと も 同じく 半日 かけて 確認 した と は ここ だけ の 話)
5.4 教訓 (?)
- 皮算用 は 楽しい。 ただし 仕事 の 時間 を 削る な
- 黒字 を 出す 前 に 税理士 に 確認 する ほど の 額 を 賭ける 予定 は ない
- 当たって から 心配 しろ
第6章 Claude Opus 4.7 (1M context) と 組む コツ 🤖
この開発、 ぶっちゃけ Claude Opus 4.7 が いなかったら ぜったい 完成 してません。 特に 1M トークン context が 効きました。
私が個人的に 効いたな〜 と思ったプラクティス:
-
「memory ファイル」 を Claude 自身に管理させる
- 「過去 ハマった ポイント」 や 「自分 が 説明 を 何度も 求められて 嫌 だった こと」 を 専用 md ファイル に Claude 自身 が 書く
- セッション 冒頭 に 必ず 読ませる
- 副作用として、 後から 自分 が 読み返しても 「あ、 ここで こう ハマったのか」 が 全部 残る
-
長時間 タスク は 中断せず 一気に
- グローバル 設定 に 「途中で 質問するな、 最善策で 進め」 と 書いておく
- 何度も 「どうしますか?」 で 止まると、 一晩 で 終わる 作業 が 三晩 に なる
-
エラー は 3回 まで 自力解決 させる
- 「ライブラリ 競合 は 自分で 直せ」 と 投げて おくと、 venv 切り直し から バージョン pin まで 勝手 に やってくれる
- 私 が 監視 してた のは 主に 「方向性 が ズレ てないか」 だけ
-
重要 メトリクス は 必ず 「テストセット」 で 出させる
- 「学習データ の ROI が 200%」 みたいな ヤバい 数字 が 出ても 喜ばない
- 直近 1ヶ月 を hold-out にして そっち で 評価。 今の ROI 140% も そっち の 数字
第7章 現状 の モデル概要 と 評価サンプル 📊
⚠ 以下 の 数字 は hold-out (2025/12) と 月次 バックテスト 上 の 値 で、 実戦 の 収益 を 保証 する もの で は ありません。 実戦 ログ は 続編 で。
7.1 ROI の 計算式 と 検証ルール
ROI = ( hold-out 期間 の 払戻合計 ) / ( hold-out 期間 の 購入合計 )
購入合計 = ( 1点 100 円 × 単勝 ) × ( 推奨レース数 )
推奨レース = モデル の 推定 期待値 が 閾値 を 超える レース のみ (= 全レース 購入 では ない)
- 券種: 単勝 のみ
- 1レース 1点 100 円 固定 (Kelly 等 の 動的ベット は 採用 して いない)
- 対象: モデル が 推奨 し た レース のみ (見送り レース は 購入額 = 0)
- payouts は JRA 公式払戻 (税引前) を 用いる
ROI 100% = ちょうど 元本 維持、 100% 未満 = マイナス、 100% 超 = プラス。 JRA の 単勝 控除率 は 約 20% (上限 払戻率 80%) なので、 「市場 から 何の情報優位 も 引き出せて いない モデル の 期待 ROI ≒ 80%」 が ベースライン です。
7.2 hold-out (2025/12) サンプル 数
| 指標 | 値 |
|---|---|
| 評価期間 | 2025-12-02 〜 2025-12-29 (約 4 週) |
| 中央競馬 全レース 数 | 約 300 |
| モデル 推奨 (= 購入) レース 数 | 約 150 |
| 購入合計 (= 150 × 100 円) | 約 15,000 円 |
| 的中数 | 約 37 |
| 単勝 的中率 | 約 24.5% |
| 払戻合計 | 約 21,000 円 |
| 単勝 ROI | 約 140% |
| 平均 配当 (的中時) | 約 570 円 |
| 中央値 配当 (的中時) | 約 360 円 |
| 最大 配当 (的中時) | 約 4,200 円 |
サンプル サイズ が 推奨 150 レース と 限定的 な ため、 単独 で は 偶然 の 寄与 を 排除 し切れません。 月次 walk-forward と ブートストラップ で 補強 します。
7.3 年別 ROI (2018-2025 月次 walk-forward、 補助評価)
| 年 | 推奨 レース | 単勝 ROI | 単勝 的中率 |
|---|---|---|---|
| 2018 | 約 1,700 | 約 112% | 約 21% |
| 2019 | 約 1,750 | 約 128% | 約 23% |
| 2020 | 約 1,700 | 約 119% | 約 22% |
| 2021 | 約 1,800 | 約 135% | 約 24% |
| 2022 | 約 1,750 | 約 122% | 約 23% |
| 2023 | 約 1,800 | 約 131% | 約 24% |
| 2024 | 約 1,750 | 約 125% | 約 23% |
| 2025 (1-11月) | 約 1,600 | 約 133% | 約 24% |
| 全期間 平均 (重み付き) | 約 13,800 | 約 125% | 約 23% |
hold-out 単月 で 140%、 8 年 walk-forward で 125% が それぞれ 別 の 評価軸 の 「ベスト 推定」。 続編 で ブートストラップ 95% CI / 最大 ドローダウン / 的中時 オッズ 分布 (ヒストグラム) を 公開予定。
7.4 表 を 読む とき の 注意
- 上記の モデル1位馬 の 単勝 的中率 (≠ JRA1番人気 の 的中率) に 注意
- モデル1位馬 の 複勝圏 (3着以内) 率 (hold-out) は 約 81%
- 競馬 の 単勝 ROI は 少数 の 高配当 的中 で 大きく 振れる。 表 の 「最大配当」 を 1 つ 外す だけ で ROI が 数 ポイント 動く
- 馬場 状態 / 騎手 / 出走馬 が 期間 を 跨いで 変わる と 一発 で 崩れる 性質 が ある
- モデル 自身 が 出した 予想 で 自分 が 買う ことで オッズ を 動かす リスク は 個人投資額 では 無視 できる 水準
私 の モデル も 今週末 初めて 「学習 に 使ってない 現役 の 馬たち」 を 予想 する ので、 ぶっちゃけ どう なる か 私 にも 分からない。
これ が 楽しい。
第8章 今週末 (5/23・24) の 実戦検証 予告 🏇
ここから が 本番 です。 hold-out の 数字 が 強い ことは わかった。 では、 学習 にも 評価 にも 一切 使って いない 「来週末 の レース」 で、 同じ ぐらい の 数字 が 出るのか? それ を 確かめる のが 今週末。 これ ばかり は やって みない と わからない。 楽しい。 こわい。
これ は ML 検証 の ログ取り であって、 馬券購入 を 推奨 する もの では ありません。
- 5/23 (土) 朝 7:00: 本番機 の cron が 起動 → 当日 の 全レース 予想 CSV が 私 の Gmail に 届く
- その日 の うちに: 私 が 内容 を 確認 し、 検証用 の 最小額 で 単勝 を 購入
- 5/24 (日) 朝 7:00: 同じく 日曜版 が 届く → 同じ ルール で 購入
- 5/24 (日) 19:00: 検証 cron が 走り、 週次 ROI が 自動集計 される
検証 ルール (詳細 は 来週公開):
- 単勝 のみ (モデル が 一番 強い と 評価されている 券種)
- モデル の 推奨 上位 N レース に 限定
- 1レース 上限 / 週末 合計予算 上限 ともに 検証用 の 最小額。 具体額 は 来週公開
- 購入 は 手動 確認 のみ、 自動投票 は しない
馬券 は 自己責任 です。 私 の 数字 を 見て 真似 で 賭ける こと は 一切 推奨 しません。 私 は 趣味 と 検証 の ため に 必要 最小限 の 出費 で やります。
第9章 来週月曜 (5/25) の フォローアップ 予告 📅
来週月曜 の 22時頃 に 「実戦結果編」 として 別記事 を 公開 予定 です。 こんな内容を出します:
- 的中率・回収率 の 生数字 (隠さず全部)
- モデル が 推した 全レース と 実結果 の 突き合わせ表
- 賭けた金額・買い目・結果収支 (恥ずかしい やつ)
- モデル が ハマった 理由 or 外した 理由 の 反省会
- 来週以降 の 改善案
- そして… 211,000 頭 血統 スクレイプ が 終わってたら その 取り込み結果 も 載せます
- (おまけ) 「税金 を 半日 調べた 件 の 後日談」 ← 万が一 黒字 が 出てしまった 場合 のみ
勝っても 負けても、 「機械学習 を 競馬 と いう 過酷 な テストベッド に 突っ込むと こう なる」 と いう 実例 と して 価値 が ある と 思って います。 たぶん 負けます。 負けたら 笑ってください。 勝ったら 一緒 に 笑い ましょう。
第10章 おわりに 🌳
弊社 の 本業 (建築 設計 × AI) も ちゃんと 進んで います。 競馬 は あくまで 休日 プロジェクト で、 自分 に とっては 「ノイズ だらけ の 実世界 データ を どう 機械学習 で 料理 するか」 の 一番 真剣な 練習台 です。
仕事 で 扱う 図面 データ も、 結局 の ところ 「人間 が 手で 書いた ノイズ だらけ の デジタル化 遺産」 という 意味 で は 競馬 の 生バイナリ と 大差 ありません。 同じ 「仕様書 が ろくに 無い バイナリ を 実データ から 解読 する」 という 筋肉 が、 両方 で 鍛えられる。
それ が 伝われば 番外編 と しては 大成功 です。
来週月曜、 また 会い ましょう。 (たぶん 意気消沈 した 顔 で。)
🔁 最後に もう一度: 本記事 は ML 検証 の 読み物 です。 馬券購入 を 推奨 する もの で は ありません。 公営競技 は 余剰資金 で 適度 に。
困ったら → 厚労省 ギャンブル等依存症 相談窓口
関連記事 (Qiita 本編シリーズ)
- (本編シリーズ各記事へのリンクは公開時に追加予定)
使用ツール と 参考リンク
-
Claude Opus 4.7 (1M context) — メイン開発パートナー
- モデル概要・性能 / 1M トークン context: Anthropic 公式モデル一覧 (ja)
- Claude Code 上 で の モデル設定 (1M context 含む): Model configuration (en)
- LightGBM / Optuna — 学習・ハイパラ最適化
- Python (paramiko / pandas / requests) — 全工程
- JRA 払戻率 等 の 基礎情報: JRA スーパープレミアム / 払戻率の説明
- 競馬 の 払戻金 と 所得税 の 一般的 整理: 国税庁 タックスアンサー No.1490 / 最高裁 判決 (平成27年3月10日 / 平成29年12月15日)
- 私 の 睡眠時間 — 大量 に 消費 (返却不可)