3. 基于相关系数的配对筛选
任务目标
从一组股票的历史日收益率序列中,计算所有股票两两之间的Pearson相关系数,筛选出相关系数高于指定阈值(如0.85)的股票对,作为统计套利策略的候选配对池。
数据准备
本案例使用yfinance获取5只美股(AAPL、MSFT、GOOGL、AMZN、JPM)近1年的日收盘价,计算日收益率后构建收益率矩阵。若网络不可用,可替换为本地CSV数据,只需保证数据格式为“日期索引、每列一只股票的收益率”即可。
完整代码
import yfinance as yf
import pandas as pd
import numpy as np
from itertools import combinations
# 1. 下载数据并计算日收益率
tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'JPM']
data = yf.download(tickers, start='2024-01-01', end='2025-01-01')['Close']
returns = data.pct_change().dropna()
# 2. 计算相关系数矩阵
corr_matrix = returns.corr()
# 3. 筛选高相关股票对
threshold = 0.85
pairs = []
for stock1, stock2 in combinations(corr_matrix.columns, 2):
r = corr_matrix.loc[stock1, stock2]
if abs(r) > threshold:
pairs.append((stock1, stock2, round(r, 4)))
# 4. 输出结果
print("相关系数矩阵:")
print(corr_matrix.round(4))
print(f"\n相关系数值 > {threshold} 的候选配对:")
for s1, s2, r in pairs:
print(f"{s1} - {s2}: {r}")
运行方式
- 安装依赖:
pip install yfinance pandas numpy - 直接运行脚本,控制台将打印相关系数矩阵和筛选出的配对列表。
验证方法
观察输出结果:
- 相关系数矩阵应为5×5对称矩阵,对角线为1.0;
- 候选配对中的每一对,其相关系数值应严格大于0.85;
- 若某对股票(如MSFT与GOOGL)相关性极高,应出现在候选列表中;若JPM与科技股相关性较低,则不应被选中。
判定通过条件:程序无异常退出,且输出的所有配对均满足阈值条件,矩阵数值与returns.corr()计算结果一致。
预期输出示例
相关系数矩阵:
AAPL MSFT GOOGL AMZN JPM
AAPL 1.0000 0.8123 0.7456 0.7891 0.4234
MSFT 0.8123 1.0000 0.8912 0.8345 0.3876
GOOGL 0.7456 0.8912 1.0000 0.8123 0.3567
AMZN 0.7891 0.8345 0.8123 1.0000 0.4123
JPM 0.4234 0.3876 0.3567 0.4123 1.0000
相关系数值 > 0.85 的候选配对:
MSFT - GOOGL: 0.8912
注:以上为基于模拟数据的示例输出,实际数值取决于下载的行情数据。
常见问题
- 数据缺失:若某只股票停牌导致NaN,
pct_change().dropna()会删除该行,可能减少样本量。可改用returns.fillna(0)或向前填充处理。 - 阈值选择:0.85为经验值,实际应用中可结合行业板块或聚类结果调整,避免同一行业内过多冗余配对。
- 负相关处理:统计套利通常关注正相关配对,但代码中使用
abs()同时保留强负相关对(如对冲组合),若仅需正相关,去掉abs()即可。