作者:physixfan
链接:https://www.zhihu.com/question/422873282/answer/1498548793
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这个问题和我之前写过的一篇文章道理是一样的,只是数字不同,所以直接把当时写的文章《为什么频繁交易的人大多数在股市上都赔钱了?一个有趣的小数学游戏也许可以解答》贴过来当回答吧~偶然读到了这篇文章,里面提到的一个简单的小数学游戏相当有意思。假设有这么一家赌场提供了这么一个你可以玩无穷多次的游戏:扔一个硬币,若正面向上,则你的资产变成当下的 1.2 倍;若反面向上,则你的资产变成当下的 0.83 倍。你会选择玩这个游戏吗?有两种分析这个游戏的方式。第一种:不论我玩的时候的本金m是多少,玩下一次的时候,收益的期望总是 m(1.2-1)1/2+m(0.83-1)1/2。因为赢钱的时候赢 0.2 总是大于赔钱的时候赔 -0.17,所以期望总是正的,那就应该玩,而且要一直玩无限多次。第二种:若一直玩下去,就会有赢有输,所以应该把 1.2 和 0.83 乘起来看是否大于1。结果是 1.2*0.83=0.996,小于1,因此久赌必输,不能玩。这两种分析哪一种更有道理呢?大家可以先想想看。我多年不学数学了,概率论早就忘光了,因此就写了个小代码来模拟一下如果玩这个游戏,会是什么结果。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

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
else:
m[i] = m[i-1]
lose

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.plot(m)

print(Num_of_winner)
print(Money_of_the_luckiest_winner)
plt.xlabel('Times played')
plt.ylabel('Money')
plt.show()在上面这段代码中,我模拟了100个玩家,每人玩30000次这个游戏,看看他们最后的资产有多少。结果很有意思:其中绝大多数玩家的资产都可算是归零了!最后print出来的 Num_of_winner 是资产大于本金的人,因为有随机性,所以每次运行结果肯定不同,但大多时候都是100人中有2~3人最终赢钱了而已。更有意思的是,最后print出来的100人里面最后资产最多的人最后到底有多少资产 Money_of_the_luckiest_winner,经常是8位数9位数的资产(本金是1万)!这绝对是个赢者通吃的游戏下面贴一下其中一次模拟的图,大家可以看看:过程中纵坐标最高都到了10^13这个量级了,但最后的时候肯定没这么多。放大一下最后的结果,是这样的:一个玩家遥遥领先,远远甩开了后面的其他所有玩家。把最后的那一块继续放大,在排除掉了前4名之后总算纵坐标不需要用科学计数法了 ,剩下的玩家的资产都集中在0那里:画一张纵坐标是对数坐标的图的话,可以更直观的看到大多数玩家资产向下的趋势(和上面几张不是同一个run):总结一下模拟的结果:绝大多数玩家玩到最后都归零了,只有极少数玩家能够赢得超过本金的钱,而赢得最多的那个人的最终资产远远超过其他人很多很多。其实也不会有赌场提供这个游戏的,因为最一开始的第一种分析方式的确是没错的,玩家期望的确为正,赌场会赔钱。但第二种分析方式仍然有价值:只有1个人基本赢走了所有钱,剩下的人都归零了。虽然没有赌场提供这个游戏,但是现实生活中,有一个地方跟这个小游戏太像了:股市!股市不是零和博弈,整体而言长期来看股市肯定是往上涨的,因为人类的生产力在提升。你买大盘指数基金buy&hold的话,期望肯定是正的。然而,股市每天都在涨涨跌跌,无数的人在里面频繁交易,最后血本无归。当然也有人最后成了大赢家,然而你能保证你是那个幸运的0.001%吗?在写完上面这篇文章后,经过和 @zhiqiang 讨论又学到了有意思的东西,详见《用凯利判据玩转前文中的“一个有趣的小数学游戏”》,也一起贴到这里来吧~若改动一个游戏条件,上面这个游戏就变得更加有趣了:若玩家可以自己选择投注金额呢?玩家应该如何投注才是最佳方案?直观的想:如果每次都押注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.5W-0.5L)/(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]winKelly_percentage + m[i-1](1-Kelly_percentage)
else:
m[i] = m[i-1]
loseKelly_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了!这就解释的通为啥所有玩家的资产都纷纷上涨了。凯利判据在真实的股市投资中也挺有用的,本文这个简单的小数学游戏也算是给大家一个直观印象了吧!

posted on 2021-11-30 00:37  FrostyForest  阅读(229)  评论(0编辑  收藏  举报