第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
Tweet
コメントを残す