跳到主内容
研究主线统计检验与研究可信度 · 第20–23讲3/4 · 配套练习模块导览 →
练习

第22讲:p值挖掘与多重比较偏差 (p-Hacking and Multiple Comparisons Bias) · 练习

遍历股票对并计算相关检验,手工核对比较次数与校正阈值,再设计训练期和验证期分离方案。

← 返回本讲讲义
完成状态保存在当前浏览器,可随时取消。

股票数据多重检验分析#

任务背景:某量化研究员选取2020-2022年期间15只科技股日度收益率数据,试图寻找存在显著相关性的股票对(使用Spearman相关系数)。原始数据获取与处理代码如下:

code
import numpy as np
import pandas as pd
import yfinance as yf
from scipy import stats

# 股票代码列表
tech_stocks = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'META',
               'TSLA', 'NVDA', 'INTC', 'ADBE', 'CSCO',
               'ORCL', 'IBM', 'QCOM', 'CRM', 'AMD']

# 获取收盘价数据
price_data = yf.download(tech_stocks,
                        start='2020-01-01',
                        end='2022-12-31')['Close']

# 计算日收益率
returns = price_data.pct_change().dropna()

分析要求

  1. 遍历所有可能的股票组合(共105对),计算其收益率相关系数的 p 值

  2. 分别记录使用原始α=0.05和Bonferroni校正后的显著相关对数量

  3. 输出格式要求:打印两种方法发现的显著对数及预期假阳性数

代码框架

code
def multiple_comparison_analysis():
    # 初始化参数
    alpha = 0.05
    combinations = len(tech_stocks)*(len(tech_stocks)-1)//2

    # 原始检验
    original_pairs = []
    # Bonferroni检验
    bonferroni_pairs = []

    # 在此处补充你的代码逻辑

    # 输出结果
    print(f"原始方法显著对数:{len(original_pairs)}")
    print(f"预期假阳性数:{round(combinations * alpha, 1)}")
    print(f"校正后显著对数:{len(bonferroni_pairs)}")

理论计算与方案设计#

问题场景:某对冲基金构建了包含200只股票的投资组合,研究团队每日进行以下分析:

  • 对所有股票两两做相关性检验(Spearman)

  • 对每只股票进行30个技术指标的预测能力检验(t 检验)

任务要求

  1. 计算每日进行统计检验的总次数

  2. 当设定全局α=0.05时,计算未校正的预期每日假阳性数

  3. 若采用Bonferroni校正,计算单个检验的显著性阈值

  4. 设计一个两阶段验证方案:

    • 第一阶段用2020-2021年数据筛选潜在信号

    • 第二阶段用2022年数据验证

数据准备

code
# 两阶段数据集划分
full_data = yf.download('SPY',
                       start='2020-01-01',
                       end='2022-12-31')['Close']
stage1 = full_data.loc[:'2021-12-31']
stage2 = full_data.loc['2022-01-01':]

提示公式

  • 组合检验次数:N(N1)2\frac{N(N-1)}{2}

  • 技术指标检验次数:M×NM×N

  • Bonferroni阈值:αnew=αTotal Tests\alpha_{new} = \frac{\alpha}{Total\ Tests}

请分别给出数学计算过程与Python实现代码。

完成练习后,自评一次

建议先独立作答,再展开参考答案进行核对。