Pair Trade Screener
配对交易筛选器
概述
本功能通过配对交易识别并分析统计套利机会。配对交易是一种市场中性策略,通过利用两种相关证券的相对价格变动获利,而不受整体市场方向的影响。该功能采用严谨的统计方法,包括相关性分析和协整检验,以寻找稳健的交易配对。
核心方法:

- 识别具有高相关性且属于相似行业/板块的股票配对
- 进行协整检验(长期统计关系)
- 计算价差Z分数以识别均值回归机会
- 基于统计阈值生成入场/出场信号
- 为市场中性敞口提供头寸规模建议
主要优势:
- 市场中性:在上涨、下跌或横盘市场中均可获利
- 风险管理:对整体市场波动的敞口有限
- 统计基础:数据驱动,非主观判断
- 分散化:与传统纯多头策略不相关
何时使用本功能
在以下情况使用此技能:
- 用户询问"配对交易机会"
- 用户需要"市场中性策略"
- 用户请求"统计套利筛选"
- 用户询问"哪些股票走势同步?"
- 用户希望对冲行业风险敞口
- 用户请求均值回归交易思路
- 用户询问相对价值交易
用户请求示例:
- "寻找科技行业的配对交易机会"
- "哪些股票具有协整关系?"
- "筛选统计套利机会"
- "寻找均值回归配对"
- "当前有哪些优质的市场中性交易?"
分析工作流程
步骤1:定义配对分析范围
目标:建立用于分析配对关系的股票池
方案A:基于行业的筛选(推荐)
选择特定行业进行筛选:
- 科技
- 金融
- 医疗保健
- 非必需消费品
- 工业
- 能源
- 材料
- 必需消费品
- 公用事业
- 房地产
- 通信服务
选项B:自定义股票列表
用户提供具体股票代码进行分析:
Example: ["AAPL", "MSFT", "GOOGL", "META", "NVDA"]
选项C:行业特定
聚焦于板块内的特定行业:
- 例如:科技板块内的“软件”
- 例如:金融板块内的“区域性银行”
筛选标准:
- 最低市值:20亿美元(中盘股及以上)
- 最低平均成交量:每日100万股(流动性要求)
- 活跃交易:排除已退市或不活跃的股票
- 相同交易所偏好:避免跨交易所的复杂情况
步骤二:获取历史价格数据
目标:获取价格历史数据,用于相关性和协整分析。
数据要求:
- 时间范围:2年(至少252个交易日)
- 频率:每日收盘价
- 调整:已根据拆股和股息进行调整
- 数据清洁:无间隔或缺失值
FMP API端点:
GET /v3/historical-price-full/{symbol}?apikey=YOUR_API_KEY
数据验证:
- 验证所有股票代码的日期范围是否一致
- 移除缺失数据超过10%的股票
- 使用前向填充法填补微小间隔
- 记录数据质量问题
脚本执行:
python scripts/fetch_price_data.py --sector Technology --lookback 730
步骤三:计算相关性和贝塔值
目标:识别具有强线性关系的候选配对。
相关性分析:
对于股票池中的每一对股票 (i, j):
- 计算皮尔逊相关系数(ρ)
- 计算滚动相关性(90天窗口)以进行稳定性检查
- 筛选出ρ ≥ 0.70(强正相关)的股票对
相关性解释:
- ρ ≥ 0.90:极强相关性(最佳候选对)
- ρ 0.70-0.90:强相关性(良好候选对)
- ρ 0.50-0.70:中等相关性(边缘候选对)
- ρ < 0.50:弱相关性(排除)
Beta值计算:
对于每个候选股票对(股票A,股票B):
Beta = Covariance(A, B) / Variance(B)
Beta值表示对冲比率:
- Beta = 1.0:等额美元金额
- Beta = 1.5:每1.00美元的A对应1.50美元的B
- Beta = 0.8:每1.00美元的A对应0.80美元的B
相关性稳定性检查:
- 计算多个时间段(6个月、1年、2年)的相关性
- 要求相关性保持稳定(没有恶化)
- 标记近期相关性低于历史相关性超过0.15的股票对
步骤四:协整性检验
目标:从统计学上验证长期均衡关系。
协整为何重要:
- 相关性衡量的是短期协同变动
- 协整证明的是长期均衡关系
- 协整的配对具有可预测的均值回归特性
- 非协整的配对可能永久性偏离
增广迪基-富勒(ADF)检验:
对每个相关配对:
- 计算价差:
价差 = 价格_A - (Beta × 价格_B) - 对价差序列进行ADF检验
- 检查p值:p < 0.05 表示存在协整(拒绝单位根的原假设)
- 提取ADF统计量用于强度排序
协整结果解读:
- p值 < 0.01:非常强的协整关系(★★★)
- p值 0.01-0.05:中等强度的协整关系(★★)
- p值 > 0.05:无协整关系(排除)
半衰期计算:
估计均值回归速度:
Half-Life = -log(2) / log(mean_reversion_coefficient)
- 半衰期 < 30 天:快速均值回归(适合短期交易)
- 半衰期 30-60 天:中等速度(标准)
- 半衰期 > 60 天:缓慢均值回归(长期持有期)
Python 实现:
from statsmodels.tsa.stattools import adfuller
# Calculate spread
spread = price_a - (beta * price_b)
# ADF test
result = adfuller(spread)
adf_stat = result[0]
p_value = result[1]
# Interpret
is_cointegrated = p_value < 0.05
步骤 5:价差分析与 Z 分数计算
目标:量化当前价差对均衡状态的偏离程度。
价差计算:
两种常用方法:
方法 1:价格差(加法模型)
Spread = Price_A - (Beta × Price_B)
最佳适用:价格水平相近的股票
方法 2:价格比(乘法模型)
Spread = Price_A / Price_B
最佳适用:价格水平不同的股票,更易于解释
Z 分数计算:
衡量价差偏离其均值的标准差倍数:
Z-Score = (Current_Spread - Mean_Spread) / Std_Dev_Spread
Z 分数解读:
- Z > +2.0:股票 A 相对于 B 价格偏高(做空 A,做多 B)
- Z > +1.5:中度偏贵(关注入场时机)
- Z值介于-1.5至+1.5:正常范围(不进行交易)
- Z < -1.5:中度便宜(关注入场时机)
- Z < -2.0:股票A相对于B显得便宜(做多A,做空B)
历史价差分析:
- 计算90天滚动窗口的均值和标准差
- 绘制历史Z值分布图
- 识别历史最大Z值偏离区间
- 检查结构性断点(价差机制变化)
第六步:生成入场/离场建议
目标:提供具有明确规则的可执行交易信号
入场条件:
保守策略(Z值≥±2.0时):
LONG Signal:
- Z-score < -2.0 (spread 2+ std devs below mean)
- Spread is mean-reverting (cointegration p < 0.05)
- Half-life < 60 days
→ Action: Buy Stock A, Short Stock B (hedge ratio = beta)
SHORT Signal:
- Z-score > +2.0 (spread 2+ std devs above mean)
- Spread is mean-reverting (cointegration p < 0.05)
- Half-life < 60 days
→ Action: Short Stock A, Buy Stock B (hedge ratio = beta)
激进策略(Z值≥±1.5时):
- 降低阈值以增加交易频率
- 更高胜率但单笔平均利润较小
- 需要更严格的风险管理
离场条件:
主要退出条件:均值回归 (Z = 0)
Exit when spread returns to mean (z-score crosses 0)
→ Close both legs simultaneously
次要退出条件:部分获利了结
Exit 50% when z-score reaches ±1.0
Exit remaining 50% at z-score = 0
止损条件:
Exit if z-score extends beyond ±3.0 (extreme divergence)
Risk: Possible structural break in relationship
基于时间的退出条件:
Exit after 90 days if no mean-reversion
Prevents holding broken pairs indefinitely
步骤7:头寸规模与风险管理
目标:确定市场中立敞口的金额。
市场中立规模设定:
对于贝塔系数为 β 的配对(股票A, 股票B):
等额敞口:
If portfolio size = $10,000 allocated to this pair:
- Long $5,000 of Stock A
- Short $5,000 × β of Stock B
Example (β = 1.2):
- Long $5,000 Stock A
- Short $6,000 Stock B
→ Market neutral, beta = 0
头寸规模考量:
- 每对配对分配总额:占投资组合的10-20%
- 最大配对数量:5-8个活跃配对以实现多样化
- 配对间的相关性:避免高度相关的配对
风险指标:
- 每对最大亏损:占总投资组合的2-3%
- 止损触发条件:Z分数 > ±3.0 或价差亏损 -5%
- 投资组合层面风险:所有配对风险总和 ≤ 10%
步骤8:生成配对分析报告
目标:创建一份包含调查结果和建议的结构化Markdown报告。
报告章节:
-
执行摘要
- 分析的总配对数量
- 发现的协整配对数量
- 按统计强度排名的前5个机会
-
协整配对表
- 配对名称 (股票A / 股票B)
- 相关系数
- 协整P值
- 当前Z值
- 交易信号 (做多/做空/无)
- 半衰期
-
详细分析 (前10个配对)
- 配对描述
- 统计指标
- 当前价差位置
- 入场/出场建议
- 仓位规模
- 风险评估
-
价差图表 (基于文本)
- 历史Z值图 (ASCII艺术)
- 入场/出场点位标注
- 当前位置指示器
-
风险警告
- 相关性恶化的配对
- 检测到结构性断点
- 低流动性警告
文件命名规范:
pair_trade_analysis_[SECTOR]_[YYYY-MM-DD].md
示例:pair_trade_analysis_Technology_2025-11-08.md
质量标准
统计严谨性
有效配对的最低要求:
- ✓ 两年期相关性 ≥ 0.70
- ✓ 协整 p 值 < 0.05(ADF 检验)
- ✓ 价差平稳性确认
- ✓ 半衰期 < 90 天
- ✓ 最近 6 个月内无结构性断点
危险信号(排除配对):
- 最近 6 个月相关性下降 >0.20
- 协整 p 值 > 0.05
- 半衰期随时间增加(均值回归减弱)
- 重大公司事件(并购、分拆、破产风险)
- 流动性考量(日均成交量 < 50万股)
实际操作考量
交易成本:
- 假设每边交易来回成本为0.1%
- 每对交易总成本 = 0.4%(双边进入与退出)
- 最小z分数阈值应超过交易成本
卖空操作:
- 确认股票可卖空(非难借券)
- 计入卖空利息成本(融券费用)
- 监控轧空风险
执行策略:
- 同时进行双边建仓/平仓(规避单边风险)
- 使用限价订单控制滑点
- 建仓前预先锁定卖空标的
可用脚本
scripts/find_pairs.py
用途:在行业板块或自定义列表中筛选协整配对。
用法:
# Sector-based screening
python scripts/find_pairs.py --sector Technology --min-correlation 0.70
# Custom stock list
python scripts/find_pairs.py --symbols AAPL,MSFT,GOOGL,META --min-correlation 0.75
# Full options
python scripts/find_pairs.py \
--sector Financials \
--min-correlation 0.70 \
--min-market-cap 2000000000 \
--lookback-days 730 \
--output pairs_analysis.json
参数:
--sector:行业名称(科技、金融等)--symbols:股票代码逗号分隔列表(作为行业的替代选项)--min-correlation:最小相关性阈值(默认值:0.70)--min-market-cap:最低市值筛选条件(默认值:20亿美元)--lookback-days:历史数据周期(默认值:730天)--output:输出JSON文件(默认值:标准输出)--api-key:FMP API密钥(或设置FMP_API_KEY环境变量)
输出:
[
{
"pair": "AAPL/MSFT",
"stock_a": "AAPL",
"stock_b": "MSFT",
"correlation": 0.87,
"beta": 1.15,
"cointegration_pvalue": 0.012,
"adf_statistic": -3.45,
"half_life_days": 42,
"current_zscore": -2.3,
"signal": "LONG",
"strength": "Strong"
}
]
scripts/analyze_spread.py
用途:分析特定配对的价格差行为并生成交易信号。
用法:
# Analyze specific pair
python scripts/analyze_spread.py --stock-a AAPL --stock-b MSFT
# Custom lookback period
python scripts/analyze_spread.py \
--stock-a JPM \
--stock-b BAC \
--lookback-days 365 \
--entry-zscore 2.0 \
--exit-zscore 0.5
参数:
--stock-a第一个股票代码--stock-b: 第二个股票代码--lookback-days: 分析周期(默认值:365)--entry-zscore: 入场Z分数阈值(默认值:2.0)--exit-zscore: 出场Z分数阈值(默认值:0.0)--api-key: FMP API密钥
输出:
- 当前价差分析
- Z分数计算
- 入场/出场建议
- 仓位规模
- 历史Z分数图表(文本形式)
参考文档
references/methodology.md
统计套利与配对交易的全面指南:
- 配对选择标准: 如何识别良好的配对候选
- 统计检验相关性、协整性、平稳性
- 价差构建:价格差法与价格比率法
- 均值回归:半衰期计算与解读
- 风险管理:头寸规模、止损、分散化
- 常见误区:幸存者偏差、前视偏差、过拟合
references/cointegration_guide.md
协整检验深入探讨:
- 什么是协整?:直观解释
- ADF检验:分步流程
- P值解读:统计显著性阈值
- 半衰期估计:AR(1)模型方法
- 结构突变:制度变化检验
- 实践案例包含真实配对案例的研究
与其他技能的结合
板块分析师的整合运用:
- 利用板块分析师识别轮动中的行业板块
- 在表现优异的板块内筛选配对交易组合
- 领先板块中的配对可能呈现更强劲的趋势
技术分析师的整合运用:
- 通过个股技术指标确认配对交易的入场/离场时机
- 入场前核查支撑位/阻力位
- 验证趋势方向是否与价差信号保持一致
回测专家的整合运用:
- 将候选配对提交给回测专家进行验证
- 测试历史Z分数入场/离场规则
- 优化阈值参数(入场Z分数、止损位)
- 通过向前滚动分析确保策略稳健性
市场环境分析的整合运用:
- 极端波动期间(VIX > 30)避免进行配对交易
- 危机时期相关性可能失效
- 更倾向于在横盘/区间震荡市场进行配对交易
投资组合管理器集成:
- 跟踪多个配对持仓
- 监控整体市场中性的风险敞口
- 计算投资组合层面的配对交易损益
- 定期重新平衡对冲比率
重要注意事项
- 所有分析和输出均为英文
- 统计基础:无主观判断性解读
- 市场中性的核心:最小化方向性贝塔风险敞口
- 数据质量至关重要:垃圾进,垃圾出
- 需要FMP API密钥:免费层级足以满足基本筛选需求
- Python依赖库:pandas, numpy, scipy, statsmodels
常见应用场景
应用场景 1:科技行业配对
User: "Find pair trading opportunities in tech stocks"
Workflow:
1. Screen Technology sector for stocks with market cap > $10B
2. Calculate all pairwise correlations
3. Filter pairs with correlation ≥ 0.75
4. Run cointegration tests
5. Identify current z-score extremes (|z| > 2.0)
6. Generate top 10 pairs report
应用场景 2:特定配对分析
User: "Analyze AAPL and MSFT as a pair trade"
Workflow:
1. Fetch 2-year price history for AAPL and MSFT
2. Calculate correlation and beta
3. Test for cointegration
4. Calculate current spread and z-score
5. Generate entry/exit recommendation
6. Provide position sizing guidance
应用场景 3:区域性银行配对
User: "Screen for pairs among regional banks"
Workflow:
1. Filter Financials sector for industry = "Regional Banks"
2. Exclude banks with <$5B market cap
3. Calculate pairwise statistics
4. Rank by cointegration strength
5. Focus on pairs with half-life < 45 days
6. Report top 5 mean-reverting pairs
故障排除
问题:未找到协整配对
解决方案:
- 扩大股票池(降低市值门槛)
- 放宽协整p值至0.10
- 尝试不同板块(公用事业板块通常协整性较好)
- 将回看期延长至3年
问题:所有z值均接近零(无交易信号)
解决方案:
- 市场正常状态(配对处于均衡)
- 稍后重试或扩大股票池
- 将入场阈值从±2.0降低至±1.5
问题:配对相关性失效
解决方案:
- 检查公司事件(财报发布、业绩指引变更)
- 确认无并购活动或重组计划
- 若确认结构性断裂,则从观察列表中移除该配对
- 重新入场前监控30天
API要求
- 必需FMP API密钥(免费版即可)
- 请求频率限制免费版每日约250次请求
- 数据用量估算每个代码获取两年历史数据约需2次请求
- 升级建议高频筛选推荐专业版(29美元/月)
参考资源
- FMP历史价格API:https://site.financialmodelingprep.com/developer/docs/historical-price-full
- 股票筛选器API:https://site.financialmodelingprep.com/developer/docs/stock-screener-api
- Statsmodels文档:https://www.statsmodels.org/stable/index.html
- 协整论文: 恩格尔与格兰杰 (1987) - 《协整与误差修正》
版本信息: 1.0最后更新2025年11月8日依赖项: Python 3.8+、pandas、numpy、scipy、statsmodels、requests


微信扫一扫,打赏作者吧~