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