简介#
配对交易是基于数学分析的经典策略,通过寻找具有经济关联的两个证券(如竞争对手或上下游企业),建立数学模型进行交易。本教程将循序渐进地讲解核心概念和实战应用。
基础概念#
协整关系#
两个时间序列若存在稳定的线性组合,其价差围绕均值波动,则称为协整。数学上表示为:
若存在系数β使 平稳,则X和Y协整。
协整检验#
使用statsmodels的coint函数进行检验:
code
from statsmodels.tsa.stattools import coint
score, pvalue, _ = coint(series1, series2)
# p值<0.05表示协整关系显著实战演示#
生成模拟数据#
code
import numpy as np
import pandas as pd
# 生成X序列
np.random.seed(42)
X_returns = np.random.normal(0, 1, 100)
X = pd.Series(np.cumsum(X_returns)) + 50
# 生成Y序列(加入噪声)
noise = np.random.normal(0, 1, 100)
Y = X + 5 + noise
# 可视化
pd.concat([X, Y], axis=1).plot(title="模拟证券X和Y的价格走势");检验协整性#
code
score, pvalue, _ = coint(X, Y)
print(f"协整检验p值: {pvalue:.4f}") # 示例输出 p值: 0.0000价差分析#
code
spread = Y - X
spread.plot(title="价差走势", style='g')
plt.axhline(spread.mean(), color='r', linestyle='--');真实数据案例#
获取股票数据#
code
import yfinance as yf
symbols = ['AAPL', 'MSFT', 'SPY']
data = yf.download(symbols, start='2018-01-01', end='2023-01-01')['Close']
data.columns = symbols寻找协整对#
code
def find_cointegrated_pairs(data):
from itertools import combinations
pairs = []
for (s1, s2) in combinations(data.columns, 2):
_, pvalue, _ = coint(data[s1], data[s2])
if pvalue < 0.05:
pairs.append((s1, s2))
return pairs
valid_pairs = find_cointegrated_pairs(data)
print(f"发现协整对: {valid_pairs}")交易策略构建#
价差计算#
code
# 使用线性回归确定对冲比率
import statsmodels.api as sm
s1 = data['AAPL']
s2 = data['MSFT']
model = sm.OLS(s2, sm.add_constant(s1)).fit()
hedge_ratio = model.params['AAPL']
spread = s2 - hedge_ratio * s1Z分数标准化#
code
def zscore(series):
return (series - series.mean()) / series.std()
z_scores = zscore(spread)
z_scores.plot(title="标准化价差");
plt.axhline(1, c='r', ls='--')
plt.axhline(-1, c='g', ls='--');动态参数调整#
滚动窗口统计#
code
# 30日滚动窗口
window = 30
rolling_spread = spread.rolling(window)
z_scores = (spread - rolling_spread.mean()) / rolling_spread.std()交易信号#
| 信号类型 | 条件 | 操作 |
|---|---|---|
| 做多价差 | Z < -1.5 | 买入Y,卖空X |
| 做空价差 | Z > 1.5 | 卖空Y,买入X |
| 平仓 | Z |
风险管理#
-
多重检验偏差:检验多个组合时需Bonferroni校正
-
过拟合风险:避免在单一参数集上过度优化
-
市场机制变化:定期进行样本外测试
code
# 样本外测试示例
new_data = yf.download(['AAPL', 'MSFT'], start='2023-01-01')['Close']
_, pvalue, _ = coint(new_data['AAPL'], new_data['MSFT'])
print(f"样本外协整p值: {pvalue:.4f}")练习题#
-
生成两个非协整但相关的序列,验证其协整检验结果
-
修改滚动窗口参数,观察对Z分数的影响
-
尝试在价差计算中使用价格比率替代线性回归方法
扩展阅读#
-
奥恩斯坦-乌伦贝克过程在均值回归中的应用
-
卡尔曼滤波器动态估计对冲比率
-
交易成本模型与滑点分析
通过本教程,您已掌握配对交易的基本原理和实现方法。实际应用中需结合市场微观结构、风险管理等因素进行策略优化。