12、基差交易的统计套利:均值回归策略、协整关系检验、Z-score与交易信号、统计套利的回测框架

聊到基差交易的统计套利,我得先坦白一件事——刚入行那会儿,我总觉得统计套利就是“高大上”的代名词。各种数学公式、检验方法,看得人眼花缭乱。后来做多了才发现,统计套利的本质其实很简单:找到两个会“走在一起”的品种,等它们走散了,就赌它们会重新走回来

说白了,这就是均值回归思想在基差交易里的应用。你想想看,如果两个品种长期存在某种稳定关系,那它们之间的价差(也就是基差)就不该跑太远。一旦跑远了,市场力量会把它拉回来。我们要做的,就是捕捉这个“拉回来”的过程。

均值回归策略:基差交易的核心逻辑

均值回归,这个名字听起来挺唬人。其实核心就一句话:价格偏离均值太远,就会向均值回归

在基差交易里,我们关注的是基差(价差)的均值回归。比如螺纹钢和热卷,它们生产工艺相近,下游需求也有重叠。正常情况下,两者价差会在一个区间内波动。如果某天价差突然拉得很大,那大概率会缩回来。

我个人习惯把均值回归策略分成两类:

  • 简单均值回归:直接用历史均值作为基准,偏离超过一定阈值就开仓。优点是简单,缺点是均值可能漂移。
  • 动态均值回归:用滚动窗口计算均值,适应市场变化。我一般用60天或120天的滚动窗口。
我的经验:均值回归策略最怕的是“趋势性行情”。如果两个品种的基本面发生了根本性变化,原来的均值就不成立了。我在2016年做螺纹和热卷的套利时就吃过这个亏——供给侧改革一来,价差中枢彻底变了,按老均值做单,亏得我怀疑人生。

协整关系检验:别把“假关系”当真

做统计套利,最怕的就是找到一对“假情侣”——表面上看着走势很像,实际上根本没关系。协整检验就是用来甄别这种关系的。

协整的数学定义我就不展开了,你只需要记住:如果两个时间序列是协整的,那它们的线性组合是平稳的。换句话说,它们之间有一个长期均衡关系。

常用的检验方法是Engle-Granger两步法

  1. 第一步:用OLS回归估计两个序列的长期关系,得到残差序列。
  2. 第二步:对残差序列做单位根检验(ADF检验),看它是否平稳。

如果残差是平稳的,就说明两个序列存在协整关系。嗯,这里要注意:ADF检验的p值要小于0.05才算通过。我一般会要求更严格一点,p值小于0.01才敢用。

避坑指南:我曾经犯过一个低级错误——用同一段数据既做协整检验又做回测。结果回测表现好得离谱,实盘却一塌糊涂。后来才意识到,这叫“前视偏差”。正确的做法是:用前一段数据做协整检验,用后一段数据做回测。

Z-score与交易信号:把基差变成可操作的信号

协整检验通过了,接下来就是怎么把基差转化成交易信号。这里我强烈推荐用Z-score

Z-score的计算公式很简单:

Z = (当前基差 - 基差均值) / 基差标准差

Z-score告诉我们:当前基差偏离均值多少个标准差。这个值越大,说明偏离越极端,回归的概率越高。

我常用的交易规则是这样的:

Z-score范围 操作 说明
Z < -2 做多基差(买近卖远) 基差被严重低估,赌它回归
-2 ≤ Z ≤ 2 观望 基差在正常范围内,不操作
Z > 2 做空基差(卖近买远) 基差被严重高估,赌它回归
Z 回归到 0 附近 平仓 基差回归均值,获利了结

当然,阈值不一定是±2。你可以根据品种的波动特性调整。比如波动大的品种,我可能会用±2.5;波动小的,用±1.5就够了。

关键点:Z-score的窗口期选择很重要。窗口太短,信号太多,容易频繁交易;窗口太长,信号太少,可能错过机会。我一般先用60天窗口做初步测试,再根据回测结果调整。

统计套利的回测框架:别让回测骗了你

回测是检验策略的试金石。但说实话,回测很容易“作弊”。我自己就见过太多回测漂亮、实盘惨烈的案例了。

一个靠谱的统计套利回测框架,至少要考虑以下几点:

  • 滑点和手续费:别用理想化的假设。我一般按双边万三的手续费、1个tick的滑点来算。
  • 样本外测试:用前70%的数据做参数优化,后30%的数据做验证。如果样本外表现差,说明策略过拟合了。
  • 滚动窗口:协整关系不是一成不变的。我建议每3个月重新做一次协整检验,动态调整交易对。
  • 资金管理:单笔交易的风险不要超过总资金的2%。这是铁律。

下面是一个简单的回测框架代码示例(Python风格):

# 伪代码示例:统计套利回测框架
def backtest_stat_arb(price1, price2, window=60, entry_z=2, exit_z=0):
    # 1. 计算价差
    spread = price1 - price2
    
    # 2. 计算滚动Z-score
    mean = spread.rolling(window).mean()
    std = spread.rolling(window).std()
    z_score = (spread - mean) / std
    
    # 3. 生成交易信号
    signals = pd.Series(0, index=z_score.index)
    signals[z_score < -entry_z] = 1   # 做多基差
    signals[z_score > entry_z] = -1   # 做空基差
    signals[abs(z_score) < exit_z] = 0  # 平仓
    
    # 4. 计算收益(考虑滑点和手续费)
    # ... 省略具体实现
    
    return signals, pnl
我的建议:回测时一定要做“压力测试”。比如把手续费提高一倍,看看策略还能不能赚钱。如果还能,说明策略的鲁棒性不错。我有个策略就是在压力测试下“现了原形”——手续费一提高,收益直接变负。

知识体系总览

为了让你更直观地理解本章的知识结构,我画了一张流程图:

统计套利知识体系 均值回归策略(核心逻辑) 协整关系检验(Engle-Granger) Z-score → 交易信号 统计套利回测框架 滑点与手续费 样本外测试

这张图把本章的核心逻辑串起来了:从均值回归的核心理念出发,经过协整检验的验证,再到Z-score生成交易信号,最后用回测框架检验策略的有效性。每一步都环环相扣,缺一不可。

最后说一句:统计套利不是印钞机。它需要你持续监控、动态调整。市场在变,协整关系也在变。保持敬畏心,做好风控,才能在这个市场里活得久。


公众号:蓝海资料掘金营,微信deep3321