今週から人工知能による競馬予測をはじめます

競馬のポッドキャスト、インターネットラジオを不定期で配信しているダークホースラジオです。

この番組の中では競馬予想はしていない(競馬といえば予想→でもそれだけじゃないから競馬予想をしないそんなラジオをやりたい→予想をしないつまり予想外のラジオ→予想外といえば穴馬→ダークホースラジオ)のですが、半年くらい試行錯誤を重ねて「人工知能による競馬予測」が何とか形になってきました。20年近く楽しんで積み重なってきた競馬の知識と、普段仕事などでも使っている統計やデータ分析の経験をミックスして作ったものです。周りの方の競馬予想の考え方や書籍から知見を得たり、競馬人工知能の先人の方々の取り組みも大いに参考にさせてもらいました。ありがとうございます。毎週全レースはできないですが、後半のレースを中心にこちらで予測を公開していきたいと思います。番組コンセプト外なのですが、「競馬予想」と「競馬予測」はアプローチや考え方も違うという言い訳をしつつ、このように別ページで書いていきます。

また、競馬予測だけでなく関連する記事も書いていきたいです。どのような考えや取り組みで予測モデルを作ったのか、検討段階で使っていた重回帰分析による競馬予測の紹介記事にはおかげさまでたくさんの方々からアクセスをいただきました。感謝です。

また重回帰分析を使って競馬の予測モデルを作ってみた

今回の人工知能編や、予測以外にもデータを使って面白い分析ができそうであれば書いていきます。例えばこういうものですね。

父ダイワメジャー、20年前で言うと〇〇〇〇〇?

予測の概要は大まかに以下です。ご自身の予想との照らし合わせて楽しんだり、競馬のデータマイニングに興味がある方の何かしらの参考になれば幸いです。それではよろしくどうぞ。よろしくどうぞは競馬エイトの吉田均さんのオマージュです。

概要

■予測しているもの
◎馬場差を補正した今回の走破タイムの指数(競馬予想データベース「TARGET frontier JV」の「補正9タイム(補9)」に対応)
◎3着以内に入りそうかどうかの判定

■分析対象
2007年1月からのJRA平地競争

■予測手法
ニューラルネットワーク(多層パーセプトロン)

こちらの内容を競馬に応用しています。

IBM SPSS Statistics Tips:第12回 人工知能を利用したデータマイニング手法 | IBM ソリューション ブログ

null

また、JRA-VANのデータマイニングも近い手法を使っているようです。

データマイニング予測の仕組み|JRA-VAN広場|競馬情報ならJRA-VAN

データマイニングが的中させたこれまでの万馬券を公開しています。JRA-VANの競馬情報サービスでは、JRA公式データベースと様々な予想ソフトにより、競馬予想の世界をご紹介しています。

■馬券購入の基本スタンス
◎指数1位、3着以内判定馬から指数2位以下の3連単(20点前後)
◎3着以内判定馬から指数上位馬の3連複(7点前後)

■人工知能競馬新聞「闇馬(やみば)エイト」
こんな感じのものをアップしていきます。もっと競馬新聞っぽくなるように作り込もうと思います。ここまでくると競馬エイトみたいなロゴも作りたいです。

「闇馬エイト」という名前をどこまで推していくかは決めかねています(笑)ただ、これからも試行錯誤して楽しく競馬ができればと思っていますので、ダークホースラジオとあわせてお楽しみいただければ幸いです。

また重回帰分析を使って競馬の予測モデルを作ってみた

こちら、「昔の競馬のことをただ喋り続ける」「競走馬をゲストに呼んでインタビューする」「あの不朽の名作クラシックロードを復活させる」なんて遊びをやっているネットラジオなのですが、最近は競馬予測のことばっかりやっています。楽しみに聴いてくれていたごく一部の方ホントすいません。最近こっちにハマってしまって、桜咲くころからまたやっていきたいと思いますので引き続きよろしくお願いします。

さて、前回の記事をたくさんの人が見てくれたようで、記事のクオリティはともかく、ありがとうございます。なんか「競馬 重回帰分析」で検索すると上位の方に出てくるようで、繰り返しますが記事のクオリティはともかく、この分野に興味がある人がたくさんいるということなのでしょう。スポーツとデータの活用やその奥深さは野球のマネー・ボールが有名ですが、おそらく大谷翔平よりそこらへんの未勝利馬1頭のデータの方が豊富にあるでしょうからスポーツインテリジェンスとしての競馬の楽しさはまだまだ広がっていきそうな気がします。netkeibaでもついにAIによる予想が始まりました。プロレス、格闘技で言うと他団体からの侵略者です。怖いですね。賛否両論出るでしょう。でもそうやって盛り上がるものかと思います。

最近は自作した予測式をもとに馬券を買っています。まあ当たったり外れたりはあるのですがレースを終えるたびに「こういう観点のデータが抜けている」「データの基準を変えよう」「うわ計算ミスしてた」など、いろいろな発見があります。何度か修正を繰り返したのち最近あらためて作り直したので、今回はその作成過程をまた書いていきたいと思います。

競馬予測については、人工知能や機械学習の使い手、統計学のプロフェッショナルのように上には上がたくさんいますので、私の場合ファッション競馬予測の域は出ていないでしょう。ただ、こういったアプローチに興味がある人が結構いることはわかってきました。なので、私のような「掛け算、割り算、初歩的な統計学のレベルでもこれくらいのことはできる」を伝えることには多少の価値があるかもしれません。頑張ればExcelだけでもそれなりの予測できますし、私がそうです。統計学やオフィスソフトの講座に出て勉強することを考えて、それを好きな競馬で無料で練習できると思えば、仮に多少馬券で損をしたとしても十分お釣りがくると思います。「人生の回収率を上げる」そんな意味が持たせられれば良いと思います。

それでは、長くなりますが前回よりもう少し詳しく「重回帰分析を使って競馬の予測モデルを作ってみた」を書いてみたいと思います。よろしくどうぞ。毎度恐縮ですが「よろしくどうぞ」はスーパー競馬の吉田均さんのオマージュです。

こんなステップで書いていきます。

予測モデル作成のステップ
 1.競馬予想のファクターを整理する
 2.データを準備する
 3.予測式を作る
 4.予測指数を算出する
 5.指数の勝率から期待値を算出する
 6.指数を自動的に算出する

1.競馬予想のファクターを整理する
まずは予測を構造化する作業。「競馬予想」そのものについて考え、整理していきます。前回と違って一度モデルを作成し運用しているので「この変数は予測に使える、使えない」「こんなデータがあれば予測がより多角的になる」「このデータならば出力・加工することができる」などがわかってきています。今回は使えるデータの勘所を持ちつつ整理できました。

前回作成した以下の考え方をベースとして

%e4%ba%88%e6%83%b3%e3%83%95%e3%82%a1%e3%82%af%e3%82%bf%e3%83%bc

「どんなデータが競馬予測に必要で使えそうか」
ファミレスでポストイットに書き出して(たまたま隣の人が週刊Gallop読んでて恥ずかしかったです)、家の壁に貼って構造整理しました。

IMG_5676

・競走馬(性別や血統などその馬の持つ属性)
・競争(開催条件やレース適性などレースの諸条件)
・競争能力(過去実績などその馬の能力)

の3つに分類することができました。またアップデートするときはここに立ち戻り何が不要、または不足かを考えます。また、真ん中にあるように予測する対象は「走破タイム」です。理由は前回も述べましたがカッコいいからです。詳細は後ほど。

2.データを準備する
アナログからデジタルへの変換作業。紙に書いた内容に対応するデータを作っていきます。このパートが全作業の8割近くを占めます。「性別」「年齢」は出力データがそのまま使えますが大半は再計算をする必要があります。例えば「種牡馬の能力」を予測に入れるとします。では「能力」とは何を指すのでしょうか。その定義を自分で決めて該当するデータを出力し加工しなければいけません。さらにモデル作成に使用するデータも過去5年分以上は使うことになります。5年間でざっと25万頭分です。「種牡馬の能力」ひとつでも25万頭分のデータが必要ですし、「母父の能力」も作りたくなります。その繰り返しです。

それでは、加工した代表的なデータを中心に紹介していきます。

【血統】
代表的なものは種牡馬になりますが、大きく「コース適性」と「産駒レベル」に分けて考えました。前者がコース別の勝率や複勝率、後者がどの程度のレベルの馬を輩出しているか、です。例えば「○○○は京都ダート1200の複勝率は凄く高い。だけどそのデータは未勝利戦ばかりのもの」みたいなものは分離すべきと考えたからです。

「コース適性」はコースごとの種牡馬の複勝率を使っています。勝率も連対率もあるのですが、種牡馬の相対比較では大差ないので複勝率だけにしています。「産駒レベル」は芝、ダートごとの全産駒のタイム指数の中央値を使っています。一般的なのは平均値ですが、レースをあきらめた大敗馬などは極端に指数が低くなり産駒レベルを正しく表せない可能性があるためです。全コースの全種牡馬なので2万頭近くのリストになっています。

SnapCrab_NoName_2017-3-12_23-58-30_No-00

「コース適性」は種牡馬の系統、母父、母父の系統でも同様のデータを作っています。
生産牧場も同様の考え方で複勝率、産駒レベルを算出しました。余談ですが生産牧場は予測するうえで重要度が高いファクターで「ノーザンファーム」というだけで産駒レベルは全体と比べ5馬身ほど違います。まさに「競馬は農業。血を育むのは人」ですね。

【ペース】
競馬予想支援ソフトのTARGETにはRPCIという「上がり3ハロン前後で、どれだけ速度が変わったか」を示す指標があります。RPCIが50前後だと平均ペースという一応の目安があるようですが、上がり3ハロン前後のバランスはコースによっても大きく異なるので再計算をしました。「阪神ダ1200mのように平均RPCIが45になるような前傾ラップで48はハイペースとみなさない」みたいなことです。コースごとの平均RPCIを算出し、各レースが比べてどの程度離れているか、つまりRPCIを偏差値化することで、どのコースでも同じ基準でハイ、ミドル、スローペースを判別できるようにしました。25万頭分の前5走のデータすべてを判別しています。

SnapCrab_NoName_2017-3-12_23-56-41_No-00

ペースのデータを単独で予測に使用することはないですが「どのペースでどんな競馬をしたか」に使います。そのセットになるのが次の「脚質」です。

【脚質】
脚質はTARGETに「逃げ~後方」までの5種類のデータがあるのですが、名義データのため分析がしやすいように数値データに変更します。また「先行」といっても頭数によっては道中2番手も5番手も「先行」となってしまいます。その意味をもう少し細かく区分したかったためひと工夫しました。わかりやすい数値データとして番手の情報もあるのですが、6頭立てと18頭立ての3番手は位置取りが全然異なるので、全レースある程度共通で扱えるよう「3コーナーの番手÷出走頭数」の相対的なポジションで表すことにしました。1だと最後方ということになります。また、「逃げ~後方」の脚質データはカテゴリ化されていてわかりやすいというメリットはありますので、相対的ポジションと脚質データを比較して置き換えができるような基準値も作っています。下記の分析から「3コーナーの番手÷出走頭数」が0.11以下だとほぼ「逃げ」と判定できます。こちらも過去5年約20万頭、前5走の結果を計算しました。前5走の平均をとるとその馬のおおよその次走の脚質を判別することができました。出走馬の脚質および位置取りのデータとして活用します。

SnapCrab_NoName_2017-3-13_12-55-52_No-00

【ペース×脚質】
上記2つのデータを掛け合わせることでまた違った視点を加えることができます。わかりやすいところでは「前走強い競馬をした馬」の判別です。「ハイペースで逃げた馬」「スローペースで脚を余した馬」を判別しフラグを立てておきます。例えば「前走ハイペースで逃げたけど負けた馬」が次走パフォーマンスを上げるという関係性があれば、このフラグがついている馬はプラスの予測スコアが出てくるようになります。

今回はタイムを予測するために使用していますが、脚質やペース関連のデータは「このレースはどんなペースになるか」「どの馬が逃げるか」といった違う予測にも活用できそうです。この観点も機会があれば色々試してみたいと思っています。

【その他】
上記は定義を作るところから考えなければいけないものですが、その他では過去のレース条件や結果のデータを使用して単純な計算(データは膨大ですが)で出すものが多いです。わかりやすいところでは前走からの距離や斤量の変化です。計算は単純な引き算で出せるものですが、データ処理上は一工夫入れています。例えば「距離短縮は有利だけど延長が不利というわけではない」のようにその効果は一方向ではないので、距離変化ならば「短縮」「維持」「延長」の3つのカテゴリを用意してそれぞれ該当するフラグを立てています。最初は数値データを使っていたのですが、3000mなど長距離からの臨戦過程の馬で異常値が出る(京都金杯のエアスピネルとか)ことがあったので、単純に「短縮」「維持」「延長」にしています。こういう部分が一度運用してみて得た知見だったりします。

このような処理を重ねていきながら、最初の写真にある紙に対応したデータが完成します。途中で作業を止めると何をしていたかよくわからなくなりますのでだいたい徹夜作業になってしまいます。産みの苦しみですね。

SnapCrab_NoName_2017-3-13_13-20-37_No-00

3.予測式を作る
ようやくここからがスタートです。説明が遅くなりましたが、写真の真ん中に「走破タイム」とあるように、今回の目的は「出走馬のタイムを予測する」ことです。前回の記事でも書いたのですが、タイムが予測できれば超カッコいいというのが第一の理由です。ただ、ご存知の通りタイムは出走メンバー、ペース、馬場状態に大きく左右されてしまいます。直前の状況やレースが始まらないとわからない要素が多いため、タイムそのものを過去データだけで精度高く予測することは厳しいでしょう。元々タイムから着順を予測したいのですが、「この馬は3着」よりもレースレベルのようなものを反映して「この指数はG1級だ」「過去5年のレースよりレベルが高いメンバー」みたいなことを言いたいわけです(これも超カッコいいからです)。という背景から予測対象はTARGETで公開している馬場差を考慮した補正タイムにしています。TARGETを使ってデータを出力し、過去の補正タイム実績も予測のために使っているので、データを扱いやすいというメリットがあります。補正したタイムなので以降では「指数」とも表現します。

予測には「重回帰分析」という手法を使っています。前回記事と重複してしまいますが、こちらのサイトの説明を引用させていただきます。

例としてある店の顧客に対する販売実績と、顧客の属性の関係を分析します。目的変数として、ある年の各顧客の購入額をとります。説明変数として、顧客の属性(年齢、性別、家族人数、年収など)を用いることとします。すなわち、(購入額)= a ×(年齢)+ b ×(性別)+ c ×(家族人数)+ d ×(年収)+(誤差)という式において、a,b,c,d (これを偏回帰係数といいます)の値と、誤差項の値を求めます。この式に、新しい顧客の属性データを入れれば、購入額が推定できるというのが、(重)回帰分析の考え方です。

例えばレース結果を種牡馬の適性だけで説明をすることは難しい(血統の切り口から正解にたどり着くというのとは別の話)です。レースは様々な要素の総合力で決まって(多分そうなのですがそう仮定して)いるとして、複数の要素から受ける影響の有無や強弱を統合して算出しているのがこの重回帰分析です。 上記引用の(購入額)が補正タイム、(年齢)(性別)(家族人数)(年収)が血統、斤量、馬場状態、騎手、過去の成績などの各種データになります。それぞれの要素に重要度を示す係数をかけ算することで、過去走った馬の補正タイムに近くなるような式を作ります。そして、これから走る馬の情報を代入し、次走での補正タイムと勝ち馬を予測します。

例えば、東京芝1600mのタイム(馬場差補正済み)の予測式はこちらです。過去5年の出走馬4039頭のデータを使って計算しています。

47.1+(牝馬)*-0.5⁺(年齢)*-0.7+(調教師複勝率)*4.8+(生産牧場産駒レベル)*0.1+(母父複勝率)*2.5+(未勝利)*-5.1+(1000万下)*3.8+(1600万下)*8.0+(G1)*12.2+(2歳限定)*-7.3+(3歳限定)*-6.9+(牝馬限定)*-0.5+(馬齢)*7.3+(別定)*10.3+(重)*-2.8+(不良)*-2.6+(騎手複勝率)*8.2+(負担重量率)*-53.6+(出走頭数)*-0.2+(馬番)*-0.1+(レース間隔週)*-0.1+(脚質後方)*-0.5+(ダ→芝)*-0.7+(距離延長)*-1.6+(距離短縮)*0.7+(前走からグレード下降)*-1.3+(前走からクラス維持)*-1.3+(前走からクラス下降)*-2.1+(鞍上強化)*-0.8+(鞍上弱化)*-0.9+(前走からの種牡馬適性変化)*4.2+(前走上がり3位以内)*0.6+(タイム連続上昇)*1.0+(近3走ハイペース先行経験)*1.1+(前走タイム)*0.1+(近3走平均タイム)*0.2+(近5走ベストタイム)*0.3

長く意味不明な式を書いてしまいましたが、()の中に出走する馬の情報を入れていくと今回の補正タイムを予測することができます。この中でわかりやすいのは「馬番」です。*-0.2となっていますが、馬番が1なら-0.2、大外18なら-3.6となります。補正タイムは「1=約1馬身」換算なので、枠の差だけで説明すると約3馬身差の計算になります。

ただし上記は()内の値の基準がバラバラですので、どの要素の影響が大きいのかはわかりません。各要素の影響度を比較できるよう標準化し、強弱をわかりやすく視覚化すると以下になります。

SnapCrab_NoName_2017-3-13_15-33-18_No-00

この中には「レース条件など出走馬全体に等しく影響のあるもの」「競走馬の能力や属性で差があるもの」の2通りがあります。競走馬間の評価差は後者から生まれます。東京芝1600mの今回の予測式では「近5走でのベストパフォーマンス」が一番大きな影響があることがわかります。これはあくまで解釈ですが能力を発揮しやすいコースだからでしょうか。また、どのコースにも言えることですが、近3走平均や前走のパフォーマンスなど、やはり競争能力が大きな影響を占めています。距離延長などはマイナス要因として働きます。イメージとしては前走1200mから来た馬などでしょうか。確かに厳しそうな感じがします。逆に距離短縮はプラス要因になっていますね。血統も影響度は小さいながらも種牡馬、母父ともに関係がありそうです。

ただ、最終的には各要素で積み上げた結果になりますので、臨戦過程が距離延長だったとしてもその他の要素で補っていれば指数上位となることは十分あります。上記の影響度を使って「血統的にはこの馬が有利」など切り出すこともできますが、評価はあくまで総合力です。

このような式をコースごとに算出し、予測できるようにしています。

SnapCrab_NoName_2017-3-13_15-55-40_No-00

4.予測指数を算出する
先ほどの予測式を使って、実際に東京芝1600mのレースを予測してみました。この記事を書いた直近の重賞では東京新聞杯がありましたので、出走馬のデータを当てはめてみたいと思います。こうなります。

SnapCrab_NoName_2017-3-15_0-30-41_No-00

記事なのでうまくいった事例を使っていますが、エアスピネル断然と言われたこのレース、勝ち馬ブラックスピネルを1位と予測していました。指数116は例年並みでしょうか(これがやりたかった)。ヴァンセンヌの年は113とレベルが落ちますね。指数は全レースで比較可能で1000万下を勝つレベルが100となります。G1であれば標準的に120を超えるパフォーマンスが要求されます。その横の偏差値は出走馬の比較用に算出しており、この後説明する期待値の算出に使っています。

レース結果はご存知の通りで、非常に精度高く予測できた例です。

SnapCrab_NoName_2017-3-13_17-2-54_No-00

5.指数の勝率から期待値を算出する
東京新聞杯の事例は良いとこどり感がありますが、そもそもこの予測式はどの程度精度の高いものなのかチェックする必要があります。この予測式は実際の結果をどの程度うまく説明できているのか、それを示す指標を決定係数(R2)といいます。0~1の値をとり、完全に説明できているものは1となります。この東京芝1600mの場合は決定係数0.8となっています。明確な基準はないのですが一般的にR2=0.8は「精度のよい」優秀な式といえます。予測と実際の補正タイムを可視化したものが以下になります。

SnapCrab_NoName_2017-3-13_22-49-58_No-00

概念上は斜め45度線上に乗ってればすべての馬のパフォーマンスが完璧に予測できていることになります。前後5pt程の幅はありますが、見当違いな予測ではないように見えます。特に100以上(1000万下クラス以上)の上位クラスになってくるとより安定していっているようにも見えます。このように、予測式を使って過去の出走情報をあてはめてシミュレーションをすることができます。そうすると気になってくるのは「どの程度当たっているのか」になります。馬券の細かい試算まではできないのですが、指数順位別の成績を出すことは可能です。

過去5年の予測結果をまとめたものがこちらです。

SnapCrab_NoName_2017-3-13_22-25-19_No-00

予測順位1位の勝率は約25%、平均単勝人気は2.6番人気になります。2.6番人気というのは存在しないので1番人気と3番人気の全体勝率から計算すると理論上15%となり、予測順位1位は人気以上の勝率となっていることがわかります。それぞれの順位で同じように比較をしています。

勝率が高いことはもちろん大事で、もし人気より下回っていたらこんなにこねくり回して全国平均以下という悲惨なことになるのですが、より重要なことは「どの程度の勝率か知っている」ということだと思います。自分の予測した結果の勝率がわかっているということは、オッズを見ることで「おいしい馬券か、そうじゃないか」の判断をつけることができます。予想時の会話にも出てくる期待値というものです。ここからはこの予測をどう使いこなすかというフェーズに入ってきます。

先ほどの分析では予測順位ごとの勝率を算出しました。しかし、順位はどんなに僅差でもついてしまいます。小数点一桁しか指数差のない1位と2位に10%近くも勝率差があるようには思えません。ダントツ1位と僅差の1位、もちろんダントツ1位の方が勝率が高そうですが、どのくらいダントツだとどの程度の勝率になるのか、もう少し詳しく知る必要がありそうです。また、予測順位1位の勝率が約25%、同等の単勝人気の勝率よりも高いということはわかりましたが、これは様々な馬が走った上での結果です。その数字の中身はどうなっているのでしょうか。極端な話、勝っているのは全部1番人気の馬で、3番人気以下の馬は全敗だったということもあり得るかもしれません。それなのに3番人気で指数1位の馬に「これは狙い目だ」と豪語すると恥ずかしい結果が待っていることになります。

まずは順位ではなく、他の馬とどの程度の差があるかを明らかにします。「ある馬の指数が平均からどの程度離れているか」つまり偏差値にします。これにより、英語と国語のテストの点数を比較するように違うレースでも同じ基準で評価をすることができ、勝率と組み合わせることで「偏差値65だと勝率は何%になるのか」がわかります。また、純粋な能力評価をしている中で本来はそうあって欲しくないのですが、同じ偏差値でも1番人気と10番人気では勝率が異なってくることが考えられます。これは「指数の癖」としてうまく付き合っていくことが必要そうです。

このようにして、過去5年分の平地競争全レースの「指数の偏差値」×「人気」で勝率を計算したものが以下になります。

SnapCrab_NoName_2017-3-15_0-15-59_No-00

自分の予測(指数)に全国のプレイヤーの知恵(人気)をお借りして算出した勝率表というイメージでしょうか。例えば偏差値70以上の3番人気は勝率20%を超えます。3番人気の平均勝率は約13%、平均オッズは6.5倍です。5回に1回勝つ馬券のオッズが6倍以上となるとなかなかオイシイです。自分の勝率が事前にある程度わかるというのはこういった予測ならではの面白さや強みかと思います。上記の表は下位の方で数字が少しブレていたりするので便宜上なだらかに補正して以下の表の勝率で期待値を計算しています。

SnapCrab_NoName_2017-3-15_0-56-22_No-00

再掲になりますが、東京新聞杯。指数の偏差値と人気から出した想定勝率にオッズを掛けたものが一番右にある期待値です。

SnapCrab_NoName_2017-3-15_0-30-41_No-00

ブラックスピネルは指数偏差値66の3番人気ということで勝率が19%、単勝オッズ6.4倍を掛けると期待値は1.2となります。つまり東京新聞杯のブラックスピネルは「5回走れば1回来て、その1回で4回の負けを取り返せる」馬と判定できます。その5回の1回が最初に来たということですね。ありがとうデムーロです。ストーミーシーとダガノブルグも期待値自体は高いのですが、これは掛け算するオッズが高すぎる異常値と考えた方がよいでしょう。このような馬だけを狙って100回以上買えば1回来て取り返せるのかもしれませんがそこまで我慢できませんので一定の指数ラインを引いて除外します。私は購入する指数ゾーンを偏差値50以上と決めています。馬券を無駄に広げたくないですし、せっかく指数で平均以下と判定した馬を買うのもなというのもあるので。

このような方法で単勝オッズの期待値はわかりました。ただ、購入する馬券は馬連、3連複、3連単などより高配当を狙っていきたいです。そこで、単勝オッズの期待値を元にそのほかの馬券の期待値シミュレーションを行います。単勝の還元率は80%、馬連の還元率は75%となっていますので、全体としては単勝期待値80%の馬を組み合わせた馬連期待値が75%となります。

馬連の期待値を導く計算式としては

80%×80%×□=75% □≒1.17

2頭の単勝期待値を掛け、さらに1.17を掛けると馬連の期待値になります。馬連80%と75%は全体の期待値なので、ここに対象馬の単勝期待値を入れていくと馬連の期待値を求めることができます。

例えば、東京新聞杯のブラックスピネル、プロディガルサンの馬連期待値は

1.2×1.0×1.17≒1.4

となり、それぞれの単勝以上に期待値の高い馬券となります。3連複も同様の考え方で計算できます。

もっと上手い方法はあるかもしれませんが、このようなアプローチで導き出した指数の癖を理解し、馬券購入に活かせるように試行錯誤をしています。

6.指数を自動的に算出する
私は普段Excelをデスクワークで扱う程度なので、ここからはスキル不足を披露してしまうことになるのですが、1日数レースは購入するわけですから、毎回毎回計算式に出走馬の情報を入力して指数や期待値を算出する、なんてことをやっていたらレースが終わってしまいます。

コースごとの予測式、種牡馬や騎手、過去走データなどは参照できるようにしておいて、TARGETから出馬表と過去走IDをコピペすれば

SnapCrab_NoName_2017-3-15_21-54-45_No-00

以下のように指数や順位、期待値の高い買い目を計算してくれるようにしました。
こちらの中京トリトンSは2-3-4の3連複が期待値1.3、見事的中し万馬券でした。

SnapCrab_NoName_2017-3-15_21-56-53_No-00

SnapCrab_NoName_2017-3-15_21-59-35_No-00

カッコよくプログラムされたものではないですが、このExcelの作成過程で今まで使ったことない便利な関数も発見できたので、まあ良しとします。開催当日に最新の過去成績、出馬表、オッズ一括ダウンロードしてコピペするだけで指数と買い目が計算できるようになりました。コンビニに競馬新聞を買いに行くよりは早く終わります。これを眺めて指数の意味合いを探りながら、期待値の高い買い目を中心に馬券を購入します。

これが2017年3月現在の私の競馬予測法です。出来上がったばかりなのでまだ性能評価するまでには至らないのですが、何十年とフワッと楽しんできた(それはそれで好きなのですが)自分の競馬予想の考え方を整理して、可能な限り測定可能なものにするために試行錯誤やアップデートを繰り返し、一応完成することができました。別に誰かに予想を売りつけたりするためにやったものではなく、自分オリジナルの競馬新聞を作っている感覚に近いです。競馬予想でも週の初めには出馬表を眺めながら、何となく頭の中で「これが本命かなあ」みたいなことを考えると思います。その「何となく頭の中で考えていること」を数式化したような感じです。冒頭に「人生の回収率」という書き方をしましたが、競馬に使える時間は限られています。この予測モデルで検討時間を効率化し、今までと同じように競馬を楽しみながらさらに別のことに有効に時間を使えることができれば、それも馬券を当ててるのと同じようなことと考えます。

今回は「重回帰分析」という統計手法を使っていますが、計算自体はExcelや統計ソフトに頼っている部分が大きいです。統計学も専門というわけではありません。もし記事を読んでいただいて「ちょっとやってみようかな」と思っていただける方がいれば嬉しいですし、私は完全なる文系人間、数学も得意ではありません。初歩的な統計学の本(統計検定だと3級の知識で十分です)、JRA-VANなどの公式データ、Excelや統計ソフトなどがあれば、何かしら独自の競馬予想プログラムを作ることはできると思います。ただ「競馬統計学」みたいな教科書もないので、自分なりにモデルを考え、ミスと修正を繰り返しながらそれっぽいものに近づけていく、それ自体が結構楽しいと思います。私ももっと予測精度を上げたり、運用を効率化したり、TwitterやBlogでこの予測を見て楽しんでもらえるような良い表現方法などを考えてもう少し遊びたいと思います。

以上です。いや、こんなクソ長い記事を最後まで読んでいただきありがとうございました。よろしければ本編の「ダークホースラジオ」もぜひ聴いてください。
今年はPOGをやりますので興味ある方はご一報を。

父ダイワメジャー、20年前で言うと〇〇〇〇〇?

競馬予想以外もデータ遊びを思いついたときに書いていきたいと思います。
まずはこんなものから。お付き合いいただければ嬉しいです。

種牡馬イメージ1995_2016

競馬予想の中で「父〇〇〇なのでダ1200はピッタリ」みたいな会話がよくあります。もちろん適当に言っているわけではないはずで、そのコースでの勝率や複勝率などを元に他の種牡馬と比較したうえで述べていることと思います。たまにTwitterに遊びでアップしたりしてたのですが、あらためて可視化してみました。

上の図はコレスポンデンス分析という手法を使い、種牡馬の距離別勝利数を集計し1枚のマップに描いています。多くの種牡馬を対象にすると図が馬でぐちゃぐちゃになってしまうのでTop20に限定していますが、その20頭の相対的な関係として、各種牡馬が特徴的に勝利をあげている距離はどこかを示したものです。近くにあるものが関係が強い種牡馬です。馬同士が近いものは傾向が似ているということになります。

こちら、あくまで特徴なので種牡馬の能力自体はあらわしていません。芝2400mの近くにハービンジャーがいますが決して少し離れているディープより2400で強いということではなく、ざっくり「その種牡馬のイメージ」ととらえていただければ。もちろんデータ分析した結果ですが、イメージなのでポジション自体には競馬ファンの皆さんにはそんなに違和感はないはずです。

これは少し違う分析手法ですが、プロ野球選手のデータ、打率、本塁打数、犠打数などを使って打者の特徴を分類するようなこともできます。見事に打順に近い分類になります。この現役馬バージョンもいつかやりたいです。

1780174_481266665334183_77665043_o

10014777_481266755334174_1529806159_o

ただ、違和感ないものをあらためて図にしてもつまらないので、もうひと工夫してみました。種牡馬は2015-2016の平地全競争の実績データを使った「現在のイメージ」ですが、これに20年前、1995-1996年時のデータも足して分析をしてみました。時代が違うのでやや強引ではありますが、距離体系はそれほど変わっていませんので、20年の時を超えて当時の種牡馬との傾向比較をしています。四角で数字が書かれているものに、20年前の種牡馬があてはまります。

20年前は比較的どの距離にも近くない種牡馬が多い印象を受けました。今ほど棲み分けがすすんでいなく、芝もダートも距離も幅広くこなしており、スペシャリスト種牡馬が今より少なかったのかもしれません。

さて、一体どの種牡馬になるでしょうか。
当時からの競馬ファンには想像がついてしまう部分もあるかもしれません。この図を見ただけで当てられる人、相当凄いなと思いますが。
Top20は以下になります。お時間あるときに、一部分でもお楽しみいただければ幸いです。

再掲です。
種牡馬イメージ1995_2016

◎1995-1996年 平地競争勝利数Top20
サンデーサイレンス
ブライアンズタイム
ノーザンテースト
トニービン
サクラユタカオー
リアルシャダイ
ジェイドロバリー
アンバーシャダイ
クリスタルグリッターズ
ニホンピロウイナー
キンググローリアス
ミスターシービー
シンボリルドルフ
サッカーボーイ
スリルショー
ブレイヴェストローマン
ホリスキー
マルゼンスキー
タマモクロス
ウッドマン

よろしくどうぞ。
※広告の下に番号記載した種牡馬リストも書いておきます。

 

 

 

 

 

———
1.ニホンピロウイナー
2.クリスタルグリッターズ
3.スリルショー
4.ウッドマン
5.キンググローリアス
6.ブレイヴェストローマン
7.ホリスキー
8.ジェイドロバリー
9.ブライアンズタイム
10.マルゼンスキー
11.ノーザンテースト
12.アンバーシャダイ
13.ミスターシービー
14.シンボリルドルフ
15.サクラユタカオー
16.サッカーボーイ
17.リアルシャダイ
18.タマモクロス
19.トニービン
20.サンデーサイレンス
———

重回帰分析を使って競馬の予測モデルを作ってみた

※本記事のアップデート、続編をこちらで書いています。

前回、2017年は統計学を使った競馬の予測にチャレンジしてみようなんてことを書いてしまいました。まだまだ試行錯誤中なのですが、どのように予測をするのかが今回の記事になります。よろしくどうぞ。しつこいですが「よろしくどうぞ」はスーパー競馬の吉田均さんのオマージュです。

おおまかにはこんなステップです。

予測モデル作成のステップ
 1.競馬予想のファクターを整理する
 2.データを準備する
 3.タイムの予測式を作る
 4.出走馬のタイムを導き出す

 

1.競馬予想のファクターを整理する

まずは「競馬予想」についてあらためて考え、整理していきます。ここが予測のすべてを決めるといっても過言ではありません。勝ち馬をどう予測するのか(したいのか)を決めます。考案者の視点や思想が大いに繁栄される魂の作業です。ただし、何が勝ち馬への道しるべになるのかまだ見当がつきません。ですからまずは考えられる要素をできるだけ数多く出していきます。思いついたものはなんでもいいです。この段階では。
仕事でも何か新しい企画を考えるとき、まずはみんなでブレストしてアイデアを出し合う、良し悪しはともかくとにかく数を出してみる。それと同じです。

競馬書籍、競馬新聞、知り合いの競馬予想ラジオ、フジテレビONEでやっている競馬予想TV!などを参考にしながら、競馬予想のファクターを書き出していきました。統計学や重回帰分析という言葉と比べるととてもアナログな作業です。場外馬券場にいるおじさん達にも協力してもらいたかったです。

デフォルメしてますがざっくりまとめるとこうです。なんとなく「まあこんな感じで予想するよね」になっているかと思います。この「まあこんな感じ」は大事です。ここで出てきた要素でモデルを作っていくわけですから。場外馬券場にいるおじさんが必要というのは冗談でもなんでもなく、本来は何人かの競馬好きで集まってワイワイやるのがいいと思います。色んな視点から考えて何か足りないなと感じればまた要素を足していきます。

%e4%ba%88%e6%83%b3%e3%83%95%e3%82%a1%e3%82%af%e3%82%bf%e3%83%bc

魂の完成です。こちらをベースに予測モデルを組み立てていきます。

 

2.データを準備する

この図をアップロードすると人工知能が画像解析してJRA-VANと照合し勝ち馬を導き出してくれる、なんてことは残念ながら今のところできません。(5年後くらいはわからないと思います)
個々の項目に対応する具体的なデータを検討します。ズバリのデータもありますが、データを変換するもの、自分で作るものもあります。詳しい方ならば簡単に抽出できたと思うのですが文系の私には難しく、JRA-VANにある競馬予想支援ソフト「TARGET」からデータを出力しExcelやAccessで加工しました。

分析対象は過去5年分のレースにしました。約25万頭分のデータになります。ダウンロードをしているとあらためて競馬のデータ量の膨大さに驚かされます。

そもそも勝ち馬を予測するといっても、具体的に何を予測するかを決めなくてはいけません。が、この段階ではまだ絞り切れていませんでした。大きく分けると「着順」か「タイム」なのですが、自分は後者を想定していました。前回のブログにも書きましたが、走破タイムが予測できれば超カッコいいわけですよ。1000m時点のタイムなどに置き換えれば展開予想とかもできるわけですから予測に深みが増すかなとも思いました。ですが、最終的にモデルを組む中で走破タイムそのものを予測することはあきらめました。当然なのですが、予測の根拠の大半を占めるであろう馬の実力以外に左右される要素が多すぎました。ペース、出走メンバーのレベル、芝の状態などですね。となると着順になるのですが、できればレースレベルみたいなものも反映したい、指数的なものにして「おーこのタイムはG1級だ!」みたいなことも言いたくて(これも超カッコいいから)最終的にはTARGETで公開している馬場差を考慮した補正タイムを予測することにしました。これは「100=1000万下を勝てるレベル」「1は0.1秒」という基準値があり、過去データも豊富にあるので、こちらを予測対象とすることで勝ち馬とレースレベルの推測が両立できます。最初は自分で補正タイム作っていたのですが更新が大変なので挫折しました。使える2次データはありがたくどんどん使っていきます。

過去5年の競争成績をダウンロードしたり
%e9%81%8e%e5%8e%bb5%e5%b9%b4%e3%81%ae%e7%ab%b6%e4%ba%89%e6%88%90%e7%b8%be

前5走のデータを結合したり
%e5%89%8d5%e8%b5%b0%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e7%b5%90%e5%90%88

騎手と調教師を年度ごとの成績でランク付けしたり
%e9%a8%8e%e6%89%8b%e8%aa%bf%e6%95%99%e5%b8%ab

種牡馬、母父を産駒の能力やコース適性でランク付けしたり
%e7%94%a3%e9%a7%92%e5%b9%b3%e5%9d%87%e6%8c%87%e6%95%b0

%e3%82%b3%e3%83%bc%e3%82%b9%e9%81%a9%e6%80%a7

しながら分析用データを完成させていきました。
最終的に過去5年約25万頭分について以下のデータを用意しています。まだ追加検討したい項目はありますが、まずは極力シンプルにしています。

属性レース条件能力
牡馬過去5走の3コーナー位置取り
牝馬1走前の3コーナー位置取り
セン馬コース1走前の上り3F 1位経験
年齢レースの格1走前の対2走前指数変化
調教師能力馬齢限定1走前の対過去平均指数変化
種牡馬能力牝馬限定1走前の指数
種牡馬コース適性     馬場状態2走前の指数
母父能力騎手能力3走前の指数
母父コース適性斤量4走前の指数
出走頭数5走前の指数
枠番過去5走の上がり3F1位経験
馬番過去5走の平均指数
乗り替わり騎手能力変化過去5走のベスト指数
前走からの距離変化
前走からの斤量変化
前走からの枠順変化
前走からの馬番変化
前走からの芝・ダ変化

 

3.タイムの予測式を作る

ようやく分析のスタートラインです。タイトルにもある通り「重回帰分析」という手法を使います。こちらのサイトの説明を引用させていただきます。

例としてある店の顧客に対する販売実績と、顧客の属性の関係を分析します。目的変数として、ある年の各顧客の購入額をとります。説明変数として、顧客の属性(年齢、性別、家族人数、年収など)を用いることとします。すなわち、(購入額)= a ×(年齢)+ b ×(性別)+ c ×(家族人数)+ d ×(年収)+(誤差)という式において、a,b,c,d (これを偏回帰係数といいます)の値と、誤差項の値を求めます。この式に、新しい顧客の属性データを入れれば、購入額が推定できるというのが、(重)回帰分析の考え方です。

ここでいう(購入額)がタイム、(年齢)(性別)(家族人数)(年収)が過去の成績、斤量、馬場状態、鞍上強化、種牡馬などになります。それぞれの要素に係数をかけ算することで、過去走った馬のタイムに近くなるような式を作ります。そして、この式にこれから走る馬の情報を代入してタイム、勝ち馬を予測します。長くなりましたがこれがやりたかったんです。

計算には統計ソフトを使って行います。IBMの予測分析ソフトSPSSを使いました。各データを投入していきます。

spss1

例えば、京都芝1600mの過去5年出走馬4021頭のデータを使って計算すると、こんな式ができます。競馬ファンが知っている用語に謎の数値がかけられてタイムが計算されます。あらためて見ると不思議な式ですが、もしかしたらある競馬ファンの脳内を可視化するとこんな風になっているのかもしれません。

京都芝1600mのタイム(TARGET補正タイム)=(新馬戦)*-16.7+(未勝利戦)*-13.2+(500万下)*-7.1+(1000万下)*-5.2+(2歳限定戦)*-1.6+(3歳限定戦)*-3.5+(牝馬限定戦)*1.7+(重馬場)*-4.5+(不良馬場)*-8.9+(牡馬)*1.8+(騎手ランク)*0.2+(調教師ランク)*0.1+(種牡馬適性)*0.1+(母父適性)*0.03+(出走頭数)*-0.2+(馬番)*-0.2+(前走ダート)*-2.7+(距離変化)*-0.003+(乗り替わり騎手能力変化)*-0.1+(斤量変化)*-0.6+(1走前のポジション)*-1.3+(前5走上がり1位経験)*1.2+(1走前のタイム指数)*0.1+(前5走平均タイム指数)*0.2+(前5走ベストタイム指数)*0.2

複雑な式ですが、それぞれの(  )に出走各馬のデータを当てはめていけばいいのです。レース条件など「該当/非該当」形式なら「1 or 0」、タイム指数や斤量などはそのままの数値をかけていきます。計算しやすくするために出馬表データを加工する必要がありますが変換表を作ってしまえば問題ありません(スキル不足によりたくさんミスしましたが)。コース別に式を作りました。ちなみにこの京都芝1600mの決定係数は0.71となっています。1に近い方が予測モデルとしては優秀です。明確な基準はないのですが0.71は「なかなか上手くタイムが予測できているね」です。

上記の式を見て「なぜこの観点、あの観点は計算式に入ってないの?」と思われるかもしれません。実はこの倍以上の項目を投入しているのですが、重回帰分析の手法で、精度高くタイムを予測する上で変数が仕分けされていき、最終的に残った項目がこの式になります。

 

4.出走馬のタイムを導き出す

ちなみにこのブログを書いているのは2017年1月7日(土)です。明日は同条件の重賞レース「シンザン記念」が行われますので、この数式に出走馬データを入力してタイム予測をしてみました。

%e3%82%b7%e3%83%b3%e3%82%b6%e3%83%b3%e8%a8%98%e5%bf%b5

過去5年の結果にある勝ち馬の指数を見ると、今回導き出されたスコアのトップ「ペルシアンナイト:102」は十分勝利できるレベルにあることがわかります。出走馬のスコアを見るとその年のレベルや混戦具合を推し量ることもできそうです。過去2年よりもややレベルの高いレースになるかもしれません。

統計の専門家から見ると穴があるかもしれませんが、このような考え方で競馬の予測式を作ってみました。レースの結果と照らし合わせながらモデルは修正していこうと思いますし、精度が落ちなければ違った視点のデータも加えてみたいと思っています。血統の特徴をより出すためにダビスタの種牡馬データをそのまま使ってみるとか。

はい。こんな感じでしばらくはこのブログやTwitterで競馬予測をしていこうと思います。
とりあえず明日のシンザン記念はいい結果になってほしいものですが、カスリもしなかった場合は上記のレース予測部分の記事だけが違うレースにひっそり更新されていきますのでその点は何卒ご了承ください。

最後まで読んでいただきありがとうございました。
よろしくどうぞ。

※追記
シンザン記念の結果です。
バチっと決めたかったところですが追加変数を検討して予測精度をさらに高めたいと思います。