新浪博客

python写的足彩换算相关程序,有兴趣的可以看看

2012-10-09 12:33阅读:
# -*- coding:utf-8 -*- #
import numpy as np
from scipy.optimize import leastsq
from functools import reduce
import time
from mylog import write_affairlog
from sympy import *
def Jc(k):
'''
阶乘基本函数
'''
if k == 0:
return 1
elif k == 1:
return 1
else:
return reduce(lambda a,b : a*b, range(1,(k+1)))
def bs(r,n):
'''
泊松方程
'''
if n<0:
p = 0
else:
p = (np.e**(-r))*(r**n)/Jc(n)
return p
def possibility(pHostScore, pGuestScore):
'''
计算胜平负的概率
br> fHostGoalNum:主场进球率
fGuestGoalNum:客场进球率
返回:
【winp, drawp, losep】
'''
#根据主客场进球率计算胜的概率
#主胜的概率为:主队进球比客队多的概率
winp = 0
p_iHostScoreNum = 0 #主队进iHostScoreNum个球的概率
p_iGuestScoreNum = 0 #客队进iGuestScoreNum个球的概率

for iHostScoreNum in range(1,6):
#利用泊松方程求主队进iHostScoreNum球时的概率
p_iHostScoreNum = bs(pHostScore, iHostScoreNum)
for iGuestScoreNum in range(0, iHostScoreNum):
#利用泊松方程求主队进iHostScoreNum球时的概率
p_iGuestScoreNum = bs(pGuestScore, iGuestScoreNum)
#概率相当,得到主队胜的概率
winp += p_iHostScoreNum* p_iGuestScoreNum

#根据主客场进球率计算胜的概率
#平局的概率为:主客队进球数相等
drawp = 0
for iScoreNum in range(0,6):
drawp += bs(pHostScore, iScoreNum)*bs(pGuestScore, iScoreNum)

#根据胜率及平率求出负的概率
losep = 1 - winp - drawp

return [winp, drawp, losep]
def fc(pHostScore, pGuestScore, lstStdWinP):
'''
根据假设的主客队进球率,计算其与假设胜率
然后根据假设胜率,得到其与欧赔胜率之间的方差
pHostScore:假设的主队进球率
pGuestScore:假设的客队进球率
lstStdWinP:当前场次比赛的胜率[win, draw, lose]
'''
#方差
fc = 0
lstP = possibility(pHostScore, pGuestScore)
write_affairlog('主队胜率为%f,平率为%f,负率为%f'%(lstP[0], lstP[1], lstP[2]))
for i in range(0,3):
fc += (lstP[i]-lstStdWinP[i])**2
return fc

def get_t(lstStdWinP):
'''
已知胜率,获取主客队进球率最佳参数
#获取范围在[0.5-1.8]步长为0.001的列表
#此范围为寻找进球率标准参数的基本范围
输入:
lstStdWinP,[win, draw, lose]
'''
#获取范围在[0.5-1.8]步长为0.001的列表
#此范围为寻找进球率标准参数的基本范围

#标准方差列表,包含方差值
fc_min = 10
lstFC = []

#构造标准列表
for pHostScore in np.arange(0.3, 5.10, 0.02):
write_affairlog('正在计算主队进球率为%f的情况:'%(pHostScore))
write_affairlog('##'*20)
if pHostScore > 0.75:
pass
for pGuestScore in np.arange(0.3, 5.10, 0.02):
fc_current = fc(pHostScore,pGuestScore,lstStdWinP)

#判断当前方差是否为最小方差
if fc_current < fc_min:
fc_min = fc_current
lstFC = [fc_min, pHostScore, pGuestScore]
write_affairlog('有效方案,主队进球率为%f,客队进球率为%f,与欧赔标准的方差为%f'%(pHostScore, pGuestScore, fc_current))
else:
write_affairlog('无效方案,主队进球率为%f,客队进球率为%f,与欧赔标准的方差为%f'%(pHostScore, pGuestScore, fc_current))
time.sleep(0.01)
write_affairlog('欧赔最优解为%f,%f,%f'%(lstFC[0],lstFC[1],lstFC[2]))
print '欧赔最优解为%f,%f,%f'%(lstFC[0],lstFC[1],lstFC[2])
return [lstFC[1],lstFC[2]]
def get_var_board():
'''
已知进球率,获取主客队胜平负的最大理论值
#获取范围在[0.5-1.8]步长为0.001的列表
#此范围为寻找进球率标准参数的基本范围
输入:
'''
#获取范围在[0.5-1.8]步长为0.001的列表
#此范围为寻找进球率标准参数的基本范围

#标准方差列表,包含方差值
ps_min = 10
ps_max = 0

#构造标准列表
for pHostScore in np.arange(0.3, 5.10, 0.02):
write_affairlog('正在计算主队进球率为%f的情况:'%(pHostScore))
write_affairlog('##'*20)

for pGuestScore in np.arange(0.3, 5.10, 0.02):
ps_current = possibility(pHostScore,pGuestScore)
write_affairlog('%s,%s,%s'%(ps_current[0],ps_current[1],ps_current[2]))
def pay_2_win(lstPay):
'''
已知赔率,计算当前赔率所对付的水位及胜率
输入:标准赔率
返回:水位X,胜率lstWin
'''
x=Symbol('x')#x为所求的水位
waterLevel = solve(x/lstPay[0]+x/lstPay[1]+x/lstPay[2]-1,x)
lstWin = [waterLevel[0]/lstPay[0], waterLevel[0]/lstPay[1], waterLevel[0]/lstPay[2]]
return waterLevel[0], lstWin
def Asian_possibility( pHostScore, pGuestScore, nInitGoal=0):
'''
计算亚盘让球后的胜平负的概率
nInitGoal:初始让球数
pHostScore:主场进球率
pGuestScore:客场进球率
返回:
【winp, drawp, losep】
'''
#根据主客场进球率计算胜的概率
#主胜的概率为:主队进球比客队多的概率
if nInitGoal > 10:
print 'too many goals'
return []
winp = 0
p_iHostScoreNum = 0 #主队进iHostScoreNum个球的概率
p_iGuestScoreNum = 0 #客队进iGuestScoreNum个球的概率

#输入的让球数为整数,有胜平负的概念
#根据主客场进球率计算胜的概率
for iHostScoreNum in range(int(nInitGoal+0.5)+1, 6):
#利用泊松方程求主队进iHostScoreNum球时的概率
p_iHostScoreNum = bs(pHostScore, iHostScoreNum)
for iGuestScoreNum in range(0, iHostScoreNum):
#利用泊松方程求主队进iHostScoreNum球时的概率
p_iGuestScoreNum = bs(pGuestScore, iGuestScoreNum)
#概率相当,得到主队胜的概率
winp += p_iHostScoreNum* p_iGuestScoreNum

#平局的概率为:主客队进球数相等
if int(nInitGoal+0.5) == nInitGoal:
drawp = 0
for iScoreNum in range(0,6):
drawp += bs(pHostScore, (iScoreNum+int(nInitGoal+0.5)))*bs(pGuestScore, iScoreNum)
if int(nInitGoal+0.5) > nInitGoal:
drawp = 0
#根据胜率及平率求出负的概率
losep = 1 - winp - drawp

return [winp, drawp, losep]
def Kelly(lstSP, lstAsiaP):
'''
根据亚盘让球后胜率以及足彩中心的SP值,计算凯利指数
输入:
lstSP:足彩中心的SP值
lstAsiaP:计算让球后的胜率
输出:
lstKelly
'''
lstKelly = []
for i in range(0,3):
Kelly_i = (lstSP[i]*lstAsiaP[i] - (1-lstAsiaP[i]))/lstSP[i]
lstKelly.append(Kelly_i)
return lstKelly












if __name__=='__main__':

print get_t([0.478,0.2835,0.3085])

# waterLevel, lstStdWinP = pay_2_win([1.95, 2.9, 3.75])
# print waterLevel, lstStdWinP
# lst = get_t(lstStdWinP)
# print lst
# lstAsiaP = Asian_possibility(lst[0], lst[1], nInitGoal = 2)
# print lstAsiaP

我的更多文章

下载客户端阅读体验更佳

APP专享