记一次统计学知识的应用

初学数据分析,临时起意给自己出了个题,不过这是个反面教材。

统计学刚入门,接触到了概率的基础知识。中学的排列组合我还记得,A(5,3)、C(5,3)这种,一堆阶乘除来除去。我还给自己编了个记忆口诀,组合是大阶乘除以小阶乘除以差阶乘,排列是大阶乘除以差阶乘。

我真是个很爱算的人,玩游戏都不忘做数学题。英雄无敌4是一个我玩了很久的游戏,其中原版战役海盗的女儿第一关,地图上有4座魔法建筑可以学到魔法技能。整个游戏有5大派系魔法,我特别钟爱自然系魔法,总想让主角学自然法术。但有时候,运气就是那么背,4个魔法建筑都随机不到自然魔法。我决定算一算成功学到的概率,其中2个建筑是直接学会某个随机派系,还有一个是随机出两个派系,二选一,剩下一个建筑牵扯到一些复杂的游戏设定,就不展开讲了。最终算出来学到自然魔法的概率是:

1 - 4/C(5,1) x 4/C(5,1) x C(4,2)/C(5,2) x C(12,4)/C(15,4) =
1 - 4/5 x 4/5 x 3/5 x 11x10x9/15/14/13 ≈
86%
看来那次没学到是真的背。

当然,统计学远不止这点内容。最近接触到一个基础概念:期望值,指多次试验中,每次试验的结果与该结果发生概率的乘积之和。它可以用来评估大量反复做同一件事时整体表现如何。

忽然灵光一现,可以给自己出个练习题了。练习题本身的前提假设是有问题的,后面会解释。但没关系,主要目的是练习概念运用与数据操作:

获得比特币近3年、5年、有数据以来的每日价格,根据收盘价算出每日较前一日的涨跌幅百分比。把涨跌视作随机发生的概率事件,假设每天都在收盘时买入,并把这笔在第二日收盘时卖出,长此以往,这种操作的期望值如何?没错,这就是把币价波动当做赌场了,通过统计学方法,看看会得到什么结果。

CoinGlass比特币历史数据页面截图,显示2023年2月20日至3月22日每日开盘价/最高价/最低价/收盘价/成交量/市值数据表格

首先,要获得数据。原本是想让ChatGPT或Bing Chat教我爬数据,但一问发现,这是个公开数据,直接导出就是表格了。好吧,爬数据以后再慢慢学,先做题。

Jupyter Notebook代码截图,导入pandas读取bitcoin_2020-03-20_2023-03-20.csv文件,显示Date/Open/High/Low/Close/Volume/Market Cap七列数据

拿到表格导入Jupyter中,初始化一下,发现表里有日期、开盘价、最高价、最低价、收盘价、成交量、市值。

Jupyter Notebook代码截图,用pct_change计算每日涨跌幅百分比存入return列,显示date/open/high/low/close/volume/market_cap/return八列数据

我要用的只有收盘价,根据它来计算出每日较前日的涨跌百分比,记录在return列里。

Jupyter Notebook代码截图,用pd.cut将涨跌幅按5%区间分组,return列显示涨跌幅数值,range列显示所属区间如-5%到0%/0%到5%

既然是把它看作赌场,那么涨还是跌、涨跌百分之多少就是完全随机的,和丢骰子没差别。把return列的百分比值划分到不同的区间,我随便定了个5%作为区间的跨度。然后得出每天的涨跌百分比落在了哪个区间里,记录到另一列中。

Jupyter Notebook分布图代码截图,用matplotlib绘制涨跌幅直方图,横轴-100到100,纵轴0到500,数据集中在0附近呈尖峰分布

先画个分布图,直观感受下是什么情况。如图所示,几乎全部涨跌都落在正负20%范围内。从历史看来,单日能波动这么多已是极限。而绝大多数落在了正负5%范围内,看来近3年里币价整体平稳。

Jupyter Notebook代码截图,用groupby按区间分组计算mean/median/count,显示-20%到20%各区间的平均值/中位数/数量

现在来计算具体的分布数据。把前面的百分比值按所在区间分组,有很多区间没有数据,去掉空值行之后,得到百分比值在各区间的平均值、中位数、数量。中位数没有用到,但可以和平均值对比做个参考,两者差别不大,表明每个区间内的分布相对均匀。

Jupyter Notebook代码截图,计算概率和回报乘积,新增return_probability和product列,显示各区间概率与平均值乘积

计算出涨跌落在每个区间的概率,也就是用该区间里的数量除以总数量,单开一列记录概率。把平均值和概率相乘,另开一列记录。

Jupyter Notebook代码截图,对product列求和计算期望值,输出结果为-0.1%,表明当天买第二天卖的操作长期期望值接近零

最终把乘积加总,得到统计学意义上的期望值。3年、5年、有数据以来,期望值都很接近,基本上都接近0。我也试着把区间划得更小,1%为一个区间,结果也差不多。

期望值为0,表明什么?代表当天买第二天卖的操作,长期坚持下来毫无收获,尽管它诞生以来涨了这么多。

但要注意,这个结论其实是错误的。因为这个练习题的前提假设就错了,币价的涨跌不能视为独立的概率事件,有太多场外因素对每日涨跌产生影响,同时过去的涨跌也在心理层面对未来的涨跌产生影响。这些影响无法用简单的统计学模型来量化。

大富翁4游戏启动画面截图,蓝色地球背景上显示大富翁4标题,下方有START/LOAD/OPTION三个卡通角色按钮

再者,即使这真是纯概率事件,比如我们实际上活在一个像大富翁游戏那样的虚拟世界中,里面的股票涨跌全是计算机程序生成的随机数,这结论是不是就正确呢?还是错误的,这种当天买第二天卖的操作,不是一无所获,而是注定亏损。因为我们观察的指标是涨跌百分比,每一天这个百分比的基数都不同。无论先涨10%再跌10%,还是先跌10%再涨10%,效果都不是变回原价,而是比原价低。

一番折腾,基于错误假设得出错误结论。除了练习数据分析技巧外,还有个重要的收获:统计学真的可以验证和研究生活中的问题,只要你尊重和敬畏它的严谨和局限性。这是信心的收获。