第十九章:基差与机器学习:特征工程与基差预测
说实话,做了十几年基差交易,我越来越觉得传统统计方法有点不够用了。你想想看,基差这东西受太多因素影响——库存、到港量、交割规则、资金成本、甚至天气。这么多变量搅在一起,光靠线性回归确实捉襟见肘。
所以这几年,我开始把机器学习引入基差分析。不是赶时髦,是真的能解决问题。今天我就把我在这个方向上的实战经验掰开揉碎讲给你听。
19.1 特征工程:基差预测的基石
做机器学习,有一句话我特别认同:数据和特征决定了上限,模型只是逼近这个上限。基差预测更是如此。
我个人习惯把基差相关的特征分成四类:
| 特征类别 | 具体特征 | 说明 |
|---|---|---|
| 基本面特征 | 库存变化率、到港量、开工率、仓单数量 | 反映供需平衡状态 |
| 价格衍生特征 | 近远月价差、波动率、持仓量变化 | 捕捉市场情绪和资金动向 |
| 时间特征 | 交割日倒计时、星期几、月份、节假日 | 基差有明显的日历效应 |
| 宏观特征 | 利率、汇率、PMI、社融数据 | 影响资金成本和风险偏好 |
这里我要特别强调一点——特征不是越多越好。我在项目中遇到过一位同事,恨不得把能拿到的数据全塞进去,结果模型过拟合得一塌糊涂。后来我帮他做特征筛选,只保留了20个核心特征,效果反而提升了30%。
核心原则:基差预测的特征工程,要围绕"交割逻辑"展开。离交割日越近,仓单和库存的权重越高;离交割日越远,宏观和情绪的权重越大。
19.1.1 特征构造实战
我常用的特征构造方法有几种:
- 滚动统计量:比如过去5天、20天的基差均值、标准差、最大值、最小值。这些能反映基差的运行区间和波动特征。
- 比值特征:比如基差/波动率、基差/持仓量。这些能消除量纲影响,让模型更容易学习。
- 差分特征:基差的一阶差分、二阶差分。说白了就是基差的变化速度和加速度。
- 交互特征:比如库存变化率×基差水平。这种组合特征往往能捕捉到非线性关系。
举个例子,我在做螺纹钢基差预测时,发现一个特别有效的特征——"仓单/持仓量"比值。这个比值一旦超过某个阈值,基差几乎必然回归。为什么?因为仓单多了,说明现货压力大,期货价格会被往下拽。
我的小技巧:特征构造完成后,一定要做相关性分析。把相关系数超过0.9的特征删掉,只保留一个。不然模型会变得不稳定,稍微改点数据结果就变了。
19.2 时间序列模型在基差中的应用
基差本质上是一个时间序列。所以传统的时间序列模型,比如ARIMA、GARCH,在基差预测中依然有它们的用武之地。
但我得说句实话——纯时间序列模型在基差预测上表现一般。为什么?因为基差受太多外部因素影响,光靠历史数据很难预测准确。
不过,有一种场景特别适合时间序列模型——临近交割的基差收敛预测。这时候基差的行为模式比较稳定,历史规律性很强。
19.2.1 ARIMA模型实战
我一般这样用ARIMA:
# 伪代码示例
from statsmodels.tsa.arima.model import ARIMA
# 取近30个交易日的基差数据
basis_series = get_basis_data('RB', days=30)
# 先做ADF检验,判断平稳性
# 如果不平稳,做一阶差分
model = ARIMA(basis_series, order=(2,1,2))
model_fit = model.fit()
# 预测未来3天的基差
forecast = model_fit.forecast(steps=3)
这里有个坑——ARIMA的参数选择很关键。我曾经吃过一次亏,用默认的(1,1,1)参数,结果预测出来的基差曲线平滑得像一条直线,完全没捕捉到波动。后来我改用AIC准则自动选参,效果好了很多。
注意:ARIMA模型假设数据是线性的。如果基差出现明显的结构突变(比如政策出台、交割规则改变),模型会完全失效。这时候一定要人工干预,或者改用其他模型。
19.2.2 GARCH模型:捕捉波动率
基差还有一个特点——波动率聚集。什么意思?就是大波动之后往往跟着大波动,小波动之后跟着小波动。GARCH模型就是专门干这个的。
我一般用GARCH来预测基差的波动范围,而不是具体数值。比如:
- 如果GARCH预测波动率会放大,我就减少仓位,或者用期权做保护
- 如果波动率在低位,我就考虑做回归策略,因为基差大概率会收敛
嗯,这里要注意——GARCH模型对异常值特别敏感。有一次我忘了剔除交割日的异常数据,结果模型给出的波动率预测高得离谱,差点让我错过一个很好的交易机会。
19.3 深度学习与基差因子挖掘
说到深度学习,很多人觉得这是"黑箱",不靠谱。但我不这么看。深度学习在因子挖掘这个方向上,确实有它的独到之处。
我个人最常用的是LSTM(长短期记忆网络)。为什么选它?因为基差数据有明显的时序依赖关系——今天的基差受过去几天、甚至几周的影响。LSTM正好擅长捕捉这种长期依赖。
19.3.1 LSTM基差预测框架
我搭建的LSTM模型大概长这样:
# 伪代码示例
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
model = Sequential([
LSTM(64, return_sequences=True, input_shape=(lookback, n_features)),
Dropout(0.2),
LSTM(32, return_sequences=False),
Dropout(0.2),
Dense(16, activation='relu'),
Dense(1) # 输出预测的基差值
])
model.compile(optimizer='adam', loss='mse')
这里有个关键参数——lookback(回溯窗口)。我试过5天、10天、20天、30天,最后发现对于大多数商品,15天左右的效果最好。为什么?因为基差的均值回归周期大概就是两周到三周。
实战经验:LSTM模型在基差预测上的表现,很大程度上取决于特征的质量。我试过只用基差历史数据做预测,效果很差(R²只有0.3左右)。但加入库存、仓单、价差等基本面特征后,R²能提升到0.6以上。
19.3.2 深度学习因子挖掘
除了直接预测基差,深度学习还有一个很酷的应用——因子挖掘。说白了,就是让模型自动从海量数据中找出影响基差的关键因子。
我常用的方法是自编码器。它的原理很简单:把高维数据压缩到低维,再还原回来。压缩后的低维表示,就是模型自动提取的"因子"。
举个例子,我把100多个基本面和技术面特征输入自编码器,压缩到10个因子。然后分析这10个因子和基差的相关性,发现其中3个因子特别重要:
- 因子1:主要和库存、仓单相关——我把它叫做"库存压力因子"
- 因子2:主要和近远月价差、持仓量相关——我把它叫做"资金博弈因子"
- 因子3:主要和波动率、成交量相关——我把它叫做"情绪因子"
这三个因子,基本上能解释基差变动的70%以上。你看,深度学习帮我们找到了人工很难发现的组合因子。
我的建议:深度学习因子挖掘的结果,一定要用基本面逻辑去验证。如果模型找出的因子在逻辑上说不通,那很可能是过拟合。我曾经挖出一个"月亮相位因子",相关性还挺高,但仔细一想纯属巧合,果断弃用。
19.4 模型选择与融合策略
说了这么多模型,你可能会问:到底该用哪个?
我的答案是——别只用一个。我现在的做法是模型融合:
- 短期预测(1-3天):用LSTM + 基本面特征,捕捉非线性关系
- 中期预测(1-2周):用XGBoost + 特征工程,兼顾解释性和准确性
- 长期趋势(1个月以上):用ARIMA + 宏观因子,把握大方向
最后把三个模型的预测结果做加权平均。权重怎么定?看近期各模型的表现——哪个模型最近预测得准,就给它更高的权重。
重要提醒:机器学习模型不是万能的。基差交易的核心还是基本面逻辑。模型只是工具,帮你更快地处理信息、更客观地做决策。千万别把模型当"圣杯",该止损的时候一定要止损。
好了,关于基差与机器学习的内容,我就讲到这里。这些方法我都实盘验证过,虽然不是百发百中,但确实能提高胜率。你回去可以拿历史数据跑一跑,看看效果如何。
公众号:蓝海资料掘金营,微信deep3321