スピード指数の作り方と使い方
スピード指数の作り方と使い方
競馬予想で「この馬は強い」と判断する根拠の一つがスピード指数です。走破タイムを標準化して、異なるレース条件の馬同士を同じ物差しで比較できるようにした数値です。この記事では、自分でスピード指数を作る方法を解説します。
なぜ走破タイムをそのまま比較できないのか
走破タイムは以下の要因で大きく変動します。
- 距離: 1200mと2400mではタイムが倍違う
- 競馬場: 東京と中山ではコース形状が違う
- 馬場状態: 良馬場と重馬場で数秒変わる
- ペース: ハイペースなら全体のタイムが速くなる
東京芝2400m良馬場で2:24.0の馬と、中山芝1200m重馬場で1:12.0の馬を「どっちが強いか」を走破タイムだけで比較するのは不可能です。スピード指数はこの問題を解決します。
スピード指数の基本的な考え方
- 条件ごと(競馬場×距離×馬場状態)の基準タイムを求める
- 各馬の走破タイムと基準タイムの差分を計算する
- 差分を共通のスケールに変換する
Step 1: 基準タイムを算出する
基準タイムは「その条件での平均的なタイム」です。勝ち馬の平均タイムを使うのが一般的です。
-- 条件ごとの基準タイム(勝ち馬の平均走破タイム)
CREATE TABLE base_times AS
SELECT r.keibajo_code, r.kyori, r.shiba_babajotai_code AS baba,
AVG(u.soha_time) AS base_time,
STDDEV(u.soha_time) AS std_time,
COUNT(*) AS sample_count
FROM umagoto_race_joho u
JOIN race_shosai r USING (race_code)
WHERE u.kakutei_chakujun = '01'
AND u.soha_time > 0
AND r.track_code LIKE '1%' -- 芝
GROUP BY r.keibajo_code, r.kyori, r.shiba_babajotai_code
HAVING COUNT(*) >= 20;
サンプル数が少ない条件(20未満)は信頼性が低いため除外します。
Step 2: 差分を計算する
各馬の走破タイムから基準タイムを引けば、その馬がどれだけ速かった(遅かった)かがわかります。
-- 走破タイムと基準タイムの差分
SELECT u.ketto_toroku_bango, u.race_code, u.soha_time,
bt.base_time,
u.soha_time - bt.base_time AS time_diff
FROM umagoto_race_joho u
JOIN race_shosai r USING (race_code)
JOIN base_times bt
ON r.keibajo_code = bt.keibajo_code
AND r.kyori = bt.kyori
AND r.shiba_babajotai_code = bt.baba
WHERE u.soha_time > 0
AND u.kakutei_chakujun BETWEEN '01' AND '18';
time_diff がマイナスなら基準より速い(=強い)、プラスなら遅い(=弱い)ことを意味します。
Step 3: スケール変換して指数にする
差分をそのまま使うと距離によってスケールが異なります。1200mの1秒差と2400mの1秒差は価値が違います。標準偏差で割って正規化します。
-- スピード指数の算出(平均100、標準偏差15のスケール)
SELECT u.ketto_toroku_bango, u.race_code,
100 - ((u.soha_time - bt.base_time) / bt.std_time) * 15 AS speed_index
FROM umagoto_race_joho u
JOIN race_shosai r USING (race_code)
JOIN base_times bt
ON r.keibajo_code = bt.keibajo_code
AND r.kyori = bt.kyori
AND r.shiba_babajotai_code = bt.baba
WHERE u.soha_time > 0
AND bt.std_time > 0
AND u.kakutei_chakujun BETWEEN '01' AND '18';
これで「スピード指数100が平均的な勝ち馬レベル」「115なら非常に強い」「85なら平均以下」のように解釈できます。
Pythonでの実装例
SQLだけでも作れますが、Pythonを使うとより柔軟に処理できます。
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('postgresql://user:pass@localhost/keiba')
# データ取得
query = """
SELECT u.ketto_toroku_bango, u.race_code, u.soha_time, u.kakutei_chakujun,
r.keibajo_code, r.kyori, r.shiba_babajotai_code AS baba
FROM umagoto_race_joho u
JOIN race_shosai r USING (race_code)
WHERE u.soha_time > 0 AND r.track_code LIKE '1%%'
AND u.kakutei_chakujun BETWEEN '01' AND '18'
"""
df = pd.read_sql(query, engine)
# 基準タイム算出(勝ち馬の平均)
winners = df[df['kakutei_chakujun'] == '01']
base = winners.groupby(['keibajo_code', 'kyori', 'baba'])['soha_time'].agg(['mean', 'std', 'count'])
base = base[base['count'] >= 20].reset_index()
base.columns = ['keibajo_code', 'kyori', 'baba', 'base_time', 'std_time', 'count']
# 結合してスピード指数算出
df = df.merge(base[['keibajo_code', 'kyori', 'baba', 'base_time', 'std_time']],
on=['keibajo_code', 'kyori', 'baba'], how='inner')
df['speed_index'] = 100 - ((df['soha_time'] - df['base_time']) / df['std_time']) * 15
スピード指数の活用法
直近指数の比較
レースに出走する全馬の直近3走のスピード指数を比較すれば、能力の高い馬が一目でわかります。
# 各馬の直近3走の指数平均
recent = df.sort_values('race_code').groupby('ketto_toroku_bango').tail(3)
avg_index = recent.groupby('ketto_toroku_bango')['speed_index'].mean()
指数のピーク値
平均だけでなく最高値も重要です。「過去に指数120を記録したことがある馬」は、条件が揃えば再びそのレベルを発揮する可能性があります。
指数の安定度
標準偏差が小さい馬は安定して走るタイプ、大きい馬はムラがあるタイプです。安定型は複勝、ムラ型は単勝向きの馬券戦略になります。
注意点
- 馬場差の精度: 良馬場の中でも「高速馬場」と「普通の良馬場」があり、JRAの4段階では表現しきれない
- 展開の影響: ハイペースで消耗した場合、実力以上に遅いタイムが出る
- 距離変更: 初の距離では指数の信頼性が下がる
- サンプル数: 基準タイムのサンプルが少ない条件では指数が不正確になる
これらの限界を理解した上で使えば、スピード指数は強力な予想ツールになります。
まとめ
| ステップ | 内容 |
|---|---|
| 基準タイム算出 | 条件ごとの勝ち馬平均タイム |
| 差分計算 | 走破タイム - 基準タイム |
| スケール変換 | 標準偏差で正規化(平均100) |
| 活用 | 直近平均・ピーク値・安定度で比較 |
市販のスピード指数を使うのも手ですが、自作すれば計算方法を自分で調整できます。馬場差の補正方法を工夫したり、ペースを加味した補正を入れたり、自分なりの改良が可能です。
JvLink To Importer でデータベースを構築して、オリジナルのスピード指数を作ってみてください。
この記事をシェア