查看全集:💎Quantopia量化分析56讲
当我们在同一数据集上进行多次统计检验时,偶然得到显著性结果的概率会大大增加,这就是多重比较偏差的概念。这种现象就像买彩票——买的次数越多,中奖几率越大,但大部分中奖结果只是运气。
生活案例:同时服用多种感冒药,恰巧症状好转时,可能错误归因于某药物有效,而实际是病程自然结束。
# 正确使用p值的示例
cutoff = 0.05
p_value = 0.03 # 假设的检验结果
if p_value < cutoff:
print("拒绝原假设")
else:
print("未能拒绝原假设")
import numpy as np
import pandas as pd
import scipy.stats as stats
N = 20 # 20个独立时间序列
T = 100 # 每个序列100个观测点
df = pd.DataFrame({f'X{i}': np.random.normal(0, 1, T) for i in range(N)})
significant_pairs = []
cutoff = 0.05
for i in range(N):
for j in range(i+1, N):
_, p = stats.spearmanr(df[f'X{i}'], df[f'X{j}'])
if p < cutoff:
significant_pairs.append((i, j))
print(f"发现显著相关对数量:{len(significant_pairs)}")
多重比较中预期假阳性(Expected False Positives)的计算公式:
其中:
expected_fp = (20*19/2) * 0.05 # 输出9.5
将显著性水平调整为:
这是Bonferroni校正的计算公式,其中:
total_tests = 20*19//2
new_cutoff = 0.05 / total_tests # 0.000263
corrected_pairs = []
for i in range(N):
for j in range(i+1, N):
_, p = stats.spearmanr(df[f'X{i}'], df[f'X{j}'])
if p < new_cutoff:
corrected_pairs.append((i, j))
print(f"校正后显著对数量:{len(corrected_pairs)}")
方法 | 优点 | 缺点 |
不做校正 | 灵敏度高 | 假阳性率高 |
Bonferroni | 控制总体错误率 | 过于保守 |
分阶段验证 | 平衡灵敏度特异性 | 需要额外数据 |
import yfinance as yf
# 获取10只科技股数据
symbols = ['AAPL', 'MSFT', 'GOOG', 'AMZN', 'META',
'TSLA', 'NVDA', 'INTC', 'ADBE', 'CSCO']
data = yf.download(symbols, start='2020-01-01', end='2023-01-01')['Close']
significant_pairs = []
cutoff = 0.05
for i in range(len(symbols)):
for j in range(i+1, len(symbols)):
stock1 = data[symbols[i]].pct_change().dropna()
stock2 = data[symbols[j]].pct_change().dropna()
_, p = stats.spearmanr(stock1, stock2)
if p < cutoff:
significant_pairs.append((symbols[i], symbols[j]))
print(f"发现显著相关股票对:{significant_pairs}")
通过系统理解这些原理并应用防御策略,研究者可以显著提升分析的可靠性。记住:真正的发现应该经得起时间和新数据的考验。