查看全集:💎Quantopia量化分析56讲
配对交易是基于数学分析的经典策略,通过寻找具有经济关联的两个证券(如竞争对手或上下游企业),建立数学模型进行交易。本教程将循序渐进地讲解核心概念和实战应用。
两个时间序列若存在稳定的线性组合,其价差围绕均值波动,则称为协整。数学上表示为:
若存在系数β使 平稳,则X和Y协整。
使用statsmodels的coint
函数进行检验:
from statsmodels.tsa.stattools import coint
score, pvalue, _ = coint(series1, series2)
# p值<0.05表示协整关系显著
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的价格走势");
score, pvalue, _ = coint(X, Y)
print(f"协整检验p值: {pvalue:.4f}") # 示例输出 p值: 0.0000
spread = Y - X
spread.plot(title="价差走势", style='g')
plt.axhline(spread.mean(), color='r', linestyle='--');
import yfinance as yf
symbols = ['AAPL', 'MSFT', 'SPY']
data = yf.download(symbols, start='2018-01-01', end='2023-01-01')['Close']
data.columns = symbols
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}")
# 使用线性回归确定对冲比率
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 * s1
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='--');
# 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 |
# 样本外测试示例
new_data = yf.download(['AAPL', 'MSFT'], start='2023-01-01')['Close']
_, pvalue, _ = coint(new_data['AAPL'], new_data['MSFT'])
print(f"样本外协整p值: {pvalue:.4f}")
通过本教程,您已掌握配对交易的基本原理和实现方法。实际应用中需结合市场微观结构、风险管理等因素进行策略优化。