用Python和数学方法证明为啥散户炒股票总赔钱

文章首发于:Panda's Blog

本篇文章将通过Python模拟一个案例来映射散户与庄家之间的博弈


目录

  • 目录
  • 文章
    • 故事引入
    • 通过数学方法证明
      • 简单分析
      • 仔细分析
      • 李永乐老师的分析
    • 通过 Python 模拟对局证明
      • 源码
      • 实现逻辑
    • 结论
    • 映射
      • 股市里如何才能稳赚钱

文章

故事引入

有一天,有一个男人坐在酒吧里独自喝酒,遇到一个美女,提议和男人玩一个掷硬币的游戏,两人分别有一枚硬币,两人可以任意决定自己硬币的正反面,然后同时打开自己的硬币给对方看。

游戏规则:

  • 两个硬币都是正面的,男人赚3元
  • 两个硬币都是反面的,男人赚1元
  • 两个硬币不相同面,男人输2元

通过数学方法证明

简单分析

站在男人的角度分析,这场游戏可以简化为以下表格

规则

简单计算一下男人一局游戏的数学期望

E_{(man)} = \frac{1}{4} \times 3 + \frac{1}{4} \times 1 - \frac{1}{2} \times 2 = 0

这样看来,貌似这是一个公平的游戏,但是随着游戏进行,男人却发现自己一直在输钱,难道只是因为女人的运气比较好?

仔细分析

设:

  • 男子掷出正面的概率为 x
  • 女子掷出正面的概率为 y

则可得出

  • 男子掷出反面的概率为 1-x
  • 女子掷出反面的概率为 1-y
概率

此时男人一局游戏的数学期望则为

E_{(man)} = 3xy + (1-x)(1-y) - 2x(1-y) - 2y(1-x)

若女人能采取某种策略使得E(man)永远小于0,则男人一直输钱

3xy + (1-x)(1-y) - 2x(1-y) - 2y(1-x) < 0

合并同类项得到

y(8x - 3) < 3x -1

解出这个不等式

(8x - 3) > 0时:
x > \frac{3}{8}
3xy + (1-x)(1-y) - 2x(1-y) - 2y(1-x) < 0
y < \frac{3x-1}{8x-3}
y < \frac{3x-1}{8x-3}是减函数,且x,y∈[0,1]
∴ 当x取最大值时,y < \frac{2}{5}

(8x - 3) < 0时:
x < \frac{3}{8}
3xy + (1-x)(1-y) - 2x(1-y) - 2y(1-x) < 0
y > \frac{3x-1}{8x-3}
y < \frac{3x-1}{8x-3}是减函数,且x,y∈[0,1]
∴ 当x取最小值时,y > \frac{1}{3}

结合1°和2°

\frac{1}{3} < y < \frac{2}{5}时,E_{(man)} < 0

所以当女人出正的概率在1/3到2/5之间时,无论男人怎么出,最后都必输无疑

李永乐老师的分析

传送门:BV1zs411779z

通过Python模拟对局证明

源码

import random


class Player:
    def __init__(self):
        # 初始金币
        self.money = 500
        # 默认正面概率
        self.prob_front = 0.5
        # 玩家名
        self.name = ''

    # 选择正反面
    def choose(self):
        if (self.prob_front <= 1) & (self.prob_front >= 0):
            if random.random() < self.prob_front:
                return 'front'
            else:
                return 'back'


class Game:
    def __init__(self):
        # i - 游戏局数
        self.i = 0
        # winner - 赢家
        self.winner = None

    def start(self, player1, player2):
        while True:
            if (player1.money >= 2) & (player2.money >= 3):
                # 游戏开始
                player1Choose = player1.choose()
                player2Choose = player2.choose()

                # 当选择不相同时,player1输钱
                if player1Choose != player2Choose:
                    # player1输2
                    player1.money -= 2
                    player2.money += 2

                # 当选择相同时,player1赚钱
                else:
                    # 同正
                    if (player1Choose == 'front') & (player2Choose == 'front'):
                        # player1赚3
                        player1.money += 3
                        player2.money -= 3
                    # 同反
                    elif (player1Choose == 'back') & (player2Choose == 'back'):
                        # player1赚1
                        player1.money += 1
                        player2.money -= 1
                self.i += 1
                # print(player1.name + ':' + str(player1.money))
                # print(player2.name + ':' + str(player2.money) + '\n')
            else:
                if player1.money < 2:
                    self.winner = player2
                else:
                    self.winner = player1
                return self.i


def main():
    sumOfPlayer1Win = 0
    sumOfGame = 0
    # 游戏迭代次数
    t = 500
    for x in range(t):
        # 玩家1
        player1 = Player()
        player1.name = 'man'
        # 玩家1出正的概率
        player1.prob_front = 0.5
        # 玩家2
        player2 = Player()
        player2.name = 'women'
        # 玩家2出正的概率
        player2.prob_front = 0.5
        g = Game()
        i = g.start(player1, player2)
        winnerObj = g.winner
        winner = winnerObj.name
        print('持续了'+str(i)+'局,赢家是'+str(winner))
        if winnerObj.name == player1.name:
            sumOfPlayer1Win += 1
        sumOfGame += i
    print('统计:\n'+player1.name+'获胜次数'+str(sumOfPlayer1Win))
    print(player2.name + '获胜次数' + str(t-sumOfPlayer1Win))
    print('平均结束局数' + str(sumOfGame/t))


if __name__ == '__main__':
    main()

实现逻辑

  • 游戏开始一名玩家的钱不足以开始下一次对局为一次游戏
  • 游戏开始给与两名玩家相同的钱
  • 两名玩家可以设置自己此次游戏的出正概率

当两个玩家都有500元(money),出正的概率(prob_front)都为0.5时,迭代500(t)次看看结果

money=500,prob_front=0.5,t=500

可以发现,此时游戏看起来似乎是“公平”的,双方输赢都差不多

那么当女人带着策略时(正的概率在1/3到2/5之间)

两个玩家都有500元(money),女人出正的概率(player2.prob_front)为0.36,男人出正的概率(player1.prob_front)为0.5时,迭代500(t)次看看结果

money=500,player2.prob_front=3.6,t=500

男人输了500次精光

如果男人每次的出正概率都为随机呢?

两个玩家都有500元(money),女人出正的概率(player2.prob_front)为0.36,男人出正的概率(player1.prob_front)为随机数(random.random())时,迭代500(t)次看看结果

money=500,player1.prob_front=random.random(),player2.prob_front=3.6,t=500

结果并没什么变化

结论

当女人出正的概率在1/3到2/5之间时,无论男人怎么出,最后都必输无疑

映射

如果把

  • 女人比作股市里的庄家,硬币正反面比作打压股价和拉升股价
  • 男人比作股市里的散户,硬币正反比作买多和买空

此时规则可以简化为以下表格

股市规则

表面上貌似有跌有涨,散户是有赚到钱的可能

而事实上庄家可以通过一定的策略,让散户一直亏钱

股市里如何才能稳赚钱

变成庄家

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概率 从 1654 年开始,布莱斯·帕斯卡尔和皮埃尔·费马 在相互来往的信件中发展了概率论...
    监利一佛阅读 5,451评论 0 2
  • 最近有很多高考考生和他们的家长咨询我问题。在此统一答复如下: ——“我的孩子高考成绩不错,应该报哪个学校,什么专业...
    21世纪教育家阅读 1,092评论 0 0
  • 暗月葬花逝情处, 孤魂冷酒博人生! 凡尘苍苍,犹如转世轮回的落寂! 几度霜寒,几度烈日,几度风雨,几度春秋,几度人...
    林飞鸿阅读 884评论 0 4
  • 01 我有关狗的记忆都不好。 最初的记忆里,是有一年上面来几个人,看到狗就抓,看到狗就打,说是上面人说的,全部不许...
    吟花飞语阅读 1,332评论 0 1
  • 李冬梅每日三正67 日期:20190621 本周梦想:看完三本书 今日进步:淡定考试 今日定向:回顾 三正: 1....
    ldm_e1ac阅读 825评论 0 0