凱利公式在投資界聲名顯赫使鹅,甚至賭徒都奉為圭臬茎用,不懂得凱利公式無異于盲人摸象遣总,為了對凱利公式有一個形象具體的了解,乘著周末用python語言模擬了各種投資環(huán)境下的收益曲線轨功。
凱利公式為:stake=(win_chance x odds-1)/(odds-1) 其中stake為下注比例,也就是每次下注額占你所有可動用本金的比例,win_chance為贏的概率柔昼,odds為賠率侨艾。按公式,如果win_chance*odds<1羡滑,那么就不值得你下注菇爪,因為stake為負數(shù),是不是這樣呢柒昏?請看下面的代碼和收益曲線凳宙。
def applystake(x,stake,win_chance,odds,original): #original為初始資金
if stake==0: #凱利公式計算的比例
stake=(win_chance*odds-1)/(odds-1)
elif stake=="sub":
stake=(win_chance*odds-1)/(odds-1)*0.4
else:
stake=(win_chance*odds-1)/(odds-1)*2
if stake>1:
stake=1 #下注比例最大為1
order = original[0] * abs(stake) #stake有可能有負數(shù)
original[0]-=order
if win_chance<0.5:
if x==2 or x==1:
original[0]+=order*odds
else:
pass
return round(original[0],2)
elif win_chance>0.5:
if x in [1,2,3]:
original[0] += order * odds
else:
pass
return round(original[0],2)
else:
print("還沒有設(shè)置對應(yīng)比例!")
def myplot(win_chance,odds):
myseries=pd.Series(np.random.choice([1,2,3,4,5],200,p=[0.2,0.2,0.2,0.3,0.1,]))
df = pd.DataFrame(columns=["kelly", "sub", "add"])
if win_chance==0.4:
win_chance=round(myseries.value_counts(normalize=True)[[1,2]].sum(),2)
else:
win_chance = round(myseries.value_counts(normalize=True)[[1,2,3]].sum(),2)
df["kelly"] =myseries.apply(applystake, args=(0,win_chance,odds, [10000]))
df["sub"] = myseries.apply(applystake, args=("sub",win_chance,odds, [10000]))
df["add"] =myseries.apply(applystake, args=("add",win_chance,odds, [10000]))
plt.plot(df["kelly"],label="kelly")
plt.plot(df["sub"],label="0.4倍kelly")
plt.plot(df["add"],label="2倍kelly")
plt.title(f"{win_chance*100}%勝率下不同投注比例的收益曲線({odds}倍賠率)")
plt.xlabel("初始金額為10000元")
plt.legend(loc=1)
plt.grid(alpha=0.2)
plt.show()
myplot(0.4,2)
myplot(0.4,3)
myplot(0.6,3)
d0.4_2.png
d0.4_3.png
d0.6_2.png
可見职祷,一場風險游戲的輸贏還真不完全是運氣的鍋氏涩,賠率和下注比例也是很重要的因素,如圖一堪旧,勝率和賠率的積小于1削葱,無論怎么下注最終都注定會輸,現(xiàn)實中的例子比比皆是淳梦,就不敢舉例了析砸;圖二,勝率和賠率的積大于1爆袍,按凱利公式的比例下注則收益曲線增長最快首繁,如果下注比例過小則收益曲線增長太慢,如果下注比例過大則不贏反輸陨囊;圖三弦疮,勝率已經(jīng)超過50%,即使只有2倍賠率蜘醋,按凱利公式的比例下注則收益曲線也能很快增長胁塞,但如果下注比例過大則收益同樣會歸零。