股票,重要性测试和p-hacking

10月是历史上最动荡的月份, 但这是持续的信号还是数据中的杂讯?
本文学习如何使用panda操作时间序列数据,使用Python模拟进行显著性检验,分析股市波动。
股票,重要性测试和p-hacking

文章图片
因此, 我们已经了解了熊猫中一种强大的方法, 即重新采样。现在, 让我们使用另一个” groupby” 。我们需要从每月的年度波动率值到所需的AMVR指标。同样, 我们只需几行代码即可实现这一点。
1.首先, 我们对mnthly_annu值应用” groupby” 方法。 Groupby需要一个参数, 该参数指定如何对数据进行分组。这可能是一个函数, 或者在我们的例子中是一个系列。我们传入” mnthly_annu.index.year” , 这只是mnthly_annu数据的datatime索引上的year属性。这将在我们的数据集中将32年中的每一年的月波动率值分组。
2.接下来, 我们应用” 排名” 方法, 该方法以升序对数据进行排序。
3.最后, 我们再次做同样的事情, 并在每个月的所有年度中平均。这为我们提供了最终的AMVR值!
#for each year rank each month based on volatility lowest=1 Highest=12 ranked = mnthly_annu.groupby(mnthly_annu.index.year).rank()#average the ranks over all years for each month final = ranked.groupby(ranked.index.month).mean()final.describe()

count12.000000 mean6.450521 std0.627458 min5.218750 25%6.031013 50%6.491004 75%6.704545 max7.531250 Name: close, dtype: float64

这是我们最终的平均每月波动率排名。从数字上可以看到, 10月(10月)最高, 而12月(12月)最低。
#the final average results over 32 years final

date 16.818182 26.666667 36.575758 47.303030 56.606061 66.030303 76.031250 85.875000 96.406250 107.531250 116.343750 125.218750 Name: close, dtype: float64

为我们的数据选择正确的可视化非常重要, 因为我们希望通过最具影响力的图表和绘图来讲述数据的故事。为了进行分析, 我们希望清楚地显示出最高的波动率和最低的波动率。为此, 我们将使用matplotlib的条形图并相应地进行注释和颜色以产生最大的影响。
1.通过用所需的条形索引b_plot(b_plot [9]), 我们可以设置颜色以突出显示最高和最低值。
2.要将AMVR值添加到其各自的栏中, 我们列举每个AMVR值(“ 最终” 变量)并将结果四舍五入到小数点后两位。 ” i” 和” v” 代表” 最终” 变量的” 索引” 和” 值” , 因此” i” 的范围为1至12, “ 值” 将AMVR值四舍五入到小数点后两位。我们在plt.text()中使用这些变量。 plt.txt()的第一个参数是标签的x轴位置, 因此我们为每个条传递” i” 并偏移0.8以使其居中。第二个参数是” 最终” 值的字符串版本。
【股票,重要性测试和p-hacking】3.为了显示平均值, 我们使用axhline, 并使用” label” 值在右上角添加图例。只需输入y轴值(即平均值), 然后添加样式即可。
这提供了我们正在研究的现象的最佳视觉效果。我们可以清楚地看到10月是最不稳定的月份, 而12月则是最少的月份。重要的是, 我们还可以看到, 从绝对意义上讲, 12月是更” 极端” 的价值。这对于下一部分的分析非常重要。
#plot results for ranked s& p 500 volatility #clearly October has the highest AMVR #and December has the lowest #mean of 6.45 is plottedb_plot = plt.bar(x=final.index, height=final) b_plot[9].set_color('g') b_plot[11].set_color('r') for i, v in enumerate(round(final, 2)): plt.text(i+.8, 1, str(v), color='black', fontweight='bold') plt.axhline(final.mean(), ls='--', color='k', label=round(final.mean(), 2)) plt.title('Average Monthly Volatility Ranking S& P500 since 1986')plt.legend() plt.show()

股票,重要性测试和p-hacking

文章图片
这就是我们的数据, 现在进行假设检验…
假设检验:有什么问题?
假设测试是数据科学最基本的技术之一, 但它却是最令人生畏和误解的一种。这种恐惧的基础是《统计》第101条规定的教导方式, 我们被告知:
“ 执行t检验, 是单面还是双面检验?选择合适的检验统计数据, 例如Welch的t检验, 计算自由度, 计算t分数, 在表中查找临界值, 将临界值与t统计量进行比较……”
股票,重要性测试和p-hacking

文章图片
可以理解的是, 这导致了对进行何种测试以及如何进行测试的困惑。但是, 所有这些用于执行假设检验的经典统计技术都是在我们拥有很少的计算能力并且仅仅是用于计算p值的封闭形式分析解决方案的时候开发的, 仅此而已!但是, 由于其局限性(有时甚至是不透明的)假设, 因此需要为给定情况选择正确的公式, 这更加复杂。
但是很高兴!
有一个更好的办法。模拟。
为了了解模拟如何帮助我们, 让我们提醒自己什么是假设检验:
我们希望测试” 我们的数据中观察到的效果是真实的还是偶然发生的” , 并且要执行此测试, 我们执行以下操作:
  • 选择适当的” 测试统计” :这只是一个衡量观察到的效果的数字。在本例中, 我们将从平均值中选择AMVR的绝对偏差。
  • 构造一个零假设:这仅仅是数据的一个版本, 其中没有观察到的效果。在我们的例子中, 我们将反复对数据的标签进行重排(排列)。这样做的理由在下面详述。
  • 计算p值:这是在空数据中看到观察到的效果的可能性, 换句话说, 是偶然的情况。我们通过对空数据进行重复仿真来做到这一点。在我们的案例中, 我们多次对数据的” 日期” 标签进行混洗, 并简单地计算通过多个模拟显示的测试统计数据的出现。
这是三个步骤的假设检验!无论我们正在测试什么现象, 问题始终是相同的:” 观察到的效果是真实的, 还是由于偶然而产生的”
只有一个测试!艾伦·唐尼(Allen Downey)撰写的精彩博客, 提供了更多关于假设检验的详细信息
仿真的真正力量在于, 我们必须通过代码来明确我们的模型假设。当涉及到假设时, 古典技术可能是一个” 黑匣子” 。
下面的示例:左图以一定概率显示了真实数据和观察到的效果(绿色)。右图是我们模拟的空数据, 其中记录了偶然看到观察到的效果的时间(红色)。这是假设检验的基础, 看到观察到的对我们的空数据的影响的概率是多少。
股票,重要性测试和p-hacking

文章图片
左列是回答问题1的数据, 右列是问题2的数据。第一行是概率分布, 而下一行是CDF。红色虚线是我们任意确定的5%显着性水平。蓝线是12月AMVR的原始极端值为1.23。
左侧图显示原始的12月值在5%的水平上是显着的, 但仅仅是!但是, 当我们考虑多重比较偏差时, 在右侧图中, 显着性阈值从大约1.2(绝对AMVR)上升到大约1.6(参见红线)。
通过考虑多重比较偏差, 我们的12月值1.23不再重要!
考虑到我们要回答的特定问题并避免了多重比较偏差, 我们避免了p-hacking我们的模型, 并且避免了在没有模型时显示出明显的结果。
要进一步探索p-hack以及如何滥用它来讲述有关我们数据的特定故事, 请参阅FiveThirtyEight这款出色的交互式应用程序
结论
  • 我们已经知道, 假设检验不是我们认为的可怕的大野兽。只需按照上述3个步骤为任何类型的数据或测试统计量构建模型。
  • 我们已经证明, 提出正确的问题对于科学分析至关重要。措辞上的微小变化可能会导致完全不同的模型, 结果也大不相同。
  • 希望更高级的Python功能的强大功能以及使你能够进行统计测试的能力现在已经显而易见!仅用几行代码, 我们就构造并测试了现实世界中的现象, 并能够得出可行的结论。
  • 我们讨论了识别和纠正多重比较偏差并避免p-hacking陷阱的重要性, 并说明了看似有意义的结果如何变得不重要。
  • 随着越来越多的” 大数据” 以及学术压力, 他们不得不发表具有” 新” 发现或具有政治压力以表明结果” 重大” 的研究论文, 因此对P黑客的诱惑日益增加。通过学会识别我们何时犯有罪并进行相应的纠正, 我们可以成为更好的研究人员, 并最终产生更准确, 因此更可行的科学成果!
作者注:我们的结果与最初的Winton研究略有不同, 部分原因是数据集有所不同(32年vs. 87年), 他们将10月作为关注月份, 而将12月作为关注月份。此外, 他们在” 模拟数据” 中使用了未公开的方法, 而我们通过代码明确了用于创建该数据的方法。在整个工作中, 我们已经做出了某些建模假设, 这些假设也已经明确, 可以在代码中看到。这些设计和建模选择是科学过程的一部分, 只要明确选择就可以进行分析。
如果你想了解有关Python中金融的更多信息, 请参加srcmini的Python金融入门课程。
在Twitter.com/pdquant上关注我, 了解更多!

    推荐阅读