競馬の指数とは何なのか?作り方の解説と全レース指数を無料で公開

競馬_指数

はじめに

・指数って何なのかよくわからない
・どうやって作ればいいのかわからない
・今から指数を自分で作りたい
そんな人向けの記事です。
毎週独自指数も無料で公開しているので、そちらも興味ある方はどうぞ。

 

指数とは

指数は色々な媒体・個人が提供しているため様々な呼び名がありますが、代表的なものとしては以下があります。

スピード指数

走破タイムから導き出した能力指数のこと。

出典:デイリー:スピード指数とは

タイム指数

走破タイムを基準にして、競走馬の能力を数値化しています。
数値が高ければ高いほど優秀な時計=能力の高い馬と判断できます。

出典:netkeibaタイム指数、指数偏差値って?

○○指数

独自にカスタマイズされた指数。

走破タイムを基準とした「指数」をベースに、期待値の高い/低いファクターを計算したうえで最終的な競走馬の評価を数値化したもの。

全てに共通するのは走破タイム

指数は作成者によって様々なカスタマイズが行われているので種類としてたくさんはありますが、情報を数値化して客観的に表しているという点は共通であるがゆえ、競走馬の能力を一定の基準で評価してあげる必要性があります。それに過去の走破タイムを利用しているわけです。

ポイントとなるのは走破タイムの真の価値を見極めることで、例えばパンパンの良馬場で行われたレースと不良馬場で行われたレースを単純にタイムだけで比較することはできません。そのときの馬場状態等のファクターに応じてタイムの真の価値を評価する必要があります。

(昨今の指数はどれも馬場状態等を考慮して補正された値を用いているので、利用者側はそんなに気にするところでもないかとは思います。作る側は計算式を頭に入れておきたいです)

タイムの価値を求める段階では、媒体によって多少の違いはあろとうかと思いますが差がつくところではなりません。差がつくのはその後の独自カスタマイズです。

「期待値の高い/低いファクターを計算したうえで最終的な競走馬の評価を数値化する」

の部分ですね。これを算出するために膨大なデータを収集・分析していくのが指数作りの本質です。


 

つまりですね..まず指数というものが何か?を説明するにあたっては、

走破タイムから機械的に求められる「生の指数」と、それらをベースにしつつもそれ以外の要素を付け加えて数値化された「加工された指数」の2つががあるので、混合しないように分けて考えてあげる必要があると僕は考えています。

以下、便宜上、「生指数」と「加工指数」という言い方をします。

どちらが正解というわけではないですが、目的の違いを理解しておくことは重要です。

生指数:これだけでは競馬は勝てません。予想の参考程度に使うのが目的
↑スピード指数やタイム指数はこれに該当します(厳密には細かい精査をしているのかもしれませんが限りなくただの数値に近い)。生指数だけで競馬に勝つことは無理だと断言します。1番人気を買い続けても勝てないのと同じように、指数が高い馬だけを買い続けても長期的には勝てません。
加工指数:指数だけで勝てるようにすることが目的

↑○○指数はこれに該当します。発想としてはアナログ的な予想ではなく、デジタル的で機械的な予想に置き換えていって勝ちを目指すアプローチです。期待値重視の考え方で、回収率が100%を超えるロジックになっていなければ全く価値はありません。

 

世の中の指数や現在使っている指数がどちらに分類されるのか?勝てる指数なのか?は調査して理解した方がいいと思います。

tips
指数の歴史的なものに興味ある人向けてですが、
指数の元祖はアメリカ合衆国の競馬評論家であるアンドリュー・ベイヤー (Andrew Beyer) 
と言われており、それに関する書籍もあります。
amazon→ 勝ち馬を探せ(アンドリュー・ベイヤー)

ちなみに同氏は「指数だけじゃ勝てねぇ(超要約)」と言っていますが、
1970年代くらいの話なので、情報収集技術が加速した現代とは背景が全然違います。

 

指数のメリット

・期待値を見える化できる
・数値で見るのでブレない予想が構築できる

 

指数のデメリット

・競馬がつまらなくなる可能性がある

 

 

指数の作り方

完全無料で作る方法とラーニングコストありの前提で作る方法をそれぞれ紹介します。

無料で作る方法

無料で出来るなら越したことないですが、ある程度のITスキルが必要になります。

手法としては「Webスクレイピング」を利用します。

Webスクレイピングとは、Webサイトから情報を自動的に取得する技術です。HTMLやCSSを解析して必要なデータを抽出し、人間が見やすいように加工します。企業や個人は、Webスクレイピングを活用して、競合情報の収集や市場調査、データ分析などを行うことができます。
Webスクレイピングは、面倒な手作業を自動化できるため、作業時間の短縮や転記ミス防止が可能です。また、一度設定すれば対象サイトの構造が変わらない限り自動で、継続的にデータを収集して蓄積することもできます。抽出したデータはExcelやCSVファイルなどにエクスポートできるため、データを活用した分析を行うこともできます。

この時点で何それ?という方は厳しいです。

知識が全くなく1から身につけようとするのはハードルが高いので・・。

メリット

・無料。これに尽きる

デメリット

・スクレイピングスキルが必要
・構築に時間がかかる
・Web側の変更を常に取り込まないといけない
・サイトから取得できるデータの種類に限界がある

スクレイピングしようとなると一般的にnetkeibaあたりからデータを拾ってくることになりますが、以下のページ内で取得できる(かつ意味のありそうな)データの種類ってどれくらいあるか考えてみましょう。

コース:
馬場:
条件:
着順:
枠:
馬番:
馬名:
性齢:
斤量:
騎手:
タイム:
着差:
人気:
単勝オッズ:
後3F:
コーナー通過順:
厩舎:
馬体重:
払い戻し:
ラップタイム:

このあたりが使えそうなデータですがどうでしょう。分析対象の情報としてこれだけで足りるかどうかは微妙なラインです。間隔としてはちょっと少ないのかなという気がします。

指数の作り方

タスクとして大まかに5つあります。

①1ページをスクレイピングするコードを書く

まずコードを書くための言語を何にするの決めるところから始めます。マイナーすぎる言語だとネットに情報が落ちていないので苦戦します。

となると、ほぼPythonかエクセルVBAの二択になりそう。

pythonは機械学習とかデータ分析が得意な言語なので使える人はこっちかなと思います。

参考となりそうなサイト↓

スクレイピング|競馬予想で始める機械学習〜完全版〜

【競馬AI①】ほぼコピペだけ!Pythonでnetkeibaからデータを抽出する方法

自分はエクセル派なのでpythonはちょっと疎く、やるんならVBAという感じです。

参考となりそうなサイト↓

【VBA】netkeibaのオッズをスクレイピングする

あまりHowToが書かれた記事がなさそうので、やっている人がほぼいないんだと思います。

なので自分でチャレンジしたときのコードを貼ります(すぐにスクレイピングをあきらめたのでほとんど消してしまいこれしか残っていないw)。このコード実行するとさっき貼った1ページを丸々エクセルにコピペするような振る舞いをしてくれます。

Sub netkeiba_scraping()
‘URL
Const TARGET_URL As String = “https://nar.netkeiba.com/race/result.html?race_id=202444042402”

‘Chromeドライバのオブジェクトを取得
Dim Driver As New Selenium.ChromeDriver

‘Chromeを起動し、指定されたURLのページを表示する
Driver.Get TARGET_URL

‘テーブル情報を取得し、エクセルに貼り付ける
Cells(1, 1) = Driver.FindElementByXPath(“/html/body/div[1]/div[2]/div/div[1]/div[3]/div[2]/div[1]”).Text
Cells(2, 1) = Driver.FindElementByXPath(“/html/body/div[1]/div[2]/div/div[1]/div[3]/div[2]/div[2]”).Text
Cells(3, 1) = Driver.FindElementByXPath(“/html/body/div[1]/div[2]/div/div[1]/div[3]/div[2]/div[3]”).Text

Driver.FindElementByClass(“ResultTableWrap”).FindElementByTag(“table”).AsTable.ToExcel ThisWorkbook.Worksheets(“sheet1”).Range(“A5”)
Driver.FindElementByClass(“ResultPayBackRightWrap”).FindElementByTag(“table”).AsTable.ToExcel ThisWorkbook.Worksheets(“sheet1”).Range(“A23”)

Cells(26, 1) = Driver.FindElementByXPath(“/html/body/div[1]/div[3]/div[5]/div/div/div”).Text
Cells(27, 1) = Driver.FindElementByXPath(“/html/body/div[1]/div[3]/div[5]/table”).Text

‘ドライバをクローズし、Chromeを終了する
Driver.Close
Set Driver = Nothing

End Sub

うろ覚えですが、Seleniumというブラウザを操作するパッケージを使ってやった記憶があります。

VBAのスクレイピングを簡単楽にしてくれるSelenium

FindElementByXPathというのが取得したいデータがどこに書かれているのかパスを書く部分になりますが、これはサイトの構造に依存します。デメリットで書いた「Web側の変更を常に取り込まないといけない」というのはここのことを言ってます。ありがちなのがnetkeibaのページ上部に広告があったりなかったりして微妙にズレたりすること。

※FindElementByTagとかで直接パス指定ではなくタブの名前などで指定するやり方もありますが、取れるところと取れないところがありよくわからず・・

とにかくこんな感じで書けば、スクレイピング自体はできないことはないです。

②スクレイピングしたデータを蓄積する(データベースに取り込む)

一応①で1レース分エクセルにコピペできたので、何かしらのデータベースにそれを取り込みます。

このあたりやり方は色々ありますが、めんどければ全てエクセルシート上で完結させるやり方も一つの手です。「レース情報」みたいなシートを作ってそこにデータを流し込むイメージです。

ただしそのやり方をするとエクセルがとんでもない物量になることは目に見えているのでスマートではありません。VLOOKUPとかの関数を多用することになりそのうちエクセルが超重くなります。

※自分はデータベースはAccessを使う方針にしているので、AccessにSQLでデータを投入してましたが、AccessはMicrosoft365にてサブスクリプションを購入しないといけないので無料ではできません。無料でやるとするとmySQLとかpostgresSQLあたりを使うことになるかと思います。

③12レース*競馬場分*過去分を自動的にスクレイピングするコードを書く

これは割と簡単です。考え方としては↑で載せたコードをループさせるだけです。

netkeibaの場合、race_idでレースを一意に識別できるので、この値を可変にしてあげます。

例えば、race_id=202401020411だと、2024年(2024)・札幌競馬場(01)・第2回(02)・4日目(04)・11R(11)であることが読み取れます。

④収集したデータを分析する

一般的にデータ分析というのは収集フェーズ(①~③)が作業工程のほとんどであると言われており、競馬の指数構築も例外ではありません。

ここまでたどり着けば、後はデータを煮るなり焼くなりしてごにょごにょやるだけになります。

何が回収率を上げて何が回収率を下げるのかを試行錯誤していってロジックを構築していきます。

一旦は「単勝で回収率100%を超える」ようなロジックを立てることを目標にするのが近道です。

いきなり3連複とか3連単をやるのはハードルが高いし、経験則として単勝で結果が出ないロジックが他の券種で通用することはないです。

確率論的に考えても再現性の高い単勝で検証するのは理にかなっていると言えるでしょう。

ちなみにやってみるとわかると思いますが、複勝は難しいです。

⑤出馬表を取得して指数を算出する

ロジックが作れたら、後は毎週の出馬表に指数なりをアウトプットしていくだけです。

出馬表をインプットにして独自の計算ロジックをプログラムで行わせ、指数の値なり順位等をエクセルとかに見える化する作業になります。

だいぶ端折って書きましたが正直スクレイピングは非推奨

ラーニングコスト有で作る方法

これまで無料で指数を作る方法を散々解説していきましたが、正直かなりめんどくさいのである程度の費用投資は致し方ないと思いますし、自分もラーニングコストを払ってます。

その内訳はというと・・・

・DataLab(target frontier JV)
・Microsoft365(Access)

になります。特にDatalabに関しては必須だと思います。

DataLab(target frontier JV)

月額2,090円

JRAからの公式情報がJV-LINKを通じて取得できます。

target frontier JV自体は無料ツールです。

Microsoft365(Access)

年契約12,984円(=月換算1,082円)

エクセルと相性がいいのがアクセスなので使っていますが、好みの問題なので必ずしも必須ではないです。時代遅れ感はありますが、環境構築などの手間をかけないで使える点が魅力的です。

指数の作り方

Excel VBAを使うことを前提として記載します。

①データの収集

一例ですが、targetからデータを取得方法を紹介します。

開催タイム分析

メインメニュー → 開催分析 → 開催タイム分析 を押下

開催成績選択の画面に遷移するので、取得した開催を選択し、CSVにエクスポート

成績(開催単位)

メインメニュー → 成績 → 任意の開催を選択

開催メニューの画面に遷移するので、取得した開催を選択し、TXTにエクスポート

成績(レース単位)

1レースごとの細かい情報がほしいので、成績メニューから任意のレースを選択(以下では札幌11レースを選択しています)

出力した項目をカスタマイズできるので「★項目選択」にて欲しい項目を選択し、CSVにエクスポート

tips
1レースごとに取得したCSVを1つCSVファイルに結合するバッチを作っておくと楽です。
以下をテキストにコピペし、「任意の名前.bat」として結合したいcsvと同じ階層に保存
したうえで、実行してください。すると、result.csvが出力されます。

@echo off
setlocal enabledelayedexpansion

set /a counter=0

for /f %%i in ('dir /b *.csv') do (

    echo %%i
    if !counter!==0 (
        set /p _head=<%%i echo !_head!>>result.csv
    )
    set /a counter=!counter!+1

    for /f "tokens=* skip=1" %%b in (%%i) do (
        echo %%b>>result.csv
    )
)
pause
オッズ取得

メインメニューから出馬表を押下し、出馬表レース選択画面にて「他出力」を選択

ここからオッズをCSVにエクスポートできます。

先週の結果分析

ここまでtargetからデータ取得してきましたが、ここだけ別口になります。

「生指数」を計算するのに、馬場状態やペース、補正タイムなどの情報がほしいところです。

targetのみでは全部取得できませんのでそれを補うために、グリーンチャンネルで放送されている「先週の結果分析」という番組で公開されている情報をinputにします。

この番組のデータが実質的に公式データであると言っても差し支えないと思います。

馬場状態などの情報を細かい数値で出してくれるので指数の精度向上に役立ってます。

そして、同番組で放送されている内容をHPに公開してくれている神サイトがあるので紹介します。

先週の結果分析 | Victory Road (ittai.net)

個人的には非常にお世話になっているので、サイト運用を引継ぎたいくらいですw

(これがないとわざわざ番組を見て手で情報を入力しないといけなくなる)

②データベースに保存

以上でデータ分析に必要な元ネタとなるinputデータは出そろいしました。

ただ今現状としては各データをバラバラに取得しただけの状態なので、1つのデータとして紐づけたうえで、データベースに保存する作業が必要になります。

やり方としては開催タイム分析で取得したデータの中にある「レースID」でも紐づけるのがベターかなと思います。

例えば、開催タイム分析と先週の結果分析のデータをどうやって紐づけるの?と考えた場合、エクセルのシートでやるにはそんなに難しくありません。

先週の結果分析にある「日付」と「馬名」、開催タイム分析にある「年月日」と「馬名」をKEYにしてあげれば連携できます。

(どちらも「240811プルパレイ」というデータが作れるので一致する→レースIDがわかる)

このようにそれぞれ別個で取ってきたデータを一つ一つ連携させることによって使えるようにして、最終的に繋げたものを1つのデータベースに保存するという流れです。

データベースに保存するには、DBにテーブルと保存したい項目のレコードを用意してあげて、SQLで操作してあげます。Access使うとその点はテンプレがネットにたくさん落ちているので楽です。

tips
サンプルコード
Sub ConnectDB()

Dim strFileName As String
strFileName = "UMDB.accdb" 'データベースのファイル名

Dim adoCn As Object
Set adoCn = CreateObject("ADODB.Connection") 'ADODBコネクションオブジェクトを作成
adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.path & "\" & strFileName & ";" 'Accessファイルに接続

(中略)
'レコード追加のSQL文
strSQL = "INSERT INTO RACE_M(日付,RC,クラス,R,距離,状,勝ち馬,性齢,条件,走破T,T差,P補正,完T差,馬場差,TL,ML,新ML,レースID,"

(中略)
adoCn.Execute strSQL

'後処理
adoCn.Close 'Accessへの接続を解除する
Set adoCn = Nothing 'Accessへの接続用のオブジェクトを開放

End Sub
③収集したデータを分析する

ここまでくれば、やることとしては無料で指数を作る方法と同じように、後はデータの分析をする作業です。なので同じことを書きます。

一般的にデータ分析というのは収集フェーズ(①~③)が作業工程のほとんどであると言われており、競馬の指数構築も例外ではありません。

ここまでたどり着けば、後はデータを煮るなり焼くなりしてごにょごにょやるだけになります。

何が回収率を上げて何が回収率を下げるのかを試行錯誤していってロジックを構築していきます。

一旦は「単勝で回収率100%を超える」ようなロジックを立てることを目標にするのが近道です。

いきなり3連複とか3連単をやるのはハードルが高いし、経験則として単勝で結果が出ないロジックが他の券種で通用することはないです。

確率論的に考えても再現性の高い単勝で検証するのは理にかなっていると言えるでしょう。

ちなみにやってみるとわかると思いますが、複勝は難しいです。

④出馬表を取得して指数を算出する

ロジックが作れたら、後は毎週の出馬表に指数なりをアウトプットしていくだけです。

出馬表をインプットにして独自の計算ロジックをプログラムで行わせ、指数の値なり順位等をエクセルとかに見える化する作業になります。

画像小さいですが、アウトプットイメージは以下になります(実際はもっと横に長い)。

「順位」という列に指数順位、「指数」という列に指数の値が入ってます。

上記例だと指数1位は「ジオグリフ」指数2位は「ステラヴェローチェ」です。

 

さいごに

簡単に指数の作り方を説明しましたが、こういうことを知りたいとかあれば問い合わせいただければと思います。

 

全レース指数の無料公開

レジまぐにて独自指数1位の馬を無料提供しています。
毎週末の中央競馬の全レースが収録されています(新馬・障害戦を除く)。

独自指数の説明はこちらの記事です。

コメント

タイトルとURLをコピーしました