mcpField
P
pair-trade-screener

pair-trade-screener

github.com/mphinance数据与数据库3288 次安装5 天前更新
代码仓库

关于 pair-trade-screener

pair-trade-screener 是用于寻找统计套利配对交易机会的分析技能,面向研究市场中性策略的股票交易者。它结合相关性、协整检验和价差 z 分数来评估配对及交易信号。

主要功能

  1. 01按行业或自选股票筛选配对
  2. 02计算相关性与对冲 Beta
  3. 03使用 ADF 检验协整关系
  4. 04计算价差 z 分数与半衰期
  5. 05生成进出场信号和仓位建议
  6. 06输出配对分析报告

适用场景

  1. 01筛选科技等行业的配对交易机会
  2. 02分析两只股票是否存在均值回归关系
  3. 03评估配对的入场、退出与风险
  4. 04构建市场中性的相对价值策略

安装

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

$npx skills add https://github.com/mphinance/alpha-skills --skill pair-trade-screener

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

包含的文件

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

README.md
references/
cointegration_guide.md
methodology.md
scripts/
analyze_spread.py
find_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):

  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

相关性稳定性检查:

  • 计算多个周期(6mo、1yr、2yr)的相关性
  • 要求相关性保持稳定(未恶化)
  • 标记近期相关性比历史相关性低超过 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),β 为其 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 报告。

报告章节:

  1. 执行摘要

    • 分析的股票组总数
    • 发现的协整股票组数量
    • 按统计强度排名的前 5 个机会
  2. 协整股票组表格

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

    • 股票组描述
    • 统计指标
    • 当前价差仓位
    • 入场/退出建议
    • 仓位规模
    • 风险评估
  4. 价差图表(基于文本)

    • 历史 z-score 图(ASCII 艺术图)
    • 标注入场/退出水平
    • 当前仓位指示器
  5. 风险警告

    • 相关性恶化的股票组
    • 检测到的结构性断点
    • 流动性不足警告

文件命名约定:

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

资源


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

评论

支持 Markdown