社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用Python从数学角度“操纵”一场足球比赛

Crossin的编程教室 • 2 天前 • 8 次点击  

大家好,欢迎来到 Crossin 的编程教室。


世界杯正在如火如荼地进行中。每逢大赛,冷门在所难免,这时候网上总会有人很懂地告诉你:现在的足球比赛都是被操纵的,水很深。更有甚者会神秘地告诉你,通过分析数据,你就能看出来接下来的一场比赛是什么结果。

好家伙!财富密码尽在掌握啊。

有没有神秘力量操纵比赛我不知道。但其实从数学角度来说,根本不需要这么麻烦,只要一样东西就可以,那就是:概率


假设现在A、B两队要进行一场比赛。阿汪同学说他觉得A队要赢,并愿意为此押上100个小鱼干阿喵同学说他觉得B队要赢,也愿意押100个小鱼干

我说那行,我来给你们做个见证,你们把小鱼干都放我这里,最后谁对了,我就把小鱼干全给谁。不过,我得从所有小鱼干里拿走10个,也就是5%的小鱼干,作为我的辛苦费。也就是说,赢的人最终可以拿走190个小鱼干



现在问题来了:谁最有可能去操纵比赛?

阿汪和阿喵都有动机,唯独不可能是我。因为不管谁赢谁输,我都稳赚10个小鱼干。那我究竟是吃饱了撑的没事干,还是跟谁有深仇大恨,宁可瞒天过海偷天换日只为了把一人的小鱼干转移给另一个人?

有人要说了,你举的这个例子不对。一般来说,两种情况赢的人能拿多少小鱼干走是不一样的,所以你会输小赢大!

No!No!No!


这个因果逻辑反了!

不同结果的存在不是由我决定,而是由参与的阿汪和阿喵决定。

同样是刚才的例子阿汪依旧押100个小鱼干支持A队赢;而B队这边,除了阿喵同学押了100个小鱼干阿咩同学也押了100个小鱼干。这时候,我依旧从中拿走5%,现在是15枚。如果A队赢了,阿汪可以得到 285 个小鱼干,所以押A队的结果是 (300-15)/100=2.85;而B队赢了,阿喵和阿汪同学各可以拿走 142.5 个小鱼干,所以押B队的结果是 (300-15)/2/100=1.425


我当然可以把结果数值定的更低,比如A队为2.5,B队为1.2,这样我可以赚到更多的小鱼干。但三位同学也不傻,他们一算,不对啊,怎么不管谁赢,我都还私藏了一部分小鱼干,以后就不来找我做公证了。于是我连原本稳赚的那5%也没了。

所以,我给出的数值,就是既要保证不管谁赢,我自己都是能赚钱的,又要保证数值尽可能高以便吸引更多的阿汪阿喵。

为此,就需要做两件事:
  1. 给出一个尽可能准的初始数值

  2. 根据下注情况动态调整数值


假设一场比赛,我给出了:
胜2.50 - 平3.10 - 负2.88 
这样的即时数值。

计算一下就可以发现,此时我的预期抽成为:




我用一段程序来模拟一场比赛的竞猜过程,来看看是不是真的可以仅通过调整数值就让自己稳赚不赔。为了简化模型,这里只考虑A队胜和B队胜两种情况,没有平局

假设初始预估的胜率各为50%,而参与者们的偏好是80%会猜A赢20%会猜B赢

我的动态调整策略就是:根据最近1000个参与者的选择作为依据,按照前面说的方法计算出新的数值。当然,我依旧会从中抽取5%

当有十万人次参与竞猜之后,我得到的结果是这样的:


解释一下:
红色曲线是我收到的小鱼干总额;
蓝色曲线是A队胜利后我需要根据每个参与者当时数值所需支付的小鱼干;
绿色曲线则是B队胜利后需支付的小鱼干;
黄色虚线和青色虚线则分别是AB两队的即时数值。

可以很明显地看出来,除了一开始因为初始数值定得过于随意,导致出现短暂的轻微亏损外,之后时间里,我都是稳赚不赔的。

有人又要说了,你这个情况太理想,观众的选择分布不会这么稳定的!

OK,没关系,我们继续来模拟。

现在假设每经过一万人次的参与,大家就更看好B队一点,A队的选择偏好就会在现有基础之上降低10%。其他条件和策略不改变。我们将会得到这样的结果:


从开始到结束,尽管球迷们对AB两队的看好程度彻底发生了反转,但这依旧不影响我赚钱的稳定性

再进一步,我设定在比赛期间,有万分之一的几率出现随机的球迷选择的集体大波动,也就是说出现了完全无法预测的冷门情况。


即使在这种奇葩的情况下,我的小鱼干还是稳如老狗!

为了更有说服力,同样的规则,重复100次参与人次依次为 10000 到 110000递增,把收益比画出来:


看见没,不过来多少人,收益始终可以维持在5%左右,也就是我预设的抽成比例,而且人越多越接近这个比例。这就是概率学上大数定律的体现,即重复的次数越多真实发生的频率就越趋近于理论上的概率

现在,还有人觉得我需要去操纵某支队获胜吗?有必要吗?


我要的只是有很多很多人都来竞猜,越多越好。我不关心哪支球队状态更好,天气更适宜,主力球员的感情生活更稳定,甚至初始的数值也并不是很重要。唯一关键的就是实时情况。我调整数值不是为了坑人上天台,反而恰恰是为了让不同方更加平衡,避免赢小赔大或赢大赔小的情况出现。

所以,决定数值的不是我,而是在我来这里的阿汪阿喵阿咩们。我不需要动任何手脚,只要你坚持来,把自己的小鱼干赔光是必然的事情。


不信我们再来看一个模拟:

假设所有比赛的赛前预计胜率都是合理的,比如预计A队胜率80%,那实际就是有80%的可能赢球。在此基础上,阿汪带着1个w的小鱼干来了。每场比赛,他都会押上1000个小鱼干,也就是初始总额的1/10。这样,一直持续下去,结果会怎样?


模拟了100次,这是小鱼干数量的变化曲线。虽然也有不少时候,1万小鱼干会变成两三万甚至更多,但绝大部分情况下,在不到100次的时候,小鱼干就归零了。而拉长到1000次,更是几乎不可能幸免。

如果阿汪执迷不悟,继续借来小鱼干参与:


可以看到,由于抽成的存在,小鱼干数量的整体曲线是在不断下降的

而假如阿汪还很激进,动不动就 All-in,那么可以大大提速这个过程:


基本上两三次也就赔光了。运气爆棚的话能狗屎运多撑几次,但最后的结局总是一样的。

这个实验告诉我们:
在一个零和游戏中,作为注定劣势的一方,最好的策略就是一次都不要参与,这样数学期望才是最大的。

所以请切记:
大赌伤身,久赌必输,赌到最后,一无所有!



获取文中模拟实验代码,请在公众号 Crossin的编程教室 中回复关键字
足球


如果文章对你有帮助,欢迎评论/转发/点赞/收藏。你们的支持是我更新的动力~



添加微信 crossin123 ,加入编程教室共同学习~
感谢转发点赞的各位~

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/198731