关于 pair-trade-screener
面向统计套利分析的配对交易筛选技能,通过相关性和协整检验寻找股票配对,并评估价差回归机会。可从行业或自定义股票列表出发,生成交易信号、仓位建议和风险分析。
主要功能
- 01相关性与滚动稳定性分析
- 02ADF 协整检验
- 03价差及 Z 分数计算
- 04均值回归信号生成
- 05仓位管理与风险评估
- 06配对分析报告
适用场景
- 01筛选行业内的配对交易候选
- 02检验自选股票是否协整
- 03评估价差偏离与交易信号
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ nicepkg/ ai-workflow --skill pair-trade-screener安装后在 Claude Code 中输入/pair-trade-screener确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdreferences/cointegration_guide.mdmethodology.mdscripts/analyze_spread.pyfind_pairs.py详细介绍
配对交易筛选器
概述
此技能通过配对交易识别并分析统计套利机会。配对交易是一种市场中性策略,无论整体市场走势如何,都能通过两种相关证券的相对价格变动获利。此技能采用严谨的统计方法,包括相关性分析和协整检验,以寻找稳健的交易对。
核心方法:
- 识别相关性高且行业或板块敞口相似的股票对
- 检验协整关系(长期统计关系)
- 计算价差 z 分数,以识别均值回归机会
- 根据统计阈值生成入场和离场信号
- 提供市场中性敞口的仓位规模建议
主要优势:
- 市场中性:在上涨、下跌或横盘市场中均可获利
- 风险管理:降低对整体市场波动的敞口
- 统计依据:基于数据,而非主观判断
- 分散投资:与传统只做多策略不相关
何时使用此技能
在以下情况下使用此技能:
- 用户询问“配对交易机会”
- 用户希望了解“市场中性策略”
- 用户请求“统计套利筛选”
- 用户询问“哪些股票走势同步?”
- 用户希望对冲板块敞口
- 用户请求均值回归交易思路
- 用户询问相对价值交易
用户请求示例:
- “寻找科技板块的配对交易机会”
- “哪些股票存在协整关系?”
- “筛选统计套利机会”
- “寻找均值回归交易对”
- “目前有哪些不错的市场中性交易?”
分析工作流
步骤 1:确定交易对范围
目标: 确定用于分析配对关系的股票范围。
选项 A:按板块筛选(推荐)
选择要筛选的特定板块:
- 科技
- 金融
- 医疗保健
- 非必需消费品
- 工业
- 能源
- 原材料
- 必需消费品
- 公用事业
- 房地产
- 通信服务
选项 B:自定义股票列表
用户提供要分析的特定代码:
Example: ["AAPL", "MSFT", "GOOGL", "META", "NVDA"]
选项 C:按行业筛选
将范围缩小到板块内的特定行业:
- 示例:科技板块中的“软件”
- 示例:金融板块中的“区域性银行”
筛选标准:
- 最低市值:20 亿美元(中盘股及以上)
- 最低平均成交量:每日 100 万股(流动性要求)
- 交易活跃:不包含已退市或不活跃的股票
- 优先选择同一交易所:避免跨交易所带来的复杂情况
步骤 2:获取历史价格数据
目标: 获取价格历史数据,用于相关性和协整分析。
数据要求:
- 时间范围: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
第 3 步:计算相关性和 Beta
目标: 找出线性关系强劲的候选组合。
相关性分析:
对于股票池中的每对股票(i,j):
- 计算 Pearson 相关系数(ρ)
- 计算滚动相关性(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
相关性稳定性检查:
- 计算多个周期(6mo、1yr、2yr)的相关性
- 要求相关性保持稳定(未恶化)
- 标记近期相关性比历史相关性低超过 0.15 的组合
第 4 步:协整检验
目标: 通过统计方法验证长期均衡关系。
协整的重要性:
- 相关性衡量短期共同变动
- 协整证明存在长期均衡关系
- 协整组合具有可预测的均值回归特征
- 非协整组合可能永久背离
增广 Dickey-Fuller(ADF)检验:
对于每个相关的组合:
- 计算价差:
Spread = Price_A - (Beta × Price_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:相对于 B,股票 A 价格偏高(做空 A,做多 B)
- Z > +1.5:价格中度偏高(关注入场机会)
- Z -1.5 到 +1.5:正常范围(不交易)
- Z < -1.5:价格中度偏低(关注入场机会)
- Z < -2.0:相对于 B,股票 A 价格偏低(做多 A,做空 B)
历史价差分析:
- 使用 90 天滚动窗口计算均值和标准差
- 绘制历史 Z 分数分布
- 找出历史 Z 分数偏离的最大值
- 检查是否存在结构性断点(价差状态发生变化)
第 6 步:生成入场/离场建议
目标: 提供明确规则和可执行的交易信号。
入场条件:
保守策略(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),β 为其 beta:
等额敞口:
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-score > ±3.0,或价差亏损 5%
- 投资组合层面的风险:所有组的风险总和 ≤ 10%
第 8 步:生成配对分析报告
**目标:**创建包含分析结果和建议的结构化 Markdown 报告。
报告章节:
-
执行摘要
- 分析的股票组总数
- 发现的协整股票组数量
- 按统计强度排名的前 5 个机会
-
协整股票组表格
- 股票组名称(股票 A / 股票 B)
- 相关系数
- 协整 p 值
- 当前 z-score
- 交易信号(做多/做空/无)
- 半衰期
-
详细分析(前 10 组)
- 股票组描述
- 统计指标
- 当前价差仓位
- 入场/退出建议
- 仓位规模
- 风险评估
-
价差图表(基于文本)
- 历史 z-score 图(ASCII 艺术图)
- 标注入场/退出水平
- 当前仓位指示器
-
风险警告
- 相关性恶化的股票组
- 检测到的结构性断点
- 流动性不足警告
文件命名约定:
pair_trade_analysis_[SECTOR]_[YYYY-MM-DD].md
示例:pair_trade_analysis_Technology_2025-11-08.md
质量标准
统计严谨性
有效股票组的最低要求:
- ✓ 2 年期间的相关性 ≥ 0.70
- ✓ 协整 p 值 < 0.05(ADF 检验)
- ✓ 确认价差平稳性
- ✓ 半衰期 < 90 天
- ✓ 近期 6 个月内无结构性断点
危险信号(排除该组):
- 近期 6 个月的相关性下降 >0.20
- 协整 p 值 > 0.05
- 半衰期随时间延长(均值回归减弱)
- 重大公司事件(合并、分拆、破产风险)
- 流动性问题(日均成交量 < 500K 股)
实际注意事项
交易成本:
- 假设每条腿的往返交易成本为 0.1%
- 每组总成本 = 0.4%(入场 + 退出,双腿)
- 最低 z-score 阈值应高于交易成本
卖空:
- 确认股票可卖空(非难以借入)
- 将卖空利息成本(借券费用)纳入考量
- 监控逼空风险
执行:
- 同时进入/退出双腿(避免单腿风险)
- 使用限价单控制滑点
- 入场前预先落实借券
可用脚本
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:行业名称(Technology、Financials 等)--symbols:以逗号分隔的股票代码列表(可替代行业)--min-correlation:最低相关性阈值(默认:0.70)--min-market-cap:最低市值筛选条件(默认:$2B)--lookback-days:历史数据周期(默认:730 天)--output:输出 JSON 文件(默认:stdout)--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-score 阈值(默认:2.0)--exit-zscore:退出的 Z-score 阈值(默认:0.0)--api-key:FMP API 密钥
输出:
- 当前价差分析
- Z-score 计算结果
- 入场/退出建议
- 仓位规模
- 历史 z-score 图表(文本)
参考文档
references/methodology.md
统计套利与配对交易综合指南:
- 配对筛选标准:如何识别优质的配对候选对象
- 统计检验:相关性、协整、平稳性
- 价差构建:价格差值与价格比率方法
- 均值回归:半衰期的计算与解读
- 风险管理:头寸规模、止损、分散投资
- 常见陷阱:幸存者偏差、前视偏差、过度拟合
references/cointegration_guide.md
协整检验深入指南:
- 什么是协整?:直观解释
- ADF 检验:分步流程
- P 值解读:统计显著性阈值
- 半衰期估算:AR(1) 模型方法
- 结构突变:检验市场状态变化
- 实际示例:真实配对案例研究
与其他技能集成
Sector Analyst 集成:
- 使用 Sector Analyst 识别正在轮动的行业
- 在表现优异的行业中筛选配对
- 领先行业中的配对可能呈现更强趋势
Technical Analyst 集成:
- 使用个股技术指标确认配对的入场/出场时机
- 入场前检查支撑位/阻力位
- 确认趋势方向与价差信号一致
Backtest Expert 集成:
- 将配对候选对象交给 Backtest Expert 进行验证
- 测试历史 Z 分数入场/出场规则
- 优化阈值参数(入场 Z 分数、止损)
- 使用滚动前推分析检验稳健性
Market Environment Analysis 集成:
- 极端波动期间(VIX > 30)避免配对交易
- 危机期间相关性会减弱
- 优先在横盘/区间震荡市场中进行配对交易
Portfolio Manager 集成:
- 跟踪多个配对头寸
- 监控整体市场中性敞口
- 计算投资组合层面的配对交易盈亏
- 定期重新平衡对冲比率
重要说明
- 所有分析和输出均使用英语
- 统计基础:不进行主观解读
- 聚焦市场中性:尽量降低方向性贝塔敞口
- 数据质量至关重要:输入垃圾,输出也会是垃圾
- 需要 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 年历史数据时,每个代码约需 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
- 协整论文:Engle & Granger(1987)—“Co-Integration and Error Correction”
版本:1.0 最后更新:2025-11-08 依赖项:Python 3.8+、pandas、numpy、scipy、statsmodels、requests