关于 pair-trade-screener
pair-trade-screener 是用于发现和评估统计套利配对的 Python 技能。它通过相关性和协整检验筛选股票,并分析价差信号、对冲比率与风险指标。
主要功能
- 01按行业或自选股票列表筛选
- 02相关性与协整检验
- 03价差 Z 分数和均值回归分析
- 04入场、退出及止损阈值
- 05对冲比率与头寸规模计算
- 06输出 JSON 配对结果和分析报告
适用场景
- 01筛选某个行业的候选交易配对
- 02检验两只股票是否存在协整关系
- 03评估价差偏离和潜在交易信号
- 04估算市场中性仓位的对冲规模
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ tradermonty/ claude-trading-skills --skill pair-trade-screener安装后在 Claude Code 中输入/pair-trade-screener确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdrequirements.txtreferences/cointegration_guide.mdmethodology.mdscripts/analyze_spread.pyfind_pairs.pystatsmodels_support.pyscripts/tests/conftest.pytest_find_pairs_screener.pytest_pair_statistics_and_cli.pytest_pair_trade_coverage.py详细介绍
配对交易筛选器
概述
此技能通过配对交易识别并分析统计套利机会。配对交易是一种市场中性策略,无论整体市场走向如何,都能从两种相关证券的相对价格变动中获利。此技能采用严谨的统计方法,包括相关性分析和协整检验,寻找稳健的交易配对。
核心方法:
- 识别相关性高且行业或板块敞口相似的股票配对
- 检验协整关系(长期统计关系)
- 计算价差 z 分数,以识别均值回归机会
- 根据统计阈值生成入场和离场信号
- 提供市场中性敞口的头寸规模
主要优势:
- 市场中性:在上涨、下跌或横盘市场中均可获利
- 风险管理:降低对广泛市场波动的敞口
- 统计依据:以数据为基础,而非凭主观判断
- 多元化:与传统仅做多策略的相关性低
何时使用此技能
在以下情况下使用此技能:
- 用户询问“配对交易机会”
- 用户想要“市场中性策略”
- 用户请求“统计套利筛选”
- 用户询问“哪些股票走势同步?”
- 用户想对冲行业敞口
- 用户请求均值回归交易思路
- 用户询问相对价值交易
用户请求示例:
- “寻找科技板块的配对交易机会”
- “哪些股票存在协整关系?”
- “筛选统计套利机会”
- “寻找均值回归配对”
- “目前有哪些不错的市场中性交易?”
前提条件
- Python 3.9 或更高版本
- 可访问公司筛选器和历史价格端点的 FMP API 密钥
- 用于 ADF 和自回归计算的
statsmodels>=0.14,<0.15
设置 API 密钥时,不要将其放在命令行中或提交到文件中:
export FMP_API_KEY="<fmp-api-key>"
从仓库根目录运行脚本,并将统计依赖项限定在该命令中:
uv run --with 'statsmodels>=0.14,<0.15' python \
skills/pair-trade-screener/scripts/find_pairs.py \
--symbols AAPL,MSFT \
--output /tmp/pair-trade/pairs.json
分析工作流
第 1 步:定义配对范围
目标: 确定用于分析配对关系的股票范围。
选项 A:按板块筛选(推荐)
选择要筛选的特定板块:
- 科技
- 金融
- 医疗保健
- 非必需消费品
- 工业
- 能源
- 原材料
- 必需消费品
- 公用事业
- 房地产
- 通信服务
选项 B:自定义股票列表
用户提供要分析的特定股票代码:
Example: ["AAPL", "MSFT", "GOOGL", "META", "NVDA"]
选项 C:按行业筛选
将范围缩小至某个板块内的特定行业:
- 示例:科技板块中的“软件”
- 示例:金融板块中的“区域性银行”
筛选条件:
- 最低市值:$2B(中盘股及以上)
- 最低平均成交量:每天 1M 股(流动性要求)
- 正常交易:不包含已退市或已停止交易的股票
- 优先选择同一交易所:避免跨交易所带来的复杂情况
第 2 步:获取历史价格数据
目标: 获取用于相关性和协整分析的历史价格数据。
数据要求:
- 时间范围:2 年(至少 252 个交易日)
- 频率:每日收盘价
- 调整:根据拆股和股息进行调整
- 数据完整:无间断或缺失值
FMP API 端点:
GET /v3/historical-price-full/{symbol}?apikey=YOUR_API_KEY
数据验证:
- 确认所有代码的日期范围一致
- 移除缺失数据超过 10% 的股票
- 使用向前填充法填补少量缺失数据
- 记录数据质量问题
脚本执行:
uv run --with 'statsmodels>=0.14,<0.15' python \
skills/pair-trade-screener/scripts/find_pairs.py \
--sector Technology \
--lookback-days 730 \
--output /tmp/pair-trade/technology.json
第 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
相关性稳定性检查:
- 在多个时间段(6 个月、1 年、2 年)计算相关性
- 要求相关性保持稳定(未恶化)
- 标记近期相关性比历史相关性低逾 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),其 β 系数为 β:
等额美元敞口:
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
输出
find_pairs.py 会创建请求的父目录,并写入一个包含 metadata 和 pairs 键的 JSON 对象。每个配对都包含相关系数、对冲比率、ADF 结果、半衰期、当前 Z 分数、信号和生成时间戳。进度和排序后的摘要会写入 stdout。发生文件系统错误时,会输出简洁的 stderr 错误消息并以非零状态退出。
analyze_spread.py 会将单个配对的统计报告写入 stdout,不会创建文件。两条命令都会在发起 API 请求前拒绝无效或非有限的阈值、不足的回溯窗口以及重复的股票代码。缺少 statsmodels 时,会在 stderr 中输出安装命令,不会显示回溯信息。
质量标准
统计严谨性
有效配对的最低要求:
- ✓ 2 年期间内相关性 ≥ 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
uv run --with 'statsmodels>=0.14,<0.15' python \
skills/pair-trade-screener/scripts/find_pairs.py \
--sector Technology \
--min-correlation 0.70 \
--output /tmp/pair-trade/technology.json
# Custom stock list
uv run --with 'statsmodels>=0.14,<0.15' python \
skills/pair-trade-screener/scripts/find_pairs.py \
--symbols AAPL,MSFT,GOOGL,META \
--min-correlation 0.75 \
--output /tmp/pair-trade/custom.json
# Full options
uv run --with 'statsmodels>=0.14,<0.15' python \
skills/pair-trade-screener/scripts/find_pairs.py \
--sector Financials \
--min-correlation 0.70 \
--min-market-cap 2000000000 \
--lookback-days 730 \
--output /tmp/pair-trade/financials.json
参数:
--sector:行业名称(Technology、Financials 等)--symbols:以逗号分隔的股票代码列表(用于替代行业)--min-correlation:最低相关性阈值(默认值:0.70)--min-market-cap:最低市值筛选条件(默认值:$2B)--lookback-days:历史数据周期(默认值:730 天)--output:输出 JSON 文件(默认值:pair_analysis.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
uv run --with 'statsmodels>=0.14,<0.15' python \
skills/pair-trade-screener/scripts/analyze_spread.py \
--stock-a AAPL \
--stock-b MSFT
# Custom lookback period
uv run --with 'statsmodels>=0.14,<0.15' python \
skills/pair-trade-screener/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 识别轮动中的行业
- 筛选表现优异行业中的配对
- 领先行业中的配对可能具有更强趋势
技术分析师集成:
- 结合个股技术指标确认配对入场/离场
- 入场前检查支撑位/阻力位
- 验证趋势方向是否与价差信号一致
回测专家集成:
- 将配对候选交给 Backtest Expert 验证
- 测试历史 Z-score 入场/离场规则
- 优化阈值参数(入场 Z-score、止损)
- 通过滚动前推分析检验稳健性
市场环境分析集成:
- 极端波动期间避免配对交易(VIX > 30)
- 危机期间相关性会减弱
- 倾向于在横盘/区间震荡市场中进行配对交易
投资组合经理集成:
- 跟踪多个配对仓位
- 监控整体市场中性敞口
- 计算投资组合层面的配对交易盈亏
- 定期重新平衡对冲比率
重要说明
- 所有分析和输出均使用英语
- 统计基础: 不进行主观解读
- 专注市场中性: 尽量减少方向性 Beta 敞口
- 数据质量至关重要: 输入垃圾,输出也会是垃圾
- 需要 FMP API 密钥: 免费套餐足以进行基础筛选
- Python 依赖项: pandas、numpy、scipy、requests 和
statsmodels>=0.14,<0.15
常见用例
用例 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 次请求
- 升级:建议频繁筛选时使用 Professional 套餐($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)-“协整与误差修正”
版本:1.0 最后更新:2025-11-08 依赖项:Python 3.8+、pandas、numpy、scipy、statsmodels、requests