競馬とかの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)

おすすめ記事

スクレイピング - Python徹底解説
スクレイピング - Python徹底解説
無地の画像を作成 - OpenCV、Python徹底解説
無地の画像を作成 - OpenCV、Python徹底解説
サーバー以外の端末から接続する方法(開発環境版向け、本番環境以外向け) - Django
サーバー以外の端末から接続する方法(開発環境版向け、本番環境以外向け) - Django
to_excelでxlsx,xlsファイルを書き込む / Python Pandas
to_excelでxlsx,xlsファイルを書き込む / Python Pandas
Pythonでweb serverを立ち上げる(一時作業用)
Pythonでweb serverを立ち上げる(一時作業用)
プログラムは独学が良いか、スクールが良いか?【無償カウンセリング、無料体験あり】
プログラムは独学が良いか、スクールが良いか?【無償カウンセリング、無料体験あり】
Supponsered

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

Comments

comments powered by Disqus