JvLink To Importer

スピード指数の作り方と使い方

スピード指数の作り方と使い方

競馬予想で「この馬は強い」と判断する根拠の一つがスピード指数です。走破タイムを標準化して、異なるレース条件の馬同士を同じ物差しで比較できるようにした数値です。この記事では、自分でスピード指数を作る方法を解説します。


なぜ走破タイムをそのまま比較できないのか

走破タイムは以下の要因で大きく変動します。

  • 距離: 1200mと2400mではタイムが倍違う
  • 競馬場: 東京と中山ではコース形状が違う
  • 馬場状態: 良馬場と重馬場で数秒変わる
  • ペース: ハイペースなら全体のタイムが速くなる

東京芝2400m良馬場で2:24.0の馬と、中山芝1200m重馬場で1:12.0の馬を「どっちが強いか」を走破タイムだけで比較するのは不可能です。スピード指数はこの問題を解決します。


スピード指数の基本的な考え方

  1. 条件ごと(競馬場×距離×馬場状態)の基準タイムを求める
  2. 各馬の走破タイムと基準タイムの差分を計算する
  3. 差分を共通のスケールに変換する

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 でデータベースを構築して、オリジナルのスピード指数を作ってみてください。

この記事をシェア

Post