文:屠夫1868
欢迎关注:基业长红1868
转载需获本人授权,并注明作者和出处
“一图胜千言。”
金钱永不眠,屠夫问候各位早安。
本来是回复在交流群的一篇内容,怎料触发了敏感词导致反复被删。
幸好提交前进行了内容备份,只好发到这里,提前祝大家周末愉快~
「粉丝@一颗柚子婷提问」
屠夫你好。读过硬币赌局三部曲和反击篇后,收获良多,对你的分析思路很感兴趣,也想动手用python做一下蒙特卡洛模拟。
希望你分享一下这几篇的建模思路,谢谢!
(PS 本人有Python基础)
「屠夫答」
看ID应该是位女同学,对数学和编程感兴趣还有python基础的女生应该算比较罕见了吧,感谢这个稀有的提问哈~
硬币赌局三部曲 + 反击篇虽然出发点不一样,但是建模的思路是很接近的。
先将问题拆解。n场赌局的结果相互独立,我们可以先考虑一局里的情况,而一场硬币赌局的基本要素有这几样:
【1】赌局胜负(掷硬币的结果)
【2】下注策略
【3】资金结算(根据赔率和下注策略)
【1】赌局胜负
不论赔率如何、下注策略是什么,每一场的结果都是相对独立的,所以赌局胜负可以最先计算出来,然后保存成文件,以便不同策略或不同赔率依据同样的赌局结果进行对比。
这一步使用numpy的random.choice模块就可以快速完成,运算时间也非常短。
【2】下注策略
三部曲里采用的都是静态下注策略,也就是每一局下注金额要么固定,要么随机,不会根据前一局的结果而调整,直接生成金额矩阵然后和赌局矩阵进行运算即可。
反击篇的仓位管理比较复杂,下注策略是动态的,每一局的结果会影响下一局的下注。屠夫只能为马丁格尔策略和凯利公式各写一个函数进行处理。
这里有个小技巧:
用pandas的dataframe是可以轻松快速地按列运算的,所以如果每行表示1个赌徒的赌局结果,每列表示1场赌局,那么在按列运算的方法下,赌徒数量再多也不会明显增加你的计算时间。
【3】资金结算
在有了【1】和【2】之后,资金结算无非是将余额(balance)和所有赌局结果求和。比较特殊的有两篇:
《给我1枚硬币》因为爆仓就不能再赌,所以要专门有一个survival字段记录该赌徒是否已经爆仓,是的话就不需要参与下一轮运算了;
《反击篇》同样有爆仓控制,外加凯利公式是要结合赌徒余额计算的,所以【2】和【3】都在策略函数里处理,不等最后进行资金结算。
完成上述3步后,其实已经得到了你的模拟结果。
数据可视化,可能是被许多分析师低估的工作。
一图胜千言,尤其是对于没有充分数据知识的读者来说,再详尽的解释都不如一张直观的图表来得深刻。
如果希望把蒙特卡洛模拟的结果进行展示,可视化值得你多花点功夫。
以上为个人见解,仅供参考,希望能帮到你~
[ 作者简介 ]
屠夫1868,一个秉持价值理念、专攻资产配置、追求财务自由的量化投基者。
更多投资思考、心得分享和「半天候资产配置」在【基业长红1868】更新,欢迎关注。
领取专属 10元无门槛券
私享最新 技术干货