第二章 核心原理:价差回归、协整关系与统计套利
各位同学,欢迎来到第二章。这一章是整个跨品种对冲策略的“内功心法”。
说实话,很多人做套利策略,上来就写代码、跑回测,结果亏得一塌糊涂。为什么?因为没搞懂背后的数学逻辑。今天我们就来把这层窗户纸捅破。
2.1 价差回归原理——套利的底层逻辑
先问一个问题:为什么两个品种的价格会“一起涨、一起跌”?
举个例子。螺纹钢和热卷,都是钢铁产品。螺纹钢用来盖楼,热卷用来造汽车。如果螺纹钢突然暴涨,热卷却不动,会发生什么?
钢厂会立刻调整生产线,多产螺纹钢、少产热卷。结果螺纹钢供给增加,价格回落;热卷供给减少,价格上升。最终,两者的价差会回到合理区间。
这就是价差回归的核心逻辑:当价差偏离正常范围时,市场力量会把它拉回来。
核心公式:
价差 = P₁ - β × P₂
其中 β 是对冲比率,P₁、P₂ 是两个品种的价格。
我个人习惯把价差想象成一根“橡皮筋”。你把它拉得越远,它弹回来的力量就越大。我们做套利,就是在橡皮筋拉得最远的时候出手。
2.2 协整关系与平稳性——别把“相关”当“因果”
很多新手犯过一个错误:看到两个品种走势很像,就以为可以做套利。
我当年也踩过这个坑。记得有一次,我发现A股和某商品期货走势高度相关,相关系数0.85。兴冲冲做了策略,结果亏得怀疑人生。
为什么?因为相关性 ≠ 协整性。
相关性描述的是“走势像不像”,协整性描述的是“价差会不会回归”。
举个直观的例子:一个醉汉牵着一条狗。醉汉走路东倒西歪(非平稳),狗也东跑西颠(非平稳)。但狗和醉汉之间的距离(价差)是有限的——狗跑远了会被绳子拉回来。这个“距离”就是平稳的。
协整关系,就是这根“绳子”。
平稳性检验(ADF检验):
我们通常用ADF检验来判断价差是否平稳。p值小于0.05,说明价差是平稳的,可以做套利。
代码示例:
from statsmodels.tsa.stattools import adfuller
# 计算价差
spread = price1 - beta * price2
# ADF检验
result = adfuller(spread)
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
if result[1] < 0.05:
print('价差平稳,存在协整关系')
else:
print('价差不平稳,不适合做套利')
2.3 统计套利基础——用数学说话
统计套利,说白了就是“用概率赚钱”。
传统套利靠的是“无风险”机会,比如同一只股票在不同交易所的价格差异。但这种机会转瞬即逝,普通人根本抢不到。
统计套利不一样。它承认风险存在,但通过数学证明:长期来看,胜率在你这边。
具体怎么做?
- 找配对:找到两个协整的品种(比如豆油和棕榈油)
- 算价差:计算两者的价差序列
- 定阈值:用均值±n倍标准差设定开仓/平仓线
- 执行交易:价差偏离时开仓,回归时平仓
避坑指南:
我曾经在回测中看到年化30%的收益,兴奋得直接上实盘。结果一个月亏了15%。
后来才发现,我用的数据是日线,但交易频率是分钟级。回测和实盘完全不是一回事。
记住:回测用的数据频率,必须和交易频率一致。
2.4 均值回归策略逻辑——核心交易框架
均值回归策略,是统计套利最经典的实现方式。它的逻辑很简单:
- 当价差高于上轨:做空价差(卖高买低)
- 当价差低于下轨:做多价差(买高卖低)
- 当价差回归均值:平仓获利
这里有个关键参数:阈值怎么设?
我个人的经验是:
| 参数 | 常见取值 | 说明 |
|---|---|---|
| 开仓阈值 | 均值 ± 2σ | 约95%的价差落在这个范围内 |
| 平仓阈值 | 均值 ± 0.5σ | 价差回归到均值附近时平仓 |
| 止损阈值 | 均值 ± 3.5σ | 防止价差持续偏离导致巨亏 |
你想想看,如果价差已经偏离到3个标准差以外,还硬扛着不加止损,那跟赌博有什么区别?
完整策略代码框架:
import numpy as np
import pandas as pd
class MeanReversionStrategy:
def __init__(self, entry_z=2.0, exit_z=0.5, stop_z=3.5):
self.entry_z = entry_z
self.exit_z = exit_z
self.stop_z = stop_z
def generate_signals(self, spread):
mean = np.mean(spread)
std = np.std(spread)
z_score = (spread - mean) / std
signals = pd.Series(0, index=spread.index)
# 开仓信号
signals[z_score > self.entry_z] = -1 # 做空价差
signals[z_score < -self.entry_z] = 1 # 做多价差
# 平仓信号
signals[abs(z_score) < self.exit_z] = 0
# 止损信号
signals[abs(z_score) > self.stop_z] = 0
return signals
2.5 知识体系总览
说了这么多,我们来画一张图,把整个知识体系串起来。
这张图很清楚地展示了从原理到策略的完整链路。每一层都建立在前一层的基础上,缺一不可。
嗯,到这里,核心原理部分就讲完了。记住一句话:没有协整关系的套利,就是赌博。下一章我们会深入实战,用真实数据跑一遍完整的策略流程。