競馬とかのOdds計算をPythonでしてみる

 

{{DZ_TITLE}}
Pythonで競馬や競艇のオッズ計算をしてみました。
データは適当にダミーデータを作成する。

計算式:(W+D/P)×R

  • W
    当該勝馬に対する勝馬投票券の総券面金額(自分の選んだ勝馬)
  • D
    出走した馬であって勝馬以外のものに対する勝馬投票券の総券面金額(複勝の場合は、3頭以外のはずれ馬券の総額)
  • P
    勝馬の数(複勝の場合は3頭)
  • R
    JRAが投票法ごとに定めた率(勝馬投票法ごとの払戻率をご参照ください。)

*参照:https://www.jra.go.jp/kouza/baken/index.html

細かい計算を除く
払い戻し率は確認めんどくさいので一律80%とした。
(↑実際は、支払いが多くなる難しいレース程、払い戻し率が下がるとの事)

import numpy as np
import random

# ダミーデータ作成用のデータ
pop_lst = [950,900,920,300,400,200]
pos_sum_lst = [sum(pop_lst[0:x+1]) for x in range(len(pop_lst))]

# ダミーデータ作成用の関数
def get_result(pop_sum_lst):
    val = random.randint(1,max(pos_sum_lst))
    for idx,pop_sum in enumerate(pos_sum_lst) :
        if val <= pop_sum :
            return idx

##### 単勝  1/6
# データ作成
result = [0]*6
for i in range(sum(pop_lst)*100):
    idx = get_result(pos_sum_lst)
    result[idx] = result[idx] + 1
result = [(1 if x == 0 else x) for x in result]

# 結果出力
odds1 = sum(result)/np.array(result)*0.80 # 競馬の場合80%
print(odds1)

##### 複勝  1/3 
# データ作成
result_max = [0]*6
result_min = [np.inf]*6
for i1 in range(len(result)):
    for i2 in range(len(result)):
        if i1 == i2 :
            continue
        a = ( result[i1] + (sum(result)-result[i1]-result[i2])/2 ) * 0.80
        b = a / result[i1]
        result_max[i1] = max(result_max[i1] ,b)
        result_min[i1] = min(result_min[i1] ,b)

    print('%d : %0.2f%%%0.2f%%'%(i1,result_min[i1],result_max[i1]))


##### 2連単 1/30
# データ作成
comb_lst = []
for i1 in range(6):
    for i2 in range(6):
        if i1 == i2:
            continue
        comb_lst.append('%d%d'%(i1,i2))
        
lst2 = []
for i in range(10000):
    idx1 = get_result(pos_sum_lst)
    while True:
        idx2 = get_result(pos_sum_lst)
        if idx1 != idx2 :
            break
    lst2.append('%d%d'%(idx1,idx2))

result = []
for comb in comb_lst:
    result.append(lst2.count(comb))
result = [(1 if x == 0 else x) for x in result]

odds1 = sum(result)/np.array(result)*0.80
print(odds1)

##### 2連複 1/15
# テストデータ作成
comb_lst = []
for i1 in range(6):
    for i2 in range(i1,6):
        if i1 == i2:
            continue
        comb_lst.append('%d%d'%(i1,i2))
comb_lst

lst2 = []
for i in range(10000):
    idx1 = get_result(pos_sum_lst)
    while True:
        idx2 = get_result(pos_sum_lst)
        if idx1 != idx2 :
            break
    imax = max(idx1,idx2)
    imin = min(idx1,idx2)
    lst2.append('%d%d'%(imin,imax))

# 計算
result = []
for comb in comb_lst:
    result.append(lst2.count(comb))
result = [(1 if x == 0 else x) for x in result]

odds1 = sum(result)/np.array(result)*0.80
print(odds1)

##### 3連単
# テストデータ
comb_lst = []
for i1 in range(6):
    for i2 in range(6):
        if i1 == i2:
            continue
        for i3 in range(6):
            if i1 == i3 or i2 == i3:
                continue
            comb= [i1,i2,i3]
            comb.sort(reverse=False)
            comb_lst.append('%d%d%d'%(comb[0],comb[1],comb[2]))
comb_lst = list(set(comb_lst))

lst2 = []
for i in range(10000):
    idx1 = get_result(pos_sum_lst)
    while True:
        idx2 = get_result(pos_sum_lst)
        if idx1 != idx2 :            
            while True:
                idx3 = get_result(pos_sum_lst)
                if idx1 != idx3 and idx2 != idx3 :
                    comb= [idx1,idx2,idx3]
                    comb.sort(reverse=False)
                    lst2.append('%d%d%d'%(comb[0],comb[1],comb[2]))
                    break
            break

# 計算
result = []
for comb in comb_lst:
    result.append(lst2.count(comb))
result = [(1 if x == 0 else x) for x in result]

odds1 = sum(result)/np.array(result)*0.80
print(comb_lst,odds1)

おすすめ記事

to_excelでxlsx,xlsファイルを書き込む / Python Pandas
to_excelでxlsx,xlsファイルを書き込む / Python Pandas
PythonでSeleniumでスクレイピング時にClickでElementClickInterceptedException例外で失敗する。
PythonでSeleniumでスクレイピング時にClickでElementClickInterceptedException例外で失敗する。
動画ファイルの読込 - OpenCV、Python徹底解説
動画ファイルの読込 - OpenCV、Python徹底解説
数値による条件抽出 - Python Pandas
数値による条件抽出 - Python Pandas
URL解析、接続 - Python徹底解説
URL解析、接続 - Python徹底解説
Django Adminのパスワードを忘れたら? - Python
Django Adminのパスワードを忘れたら? - Python
Supponsered

外部サイト
↓プログラムを学んでみたい場合、学習コースなどもおすすめです!

Comments

comments powered by Disqus