第24章:基差的量化建模:ARIMA与GARCH模型在基差预测中的应用
说实话,做了十几年基差交易,我最大的感触就是——基差这东西,看着简单,做起来真难。它不像价格那样有明确的趋势,也不像波动率那样有成熟的模型。它更像一个“夹缝中的变量”,既受现货影响,又受期货牵制。
那怎么量化它?怎么预测它?
我个人习惯用两类模型:ARIMA 和 GARCH。一个管均值,一个管波动。今天咱们就把这两个模型在基差预测中的应用,掰开了讲清楚。
24.1 基差序列的“脾气”
先说说基差序列的特点。你想想看,基差 = 现货价格 - 期货价格。它不像价格那样有单位根,也不像收益率那样白噪声。它更像一个均值回复的过程。
我在项目中遇到过这样的情况:某品种的基差长期在 -50 到 +50 之间震荡,但偶尔会冲到 -200 或 +200。这种“偶尔抽风”的特性,就是典型的波动聚集效应。
所以,建模前你得先搞清楚三件事:
- 平稳性:基差序列通常是平稳的,但需要ADF检验确认
- 自相关性:今天的基差往往和昨天的基差有关
- 异方差性:波动大的时候,未来波动也可能大
核心观点:ARIMA管基差的“均值路径”,GARCH管基差的“波动风险”。两者结合,才能完整描述基差的动态行为。
24.2 ARIMA模型:预测基差的“均值路径”
ARIMA模型,说白了就是“自回归+移动平均+差分”的组合。对于基差这种平稳序列,我们通常用 ARIMA(p, d, q),其中 d 一般取 0 或 1。
我建议的建模步骤是这样的:
- 平稳性检验:用ADF检验,如果p值大于0.05,先差分
- 定阶:看ACF和PACF图,初步确定p和q
- 模型拟合:用AIC/BIC选择最优参数
- 残差检验:确保残差是白噪声
举个例子,假设我们有一组日度基差数据,用Python实现:
import pandas as pd
import numpy as np
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
# 假设 df 包含 'basis' 列
# 1. 平稳性检验
from statsmodels.tsa.stattools import adfuller
result = adfuller(df['basis'].dropna())
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
# 2. 如果p值 < 0.05,说明平稳,d=0
# 3. 看ACF和PACF图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
plot_acf(df['basis'], lags=20, ax=ax1)
plot_pacf(df['basis'], lags=20, ax=ax2)
plt.show()
# 4. 拟合ARIMA(2,0,2)
model = ARIMA(df['basis'], order=(2, 0, 2))
results = model.fit()
print(results.summary())
# 5. 预测未来5期
forecast = results.forecast(steps=5)
print(forecast)
我的经验:基差序列的p值通常不会太大,2或3就够用了。q值也类似。别盲目追求高阶模型,过拟合在基差预测里是常见坑。
24.3 GARCH模型:捕捉基差的“波动聚集”
ARIMA预测的是基差的“期望值”,但基差的风险——也就是波动率——同样重要。GARCH模型就是干这个的。
我曾经在螺纹钢的基差交易上吃过亏。当时ARIMA预测基差会回归,我开了套利头寸。结果基差确实回归了,但波动剧烈,中间差点爆仓。从那以后,我每次做基差预测,都会加上GARCH模型看波动。
GARCH(1,1)是最常用的形式:
σ²_t = ω + α * ε²_{t-1} + β * σ²_{t-1}
其中:
- σ²_t 是当前波动率
- ε²_{t-1} 是上一期残差平方
- σ²_{t-1} 是上一期波动率
- α + β < 1 保证模型稳定
Python实现:
from arch import arch_model
# 用ARIMA的残差来拟合GARCH
residuals = results.resid
# 拟合GARCH(1,1)
am = arch_model(residuals, vol='Garch', p=1, q=1)
garch_results = am.fit(update_freq=5)
print(garch_results.summary())
# 预测未来5期的波动率
garch_forecast = garch_results.forecast(horizon=5)
print(garch_forecast.variance.iloc[-1])
注意:GARCH模型对异常值非常敏感。如果基差序列中有极端值(比如交割日附近的异常波动),建议先做处理,否则模型参数会严重偏离。
24.4 ARIMA-GARCH联合建模:完整方案
把两个模型结合起来,就是完整的基差量化建模方案。我通常分三步走:
- 第一步:用ARIMA拟合基差的均值方程,得到残差序列
- 第二步:对残差序列做ARCH效应检验(LM检验),确认存在异方差
- 第三步:用GARCH模型拟合残差的波动率
下面这张图展示了整个流程:
24.5 实战中的避坑指南
模型讲完了,但实战中还有几个坑,我得提醒你:
- 坑一:过度依赖模型。ARIMA-GARCH再漂亮,也预测不了政策突变。我曾经在2015年股指期货限仓时,模型完全失效。记住,模型只是工具,不是上帝。
- 坑二:忽视交割日效应。临近交割日,基差会剧烈收敛。这时候的波动率模型需要特殊处理,比如加入虚拟变量。
- 坑三:参数稳定性。基差的统计特性会随时间变化。我建议每3个月重新估计一次模型参数,别一套参数用一年。
我的小技巧:在预测基差时,我会同时看ARIMA的预测值和GARCH的波动率预测。如果波动率预测突然飙升,即使ARIMA预测基差会回归,我也会减仓。说白了,活得久比赚得多更重要。
24.6 模型评估:别只看R²
很多新手喜欢用R²来评估模型,但在基差预测里,R²往往很低——0.2到0.4就算不错了。为什么?因为基差受太多随机因素影响。
我建议用以下指标:
| 指标 | 用途 | 我的经验阈值 |
|---|---|---|
| RMSE | 预测误差的绝对值 | 小于基差标准差的60% |
| MAE | 平均绝对误差 | 小于基差标准差的50% |
| 方向准确率 | 预测基差涨跌方向的正确率 | 大于55%就算可用 |
| VaR回测 | GARCH波动率预测的准确性 | 95%VaR的失败率在4%-6% |
嗯,这里要注意:方向准确率55%看起来不高,但在基差交易里,只要方向对了,配合仓位管理,长期下来收益很可观。
24.7 总结:模型是骨架,经验是血肉
ARIMA和GARCH模型,是基差量化建模的经典组合。它们能帮你:
- 预测基差的均值回归路径
- 量化基差的波动风险
- 制定更科学的套利策略
但别忘了,模型只是骨架。真正让交易赚钱的,是你对市场的理解、对风险的敬畏、对纪律的坚持。我见过太多人模型跑得漂亮,但一到实盘就亏钱——因为他们忽略了模型背后的假设和局限。
最后送你一句话:基差预测,七分靠模型,三分靠经验。但决定成败的,往往是那三分经验。
公众号:蓝海资料掘金营,微信deep3321