蒙特卡罗方法验证凯利公式

简介: 说明本文受知乎陈小米启发而写。有兴趣的朋友可以移步这里。本文的代码完全是本人所撸。问题描述假想一个游戏。赢的概率是60%,输的概率40%。入场费随意交。如果赢了获得2倍的入场费金额(1赔1),输则输掉入场费。

说明

本文受知乎陈小米启发而写。有兴趣的朋友可以移步这里

本文的代码完全是本人所撸。

问题描述

假想一个游戏。赢的概率是60%,输的概率40%。入场费随意交。如果赢了获得2倍的入场费金额(1赔1),输则输掉入场费。小米有1000元做本金,请问小米每次给多少入场费,理论上100次游戏后几何期望收益能最大?

【本人的疑问】为何这里考虑几何期望,而不是数学期望?【已解决,见代码注释!】

凯利公式

\[f=p-\frac{q}{b}\]

不多说,上代码。

完整代码

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) / b
    return f
    
# 游戏
def play_game(f, cash=100, m=100):
    global pwin, b
    
    res = [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()

效果图

img_5953c089007e964749e515edebdd4433.png

结论

由图显见,凯利值是最优的。

目录
相关文章
|
6月前
线性代数——(期末突击)概率统计习题(概率的性质、全概率公式)
线性代数——(期末突击)概率统计习题(概率的性质、全概率公式)
58 1
|
7月前
|
算法 应用服务中间件 图形学
贝叶斯推理导论:如何在‘任何试验之前绝对一无所知’的情况下计算概率
这篇文章探讨了贝叶斯推理的发展历史,从帕斯卡尔和费马的早期工作到托马斯·贝叶斯、皮埃尔-西蒙·拉普拉斯和哈罗德·杰弗里斯的贡献。文章指出,贝叶斯分析经历了从使用均匀先验到发展更为客观的方法,如杰弗里斯先验的过程。它讨论了费雪对逆概率的批评,以及贝叶斯方法在处理不确定性问题上的优势。文章还介绍了如何通过匹配覆盖率来评估先验分布的合理性,并通过几个例子展示了不同先验在二项分布和正态分布问题中的应用。最后,文章提出了贝叶斯分析在统计学中的地位,强调了在缺乏先验知识时建立良好先验的重要性,并讨论了主观性和客观性在统计推理中的角色。
108 1
|
7月前
|
数据可视化
R语言可视化渐近正态性、收敛性:大数定律、中心极限定理、经验累积分布函数
R语言可视化渐近正态性、收敛性:大数定律、中心极限定理、经验累积分布函数
|
7月前
|
机器学习/深度学习
R语言通过伽玛与对数正态分布假设下的广义线性模型对大额索赔进行评估预测
R语言通过伽玛与对数正态分布假设下的广义线性模型对大额索赔进行评估预测
|
量子技术
量子力学的实验验证:双缝实验和贝尔不等式
通过双缝实验和贝尔不等式实验,我们验证了量子力学中的重要概念,并深化了对量子世界的理解。这些实验的结果为我们理解和应用量子力学提供了重要的实验支持,并推动了量子技术的发展。
162 0
量子力学的实验验证:双缝实验和贝尔不等式
|
Java
【附录】概率基本性质与法则的推导证明
本文从概率论三大公理出发,推导证明概率基本法则。
157 0
【附录】概率基本性质与法则的推导证明
|
机器学习/深度学习 人工智能 开发框架
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分2
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分
101 0
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分2
|
人工智能 移动开发 算法
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分
117 0
【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分
|
算法
算法:试证明求平方根的牛顿迭代法一定收敛
算法:试证明求平方根的牛顿迭代法一定收敛
161 0
算法:试证明求平方根的牛顿迭代法一定收敛

热门文章

最新文章