蒙特卡罗方法验证凯利公式
生活随笔
收集整理的這篇文章主要介紹了
蒙特卡罗方法验证凯利公式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
說(shuō)明
本文受知乎陳小米啟發(fā)而寫。有興趣的朋友可以移步這里。
本文的代碼完全是本人所擼。
問(wèn)題描述
假想一個(gè)游戲。贏的概率是60%,輸?shù)母怕?0%。入場(chǎng)費(fèi)隨意交。如果贏了獲得2倍的入場(chǎng)費(fèi)金額(1賠1),輸則輸?shù)羧雸?chǎng)費(fèi)。小米有1000元做本金,請(qǐng)問(wèn)小米每次給多少入場(chǎng)費(fèi),理論上100次游戲后幾何期望收益能最大?
【本人的疑問(wèn)】為何這里考慮幾何期望,而不是數(shù)學(xué)期望?【已解決,見(jiàn)代碼注釋!】
凱利公式
\[f=p-\frac{q}\]
不多說(shuō),上代碼。
完整代碼
import pandas as pd import numpy as np import random import matplotlib.pyplot as plt''' 用蒙特卡羅方法,驗(yàn)證凱利公式的計(jì)算得到資金比例是不是最佳的參考:https://zhuanlan.zhihu.com/p/20849995 '''pwin = 0.6 # 勝率 b = 1 # 凈賠率# 凱利值 def kelly(pwin, b):''' 參數(shù) pwin 勝率 b 凈賠率 返回 f 投注資金比例 '''f = (b * pwin + pwin - 1) / breturn f# 游戲 def play_game(f, cash=100, m=100):global pwin, bres = [cash]for i in range(m):if random.random() <= pwin:res.append(res[-1] + int(f*res[-1])*b)else:res.append(res[-1] - int(f*res[-1]))return res# 蒙特卡羅方法重復(fù)玩游戲 def montecarlo(n=1000, f=0.15, cash=1000, m=100):res = []for i in range(n):res.append(play_game(f, cash, m))#return pd.DataFrame(res).sum(axis=0) / n #【 數(shù)學(xué)期望】不平滑return np.exp(np.log(pd.DataFrame(res)).sum(axis=0) / n) # 【幾何期望】平滑n = 1000 # 重復(fù)次數(shù) cash = 1000 # 初始資金池 m = 100 # 期數(shù)f = 0.1 # 資金比例 10% res1 = montecarlo(n, f, cash, m)fk = kelly(pwin, b) # 資金比例 凱利值 res2 = montecarlo(n, fk, cash, m)f = 0.5 # 資金比例 50% res3 = montecarlo(n, f, cash, m)f = 1.0 # 資金比例 100% res4 = montecarlo(n, f, cash, m)# 畫個(gè)圖看看 fig = plt.figure() axes = fig.add_subplot(111)axes.plot(res1,'r-',label='10%') axes.plot(res2,'g*',label='{:.1%}'.format(fk)) axes.plot(res3,'b-',label='50%') axes.plot(res4,'k-',label='100%') plt.legend(loc = 0)plt.show()效果圖
結(jié)論
由圖顯見(jiàn),凱利值是最優(yōu)的。
總結(jié)
以上是生活随笔為你收集整理的蒙特卡罗方法验证凯利公式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用POI将doc文件转换为html
- 下一篇: 美方首次起诉4名俄黑客 其中两人系俄安全