工学系大学院生のブログ

2人の大学院生による雑記ブログ

第2-1回 オッズの見積方法(競馬予想)[機械学習、python, lightGBM]



第1回 競馬予想プログラムを作りたい
第2-1回 オッズの見積方法(競馬予想) (ここ)
第2-2回 様々な賭け方の予測精度
第3-1回 競馬予測の自動化
第3-2回 様々な賭け方の予測精度 2(競馬予想)
機械学習による競馬予測ツール (ツールを無料公開しています)


第1回では、とりあえず競馬における単勝を予測するものを作りました。

回収率は6-7割と芳しくなかったですが、賭け方を変えたらどうなるか見積りたいと思います。




0 目的


今回は、前回作ったソフトで複勝や3連単に挑戦し、どの程度の回収率になるか評価します。



そこで、問題になるのがオッズです。


単勝オッズは取得していますが、複勝や3連単のオッズはわかりません。
そこで単勝オッズから上記の値を見積もる方法を記載します。



前回と違い数字ばかりなので、結果が知りたい人は第2-2回をみてください。



1 単勝オッズは支持率


まず、オッズの定義です。

オッズは、その事象が起こる確率をPとしたときに下記の式で表されます。

\(1/odds = P /(1-P)\)





単勝オッズは、1着になる支持率を表しています。1着になる確率とも言えます。


そこで、単勝オッズから各馬\(l\)の1位になる確率がわかります。

\(P_1(l) = 1 / (1 + odds(l) )\)

ここで下付き文字は順位、括弧内は馬の番号を示します。


第1回で全ての馬のオッズを取得しているので、すべての馬の1位になる確率は求められます。




続いて、馬\(l\)が1位の時に馬\(m\)が2位になる確率は1位の馬\(l\)を除いた中で1着になる確率になります。


\(P_2(l, m) = P_1(m) / (1-P_1(l)) \)


\(l,m\)がややこしいですね。左辺は2位になる確率であり、右辺の分子は馬\(m\)が1位になる確率です。右辺の分母は馬\(l\)が1位になる確率を除いています。
条件付き確率ですね。



さて同様に、馬\(l\)が1位かつ馬\(m\)が2位のときに馬\(n\)が3着になる確率は下記のようになります。

\(P_3(l,m,n) = P_1(n) / (1-P_1(l)-P_1(m)) \)

これらを駆使して、各賭け方のおおよそのオッズを求めていきます。






それでは、馬単、3連単、馬連、三連複、複勝、ワイドにおける確率について求めていきます。


馬単

馬単は、「1位と2位を順番に当てること」を指します。

すなわち、1位を当てる確率×2位を当てる確率です。

\(P = P_1(l) * P_2(l,m) \\ = P_1(l) *P_1(m) / (1 – P_1(l)) \)



3連単

3連単は、「1位、2位、3位を順番に当てること」を指します。

\(P = P_1(l) * P_2(l,m) * P_3(l,m,n) \\ = P_1(l) *P_1(m) / (1 – P_1(l)) *P_1(n) / (1 – P_1(l) – P_1(m)) \)




馬連

馬連は、「1位、2位を順序関係なく当てること」を指します。

すなわち、1位を当てる確率×2位を当てる確率の足し算になります。

\(P = P_1(l) * P_2(l, m) + P_1(m) * P_2(m, l) \\ = P_1(l) *P_1(m) * (1/ (1 – P_1(l)) + 1/ (1 – P_1(m)) \)




3連複

馬連は、「1位、2位、3位を順序関係なく当てること」を指します。

すなわち、1位を当てる確率×2位を当てる確率×3位を当てる確率の足し算になります。3P2なので6通りあります。

\(P = P_1(l) * P_2(l, m) * P_3(l,m,n) + P_1(l) * P_2(l, n) * P_3(l,n, m) \\
+ P_1(m) * P_2(m, l) * P_3(m,l,n) + P_1(m) * P_2(m, n) * P_3(m,n,l) \\
+ P_1(n) * P_2(n, m) * P_3(n,m,l) + P_1(n) * P_2(n,l) * P_3(n,l,m)\)




複勝

複勝は、「3位以内に入る馬を1頭当てること」を指します。

すなわち、1位になる確率 + 2位になる確率 + 3位になる確率になります。

\(P = P_1(l) + P_2(x,l) +P_3(x,x,l)\)


ここはややこしいので勘違いしないでほしいのですが、「馬\(l\)が2位になる確率」は1位が何の馬でもよくて2位になる確率\(P_2(x,l)\)になります。3位になる確率\(P_3(x,x,l)\)も同様に注意してください。全部で16頭いた場合は、

\(P_2(x,l) = \Sigma_{i = 1}^{k=16, k\neq l} P_1(l) / (1 – P_1(i))\)

\(P_3(x,x,l) = \Sigma_{i = 1}^{k=16, k\neq l} \left[\Sigma_{j = 1}^{k=16, k\neq l, i} P_1(l) / (1 – P_1(i)- P_1(j)) \right] \)




ワイド

ワイドは、「3位以内に入る馬を2頭当てること」を指します。

すなわち、馬\(l\)と馬\(m\)が、1位と2位になる確率 + 1位と3位になる確率 + 2位と3位になる確率になります。


\(P = P_1(l)*P_2(l,m) + P_1(m)*P_2(m,l) + P_1(l)*P_3(l,x,m) + P_1(m)*P_3(m,x,l) + P_2(x,l)*P_3(x,l,m)+ P_2(x,m)*P_3(x,m,l)\)


長いので詳細は記載しませんが、複勝の計算方法やコードを参考にしてください。





以上から求めた各確率をオッズに変換します。

\(odds = (P /(1-P))^{-1} \)



これでオッズを見積もることができました。


2 見積りテスト

それでは、上記の計算がどの程度あっているか1例を示します。


スクレイピングでもお世話になっているネット競馬さんからデータを引っ張ってきました。

直近である2022/07/10の福島の1Rの結果を利用しました。

https://race.netkeiba.com/race/result.html?race_id=202203020401&rf=race_list




以下に実際の各オッズと見積りの結果を示します。
プログラムでは、オッズは1.0を切らないことから、下限値を1.0としています。


概ねいい値なのではないでしょうか。主観ですが……。


それでは、この値を使用して、第2-2回では、賭け方を検討してみましょう。




hide


参考にさせていただいたページ

https://leisurely1.blog.jp/archives/19121869.html

このエントリーをはてなブックマークに追加

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です