用凯利判据玩转前文中的“一个有趣的小数学游戏”
在《为什么频繁交易的人大多数在股市上都赔钱了?一个有趣的小数学游戏也许可以解答 》中我写道了如下有趣的小数学游戏:
假设有这么一家赌场提供了这么一个你可以玩无穷多次的游戏:扔一个硬币,若正面向上,则你的资产变成当下的 1.2 倍;若反面向上,则你的资产变成当下的 0.83 倍。你会选择玩这个游戏吗?
在那篇文章中,我做了个简单的模拟,验证了一下这个游戏会出现的结果:绝大多数玩家玩到最后都归零了,只有极少数玩家能够赢得超过本金的钱,而赢得最多的那个人的最终资产远远超过其他人很多很多。
但若改动一个游戏条件,这个游戏就变得更加有趣了:若玩家可以自己选择投注金额呢?玩家应该如何投注才是最佳方案?
直观的想:如果每次都押注100%金额,那其实就回到了一开始那个不能自己选投注金额的游戏,虽然每次玩收益很大,却有非常大的风险最后归零;如果每次都押注太小,那显然回报会很低。最佳的投注比例一定是平衡了这二者的。事实上这个新的游戏的最佳玩法,正是大名鼎鼎的凯利判据 (Kelly Criterion)(阅微堂对凯利判据的讲解也很不错)。凯利判据就是通过最大化资金的log函数的期望而得到的投注比例。证明过程就略过了,基本上就是对这个函数求导就可以。最后得到的凯利判据 (Kelly Criterion)公式为:
K = (pW-qL)/WL
其中p为赢的概率 (0.5),q=1-p为输的概率 (0.5),W为赢的情况下的收益 (0.2),L为输的情况下的损失 (0.17)。在我们这个游戏中,计算得知最佳投注比例 K 约为 0.44。
于是我改动了一下模拟代码,来看看现在用凯利判据投注的话结果如何!
import numpy as np import matplotlib.pyplot as plt P = 100 # Number of players N = 30000 # Total times played for one player win = 1.2 lose = 0.83 Num_of_winner = 0 Money_of_the_luckiest_winner = 0.0 W = abs(win-1) L = abs(lose-1) Kelly_percentage = (0.5*W-0.5*L)/(W*L) print(Kelly_percentage) # is about 0.44 in our case for j in range(P): m = np.zeros(N) m[0] = 10000.0 for i in range(1,N): if np.random.randint(2): m[i] = m[i-1]*win*Kelly_percentage + m[i-1]*(1-Kelly_percentage) else: m[i] = m[i-1]*lose*Kelly_percentage + m[i-1]*(1-Kelly_percentage) if m[-1]>m[0]: Num_of_winner += 1 if m[-1]>Money_of_the_luckiest_winner: Money_of_the_luckiest_winner = m[-1] plt.semilogy(m) print(Num_of_winner) print(Money_of_the_luckiest_winner) plt.xlabel('Times played') plt.ylabel('Money') plt.show() |
import numpy as np import matplotlib.pyplot as plt P = 100 # Number of players N = 30000 # Total times played for one player win = 1.2 lose = 0.83 Num_of_winner = 0 Money_of_the_luckiest_winner = 0.0 W = abs(win-1) L = abs(lose-1) Kelly_percentage = (0.5*W-0.5*L)/(W*L) print(Kelly_percentage) # is about 0.44 in our case for j in range(P): m = np.zeros(N) m[0] = 10000.0 for i in range(1,N): if np.random.randint(2): m[i] = m[i-1]*win*Kelly_percentage + m[i-1]*(1-Kelly_percentage) else: m[i] = m[i-1]*lose*Kelly_percentage + m[i-1]*(1-Kelly_percentage) if m[-1]>m[0]: Num_of_winner += 1 if m[-1]>Money_of_the_luckiest_winner: Money_of_the_luckiest_winner = m[-1] plt.semilogy(m) print(Num_of_winner) print(Money_of_the_luckiest_winner) plt.xlabel('Times played') plt.ylabel('Money') plt.show()
这下100个玩家全部最终资产大于初始本金了,最幸运的玩家最终的资产都是10^60+这种量级了… 在对数坐标轴下,所有玩家的资产都几乎直线上涨了。
不知你是否有跟我一开始一样的一个疑惑:如果只是选择一个固定的投注比例,似乎只是让这个游戏每次赢的少了点,输的也少了点而已,为什么仅仅如此选择一个投注比例就可以扭转归零的颓势了呢?其实具体把数字计算一下就明白了:原本赢则变1.2倍,输则变0.83倍的游戏,若固定44%的投注比例,就变成了赢则变1.088倍,输则变0.9252倍。1.088*0.9252是多少呢?1.0066176!大于1了!这就解释的通为啥所有玩家的资产都纷纷上涨了。
凯利判据貌似在投资中挺有用的,本文这个简单的小数学游戏也算是给大家一个直观印象了吧!
//感谢zhiqiang提供的宝贵讨论!
楼主的博客文章都非常有意思且很有知识性. 看了下楼主原来是物理 PhD. 长期的科学训练对于思维的帮助是非常大的.