ClawSkills logoClawSkills

Pair Trade Screener

用于识别和分析配对交易机会的统计套利工具。检测行业内协整股票对,分析价差行为。

介绍

# Pair Trade Screener

## 概述

该技能通过配对交易识别和分析统计套利机会。配对交易是一种市场中性策略,无论市场整体方向如何,都能从两种相关证券的相对价格变动中获利。该技能使用严谨的统计方法,包括相关分析和协整测试,以寻找稳健的交易对。

**核心方法论:** - 识别具有高相关性和相似行业/板块敞口的股票对 - 测试协整性(长期统计关系) - 计算价差 Z-score 以识别均值回归机会 - 基于统计阈值生成入场/出场信号 - 提供市场中性敞口的仓位规模

**关键优势:** - 市场中性:在上涨、下跌或横盘市场中均能获利 - 风险管理:对广泛市场波动的敞口有限 - 统计基础:数据驱动,而非主观臆断 - 多样化:与传统的只做多策略不相关

## 何时使用此技能

在以下情况使用此技能: - 用户询问“配对交易机会” - 用户想要“市场中性策略” - 用户请求“统计套利筛选” - 用户询问“哪些股票走势同步?” - 用户希望对冲板块敞口 - 用户请求均值回归交易思路 - 用户询问相对价值交易

用户请求示例: - “寻找科技板块的配对交易机会” - “哪些股票具有协整关系?” - “筛选统计套利机会” - “寻找均值回归配对” - “目前有哪些好的市场中性交易?”

## 分析工作流

### 步骤 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% 的股票 - 使用前向填充法填补微小缺口 - 记录数据质量问题

**脚本执行:** ```bash python scripts/fetch_price_data.py --sector Technology --lookback 730 ```

### 步骤 3:计算相关性和 Beta

**目标:** 识别具有强线性关系的候选配对。

**相关性分析:**

对于范围内的每一对股票 (i, j): 1. 计算皮尔逊相关系数 (ρ) 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:协整测试

**目标:** 统计验证长期均衡关系。

**协整为何重要:** - 相关性衡量短期共同变动 - 协整证明长期均衡关系 - 协整合对可预测地均值回归 - 非协整合对可能永久背离

**增强迪基-富勒 (ADF) 检验:**

对于每个相关配对: 1. 计算价差:`Spread = Price_A - (Beta × Price_B)` 2. 对价差序列运行 ADF 检验 3. 检查 p 值:p < 0.05 表示协整(拒绝单位根的原假设) 4. 提取 ADF 统计量用于强度排名

**协整解读:** - p-value < 0.01:非常强协整 (★★★) - p-value 0.01-0.05:中等协整 (★★) - p-value > 0.05:无协整(排除)

**半衰期计算:**

估算均值回归速度: ``` Half-Life = -log(2) / log(mean_reversion_coefficient) ```

- 半衰期 < 30 天:快速均值回归(适合短期交易) - 半衰期 30-60 天:中等速度(标准) - 半衰期 > 60 天:慢速均值回归(长持有期)

**Python 实现:** ```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-Score 计算

**目标:** 量化当前价差偏离均衡的程度。

**价差计算:**

两种常用方法:

**方法 1:价格差(加法)** ``` Spread = Price_A - (Beta × Price_B) ``` 适用于:价格水平相似的股票

**方法 2:价格比(乘法)** ``` Spread = Price_A / Price_B ``` 适用于:价格水平不同的股票,更易解读

**Z-Score 计算:**

衡量价差距离其均值多少个标准差: ``` Z-Score = (Current_Spread - Mean_Spread) / Std_Dev_Spread ```

**Z-Score 解读:** - 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-score 分布 - 识别最大历史 Z-score 偏差 - 检查结构性断裂(价差制度变化)

### 步骤 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:仓位规模和风险管理

**目标:** 确定市场中性敞口的金额。

**市场中性规模:**

对于 beta = β 的配对(股票 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-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 - 半衰期随时间增加(均值回归减弱) - 重大企业事件(合并、分拆、破产风险) - 流动性担忧(平均成交量 < 50 万股/天)

### 实际考量

**交易成本:** - 假设每条腿 0.1% 的往返成本 - 每对总成本 = 0.4%(入场 + 出场,两条腿) - 最小 Z-score 阈值应超过交易成本

**卖空:** - 验证股票可卖空(非难以借入) - 将做空利息成本(借贷费)计入在内 - 监控逼空风险

**执行:** - 同时入场/出场两条腿(避免单腿风险) - 使用限价单控制滑点 - 入场前预先定位做空券源

## 可用脚本

### scripts/find_pairs.py

**用途:** 在板块或自定义列表中筛选协整合对。

**用法:** ```bash # 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`: 逗号分隔的代码列表(sector 的替代选项) - `--min-correlation`: 最小相关性阈值(默认:0.70) - `--min-market-cap`: 最小市值过滤器(默认:$2B) - `--lookback-days`: 历史数据周期(默认:730 天) - `--output`: 输出 JSON 文件(默认:stdout) - `--api-key`: FMP API 密钥(或设置 FMP_API_KEY 环境变量)

**输出:** ```json [ { "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

**用途:** 分析特定配对的价差行为并生成交易信号。

**用法:** ```bash # 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) 模型方法 - **结构性断点**:测试制度变化 - **实际案例**:真实配对案例研究

## 与其他技能的集成

**板块分析师集成:** - 使用板块分析师识别轮动中的板块 - 在表现优异的板块中筛选配对 - 领先板块的配对可能具有更强的趋势

**技术分析师集成:** - 使用个股技术分析确认配对入场/出场 - 入场前检查支撑/阻力位 - 验证趋势方向是否与价差信号一致

**回测专家集成:** - 将配对候选提供给回测专家进行验证 - 测试历史 Z-score 入场/出场规则 - 优化阈值参数(入场 Z-score、止损) - 进行前向分析以检验稳健性

**市场环境分析集成:** - 避免在极端波动期间进行配对交易(VIX > 30) - 相关性在危机期间会失效 - 最好在横盘/震荡市场中进行配对交易

**投资组合经理集成:** - 跟踪多个配对头寸 - 监控整体市场中性敞口 - 计算投资组合层面的配对交易盈亏 - 定期重新平衡对冲比率

## 重要说明

- **所有分析和输出均使用英语** - **统计基础**:无主观解读 - **专注市场中性**:最小化方向性 Beta 敞口 - **数据质量至关重要**:垃圾进,垃圾出 - **需要 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-score 均接近零(无交易信号)**

解决方案: - 正常市场状况(配对处于平衡状态) - 稍后检查或扩大范围 - 将入场阈值降低至 ±1.5 而非 ±2.0

**问题:配对相关性失效**

解决方案: - 检查公司事件(财报、指引变化) - 确认无并购活动或重组 - 如果确认结构性断点,则从观察列表中移除该配对 - 重新入场前监控 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

更多产品