跳到正文

假设检验:P值与显著性

假设检验帮助你从噪声中区分真实模式。如果原假设为真,P值告诉你数据有多令人惊讶。

第 2 篇 · 共 5 篇 约 3 分钟

核心思想

假设你观察到某个交易策略在过去一年产生了 15% 的收益。这是真正有效的策略,还是仅仅是运气?假设检验为回答这个问题提供了一个严格的框架。

这个想法很简单:我们假设一个原假设 H0H_0——“没有异常事情发生”这一基准立场。然后我们问:如果 H0H_0 为真,我们实际观察到的数据有多令人惊讶?如果数据在 H0H_0 下非常令人惊讶,我们就拒绝 H0H_0 而支持备择假设 H1H_1。

原假设与备择假设

在交易策略的背景下,一个很自然的原假设是策略的均值收益为零(任何观察到的收益只是噪声)。备择假设是均值收益大于零,即策略有真正的正期望收益:

H0:μ=0vsH1:μ>0H_0: \mu = 0 \quad \text{vs} \quad H_1: \mu > 0

这是一个单侧检验,因为备择假设只关心一个方向。两侧检验(如检验某个系数是否等于特定值,而非大于或小于)的备择假设为 H1:μ≠0H_1: \mu \neq 0。

检验统计量

在 H0H_0 下,我们知道样本均值的抽样分布。如果样本均值为 xˉ\bar{x},单样本 t 检验的检验统计量为:

t=xˉ−μ0s/nt = \frac{\bar{x} - \mu_0}{s / \sqrt{n}}

其中 μ0\mu_0 是 H0H_0 下的假设均值,ss 是样本标准差,nn 是样本量。

如果 H0H_0 为真,这个 tt 统计量服从自由度为 n−1n-1 的 t 分布。当 H0H_0 为假时,tt 统计量倾向于更大(朝向备择假设的方向)。

P 值

P值是在原假设为真的条件下,观察到至少与我们实际观察到的数据一样极端的数据的概率:

p-value=P(观察到至少与我们实际观察到的数据一样极端的数据∣H0)p\text{-value} = P(\text{观察到至少与我们实际观察到的数据一样极端的数据} \mid H_0)

小的 P 值意味着数据在 H0H_0 下不太可能——这是反对原假设的证据。大的 P 值意味着数据与 H0H_0 一致——没有反对原假设的证据。

对于我们的单侧检验,P值为:

p=P(T>tobserved∣H0)p = P(T > t_{\text{observed}} | H_0)

其中 TT 是自由度为 n−1n-1 的 t 分布随机变量。

显著性水平与决策阈值

显著性水平 α\alpha 是我们在看到数据之前设置的阈值。如果 p<αp < \alpha,我们拒绝 H0H_0。最常见的选择是 α=0.05\alpha = 0.05,这意味着我们愿意在5%的时间里拒绝一个真实的原假设(犯第一类错误)。

α\alpha 的选择涉及权衡。较小的 α\alpha(如0.01)使拒绝 H0H_0 更难,减少假阳性但增加假阴性(第二类错误)的机会——未能检测到真实效应。较大的 α\alpha(如0.10)使拒绝更容易,增加功效但也增加假阳性率。

第一类错误与第二类错误

拒绝 H0H_0无法拒绝 H0H_0
H0H_0 为真第一类错误(假阳性)正确
H0H_0 为假正确第二类错误(假阴性)

检验的功效是当 H0H_0 为假时正确拒绝 H0H_0 的概率——检测到真实效应的概率。更多数据会增加功效。更大的效应量也会增加功效。

单样本和双样本 t 检验

单样本 t 检验检验样本均值是否与假设值不同。在金融中,这可以检验股票的日均收益率是否显著不同于零。

双样本 t 检验比较两个独立样本的均值。例如,策略A的均值收益是否显著不同于策略B的均值收益?

import numpy as np
from scipy import stats

np.random.seed(42)


n = 252
asset_a_returns = np.random.normal(0.0008, 0.015, n)  # 均值0.08%,波动率1.5%
asset_b_returns = np.random.normal(0.0003, 0.012, n)  # 均值0.03%,波动率1.2%

# 单样本 t 检验:资产A的均值是否显著不同于零?
t_stat_a, p_value_a = stats.ttest_1samp(asset_a_returns, 0)
print(f"资产A均值=0的单样本 t 检验:")
print(f"  t 统计量: {t_stat_a:.4f}")
print(f"  p 值: {p_value_a:.4f}")
print(f"  样本均值: {np.mean(asset_a_returns):.6f}")
print()

# 双样本 t 检验:资产A和B的均值是否显著不同?
t_stat_ab, p_value_ab = stats.ttest_ind(asset_a_returns, asset_b_returns)
print(f"双样本 t 检验:资产A均值 = 资产B均值:")
print(f"  t 统计量: {t_stat_ab:.4f}")
print(f"  p 值: {p_value_ab:.4f}")
print(f"  A均值: {np.mean(asset_a_returns):.6f}, B均值: {np.mean(asset_b_returns):.6f}")

提示词

用 numpy 和 scipy.stats 做假设检验:模拟两资产收益,分别用 ttest_1samp 检验 A 均值是否为零,用 ttest_ind 比较 A 和 B 差异。

如果单样本检验的 p 值低于0.05,我们将在5%显著性水平下拒绝原假设——即资产A的均值收益为零。

P 值不能告诉你的事

美国统计协会(ASA)2016年关于 p 值的声明(Wasserstein and Lazar, 2016)强调了常见的误解。p 值不能告诉你:

  • 给定数据后,H0H_0 为真的概率。那需要贝叶斯推理——计算 P(H0∣data)P(H_0 | \text{data}),而不是 P(data∣H0)P(\text{data} | H_0)。
  • 效应的大小。具有统计显著性的结果在经济上可能微不足道,如果效应量很小的话。
  • 发现的实际重要性。统计显著性和实际重要性是两码事。
  • 结果是否可复现。统计功效不足的研究中的小 p 值通常不可复现。

这就是为什么量化研究人员应该始终报告效应量、置信区间(我们下一篇文章会介绍)以及发现的背景——而不只是”p < 0.05”。

参考文献

Moore, D. S. and McCabe, G. P. Introduction to the Practice of Statistics, Chapters 6–7. Freeman. Wasserstein, R. L. and Lazar, N. A. “The ASA’s Statement on p-Values: Context, Process, and Purpose.” The American Statistician, 2016.