mcpField
P
pair-trade-screener

pair-trade-screener

github.com/tradermonty其他3.4k3.5k 次安装2 天前更新
代码仓库

关于 pair-trade-screener

pair-trade-screener 是用于发现和评估统计套利配对的 Python 技能。它通过相关性和协整检验筛选股票,并分析价差信号、对冲比率与风险指标。

主要功能

  1. 01按行业或自选股票列表筛选
  2. 02相关性与协整检验
  3. 03价差 Z 分数和均值回归分析
  4. 04入场、退出及止损阈值
  5. 05对冲比率与头寸规模计算
  6. 06输出 JSON 配对结果和分析报告

适用场景

  1. 01筛选某个行业的候选交易配对
  2. 02检验两只股票是否存在协整关系
  3. 03评估价差偏离和潜在交易信号
  4. 04估算市场中性仓位的对冲规模

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tradermonty/claude-trading-skills --skill pair-trade-screener

安装后在 Claude Code 中输入/pair-trade-screener确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
requirements.txt
references/
cointegration_guide.md
methodology.md
scripts/
analyze_spread.py
find_pairs.py
statsmodels_support.py
scripts/tests/
conftest.py
test_find_pairs_screener.py
test_pair_statistics_and_cli.py
test_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):

  1. 计算 Pearson 相关系数(ρ)
  2. 计算滚动相关性(90 天窗口),用于稳定性检查
  3. 筛选 ρ >= 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)检验:

对于每一组相关配对:

  1. 计算价差:Spread = Price_A - (Beta × Price_B)
  2. 对价差序列运行 ADF 检验
  3. 检查 p 值:p < 0.05 表示存在协整(拒绝单位根的原假设)
  4. 提取 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 报告。

报告章节:

  1. 执行摘要

    • 分析的配对总数
    • 发现的协整配对数
    • 按统计强度排序的前 5 个机会
  2. 协整配对表

    • 配对名称(股票 A / 股票 B)
    • 相关系数
    • 协整 p 值
    • 当前 Z 分数
    • 交易信号(做多/做空/无)
    • 半衰期
  3. 详细分析(前 10 对配对)

    • 配对说明
    • 统计指标
    • 当前价差位置
    • 入场/离场建议
    • 头寸规模
    • 风险评估
  4. 价差图表(文本形式)

    • 历史 Z 分数图(ASCII 艺术图)
    • 标出入场/离场水平
    • 当前头寸指示器
  5. 风险警告

    • 相关性正在减弱的配对
    • 检测到的结构性断点
    • 流动性不足警告

文件命名约定:

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/月)

资源


版本:1.0 最后更新:2025-11-08 依赖项:Python 3.8+、pandas、numpy、scipy、statsmodels、requests

评论

支持 Markdown