使用scipy最大化目标通过kelly criterium

问题描述

我有以下两个熊猫数据框:新的&结果

new = pd.DataFrame([[5,5,1.6],[0.22,0.22,0.56]]).T
new.index = ['Visitor','Draw','Home']
new.columns = ['Decimal odds','Win prob'] 
new['Bet amount'] = np.zeros((len(new),1))

输出

         Decimal odds  Win prob  Bet amount
Visitor           5.0      0.22         0.0
Draw              5.0      0.22         0.0
Home              1.6      0.56         0.0

数据框“结果”

outcome = pd.DataFrame([[0.22,0.56],[100,100,100]]).T
outcome.index = ['Visitor win','Home win']
outcome.columns = ['Prob.','Starting bankroll']
outcome['Wins'] = ((new['Decimal odds'] - 1) * new['Bet amount']).values
outcome['Losses'] = [sum(new['Bet amount'][[1,2]]),sum(new['Bet amount'][[0,1]])]
outcome['Ending bankroll'] = outcome['Starting bankroll'] + outcome['Wins'] - outcome['Losses']
outcome['Logarithm'] = np.log(outcome['Ending bankroll'])

输出

             Prob.  Starting bankroll  Wins  Losses  Ending bankroll  Logarithm
Visitor win   0.22              100.0   0.0     0.0            100.0    4.60517
Draw          0.22              100.0   0.0     0.0            100.0    4.60517
Home win      0.56              100.0   0.0     0.0            100.0    4.60517

此处objective由以下公式计算:

objective = sum(outcome['Prob.'] * outcome['Logarithm'])

现在,我想通过“ new ['投注金额”]列中包含的值来最大化objective。约束条件是a,b和c的边界在0到100之间。a,b和c的总和也必须低于100。原因是a,b,c类似于您用于存款的资金比率体育博彩。

想使用scipy库来实现这一目标。到目前为止,我的代码如下:

from scipy.optimize import minimize

prob = new['Win prob']
decimal = new['Decimal odds']
bank = outcome['Starting bankroll'][0]

def constraint1(bet):
    a,b,c = bet
    
    return 100 - a + b + c

con1 = {'type': 'ineq','fun': constraint1}
cons = [con1]
    
b0,b1,b2 = (0,100),(0,100)     
bnds = (b0,b2)

def f(bet,sign = -1):
    global prob,decimal,bank
    p0,p1,p2 = prob
    d0,d1,d2 = decimal
    a,c = bet
    
    wins0 = a * (d0-1)
    wins1 = b * (d1-1)
    wins2 = c * (d2-1)
    
    loss0 = b + c
    loss1 = a + c
    loss2 = a + b

    log0 = np.log(bank + wins0 - loss0)
    log1 = np.log(bank + wins1 - loss1)
    log2 = np.log(bank + wins2 - loss2)
    
    objective = (log0 * p0 + log1 * p1 + log2 * p2)
    
    return sign * objective


bet = [5,8,7]

result = minimize(f,bet,method = 'SLSQP',bounds = bnds,constraints = cons)
    

但是,这不会产生所需的结果。所需的结果将是:

a = 3.33
b = 3.33
c = 0

我的问题还在于如何设置methodinitial的值?通过为下注分配不同的方法和初始值,结果似乎相差很大。

任何帮助将不胜感激!

(这是在品尼高网站上发布的示例:https://www.pinnacle.com/en/betting-articles/Betting-Strategy/the-real-kelly-criterion/HZKJTFCB3KNYN9CJ

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)