跳到主内容
研究主线期货与跨资产研究 · 第51–54讲4/4模块导览 →
研究案例

第54讲:案例·期货配对交易 (Example: Pairs Trading on Futures)

以期货和股票序列演示协整筛选、对冲比率、价差标准化及信号生成,并讨论样本外稳定性和成本。

完成状态保存在当前浏览器,可随时取消。

简介#

配对交易是基于数学分析的经典策略,通过寻找具有经济关联的两个证券(如竞争对手或上下游企业),建立数学模型进行交易。本教程将循序渐进地讲解核心概念和实战应用。

基础概念#

协整关系#

两个时间序列若存在稳定的线性组合,其价差围绕均值波动,则称为协整。数学上表示为:

若存在系数β使 YtβXtYtβXtYtβXtYt−βXtY_t - βX_tYt−βXt平稳,则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 * s1

Z分数标准化#

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

风险管理#

  1. 多重检验偏差:检验多个组合时需Bonferroni校正

  2. 过拟合风险:避免在单一参数集上过度优化

  3. 市场机制变化:定期进行样本外测试

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}")

练习题#

  1. 生成两个非协整但相关的序列,验证其协整检验结果

  2. 修改滚动窗口参数,观察对Z分数的影响

  3. 尝试在价差计算中使用价格比率替代线性回归方法

扩展阅读#

  • 奥恩斯坦-乌伦贝克过程在均值回归中的应用

  • 卡尔曼滤波器动态估计对冲比率

  • 交易成本模型与滑点分析

通过本教程,您已掌握配对交易的基本原理和实现方法。实际应用中需结合市场微观结构、风险管理等因素进行策略优化。

完成研究复核后,自评一次

请按能否复现、质疑并改进研究过程来判断,而不是按是否读完。

模块收束 · 0/4 已完成

把知识收束成可复核的研究产物

完成后应该能够

  • 能够构建无前视的期货连续序列
  • 能够解释现货收益、展期收益和保证金风险

交付物

  • 一份连续合约构造说明与期货策略回测

本模块已有 0/4 个主要学习单元完成。 本模块没有待复习项。