学ぶ ・ 入門

はじめに — Keiba Vision の頭の中

Keiba Vision が「どの馬が勝ちそうか」をどうやって計算しているのかを、中学数学から始めて専門家が使う道具まで、一歩ずつ説明します。このページでは全体の地図を示します。

このページで学ぶこと
  • Keiba Vision の中で「予想」と呼んでいる計算が、実は 3 種類 あること
  • それぞれが数学のどの分野 (確率・統計・幾何・数列) を使っているか
  • このドキュメントを読む順番と、使う記号の意味

予想は 1 つではない

アプリの画面には「勝率」「能力値」「着順」がいろいろな場所に出てきます。これらは同じ計算から出ているように見えますが、実は 目的も考え方も違う 3 つの仕組み から出ています。

仕組み画面のどこ何を出す数学的な正体書かれている言語
① 予想エンジンレース予想の「印」「買い目」「評価」0〜100 の点数経験則による 加重平均 (確率ではない)Kotlin
② モンテカルロレース予想の「勝率シミュレーション」勝率・3 着以内率確率モデル を乱数で解くZig (WebAssembly)
③ 3D シミュレーション3D の画面1 回分のレース展開と着差②の 1 回分 + 運動の式Zig + JavaScript

そのほかに、予想の「材料」を作る計算があります。

  • 能力値 (名鑑の 45〜99 の数字) … Wikipedia の戦績を数値化し、順位に変換したもの → 能力値と適性
  • 血量・近交係数 … 血統表から割合を計算する → 血統の数学
  • 推定馬場 … 天気コードと降水量から判定 → 天気と馬場
① の「勝率」は確率ではない

レース予想画面の出馬表に出る「勝率」は、①の予想エンジンが作る 点数 です。16 頭分を足すと 375% になり、上位の馬は上限の 68% に張り付いています。ちゃんとした確率 (全頭を足すと 100%) になっているのは ② のモンテカルロの方です。なぜそうなっているのか、どう直せば確率になるのかは 予想エンジン と 本物の予想へ で詳しく扱います。

データの流れ

Wikipedia の記事 ──(Kotlin が解析)──> 戦績・勝ち鞍 ──> 能力値・得意な馬場と距離
                                                        │
サンプル出馬表 (スピード指数・脚質・調教) ─────────────────┤
                                                        ▼
                                   ┌─ ① 予想エンジン (加重平均) ─> 印・買い目
                                   ├─ ② モンテカルロ (10 万回)  ─> 勝率
                                   └─ ③ 1 回分の出来 ─> 3D の運動の式 ─> 映像・着差

①は Kotlin のサーバー (PredictorEngine.kt) で、②と③の「出来」の計算はブラウザの中で Zig から作った WebAssembly (montecarlo.zig) で、③の映像は JavaScript (sim3d.js) で動いています。

読む順番

このドキュメントは、前のページの知識を次のページで使うように並んでいます。数学に自信がなければ上から順に、自信があれば気になるページから読んでください。

  1. 入門 — 確率の基本 と 乱数のつくり方。期待値・分散・正規分布・中心極限定理を、アプリで使う分だけ最短で身につけます。
  2. 予想のしくみ — 予想エンジン、モンテカルロ法、能力値と適性。このドキュメントの中心です。
  3. 3D と映像の数学 — 3D の運動学、コースの幾何学、カメラとアニメーション。微分・パラメータ表示・微分方程式が出てきます。
  4. 血統と天気 — 血統の数学、天気と馬場。
  5. 発展 — 本物の予想へ。オッズと控除率、確率の正規化、Plackett–Luce モデル、Brier スコア、ケリー基準など、専門家が実際に使う道具と、このアプリをどう改善できるか。

各ページの最後には 練習問題 があります。友達に説明する前に、自分で解けるか確かめてみてください。

前提知識

  • 中学で習う 1 次関数、2 次関数、平方根、指数 (23=82^3 = 8 のような計算)
  • 「和の記号 ∑\sum」「関数 f(x)f(x)」という書き方に抵抗がないこと (出てきたときに説明します)

微分と積分は、使う場面で「何をしているか」を言葉で説明してから使います。知らなくても読み進められるようにしています。

このドキュメントで使う記号

記号読み方意味
P(A)P(A)ピー・エー出来事 AA が起きる確率
E[X]E[X]イー・エックス確率変数 XX の期待値 (平均)
V[X]V[X], σ2\sigma^2分散ばらつきの大きさ
σ\sigmaシグマ標準偏差 (分散\sqrt{\text{分散}})
μi\mu_iミュー・アイii 番目の馬の「平均的な出来」
Φ(x)\Phi(x)ファイ標準正規分布の累積分布関数 (xx 以下になる確率)
NNシミュレーションの回数
DDレースの距離 (m)
TiT_iii 番目の馬の走破タイム (秒)
⌊x⌋\lfloor x \rfloor床関数xx 以下の最大の整数
ソースコードへのリンク

コードの見出し (ファイル名) を押すと、GitHub の実物のファイルが開きます。このドキュメントの数式は、すべて実際のコードと 1 対 1 で対応しています。数値の例も、実際のアプリが出した値です。

まとめ
  • 「予想」は ① 加重平均の点数、② 確率モデル (モンテカルロ)、③ 1 回分のレース展開、の 3 種類
  • ① は Kotlin、② ③ の計算は Zig (WebAssembly)、③ の映像は JavaScript
  • 画面の「勝率」には、本物の確率 (②) と、点数 (①) の 2 種類がある