蒙特卡罗方法验证凯利公式
生活随笔
收集整理的這篇文章主要介紹了
蒙特卡罗方法验证凯利公式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
說明
本文受知乎陳小米啟發而寫。有興趣的朋友可以移步這里。
本文的代碼完全是本人所擼。
問題描述
假想一個游戲。贏的概率是60%,輸的概率40%。入場費隨意交。如果贏了獲得2倍的入場費金額(1賠1),輸則輸掉入場費。小米有1000元做本金,請問小米每次給多少入場費,理論上100次游戲后幾何期望收益能最大?
【本人的疑問】為何這里考慮幾何期望,而不是數學期望?【已解決,見代碼注釋!】
凱利公式
\[f=p-\frac{q}\]
不多說,上代碼。
完整代碼
import pandas as pd import numpy as np import random import matplotlib.pyplot as plt''' 用蒙特卡羅方法,驗證凱利公式的計算得到資金比例是不是最佳的參考:https://zhuanlan.zhihu.com/p/20849995 '''pwin = 0.6 # 勝率 b = 1 # 凈賠率# 凱利值 def kelly(pwin, b):''' 參數 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# 蒙特卡羅方法重復玩游戲 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 #【 數學期望】不平滑return np.exp(np.log(pd.DataFrame(res)).sum(axis=0) / n) # 【幾何期望】平滑n = 1000 # 重復次數 cash = 1000 # 初始資金池 m = 100 # 期數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)# 畫個圖看看 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()效果圖
結論
由圖顯見,凱利值是最優的。
總結
以上是生活随笔為你收集整理的蒙特卡罗方法验证凯利公式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用POI将doc文件转换为html
- 下一篇: 美方首次起诉4名俄黑客 其中两人系俄安全