第十九章:基差与机器学习:特征工程与基差预测

说实话,做了十几年基差交易,我越来越觉得传统统计方法有点不够用了。你想想看,基差这东西受太多因素影响——库存、到港量、交割规则、资金成本、甚至天气。这么多变量搅在一起,光靠线性回归确实捉襟见肘。

所以这几年,我开始把机器学习引入基差分析。不是赶时髦,是真的能解决问题。今天我就把我在这个方向上的实战经验掰开揉碎讲给你听。

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. 因子1:主要和库存、仓单相关——我把它叫做"库存压力因子"
  2. 因子2:主要和近远月价差、持仓量相关——我把它叫做"资金博弈因子"
  3. 因子3:主要和波动率、成交量相关——我把它叫做"情绪因子"

这三个因子,基本上能解释基差变动的70%以上。你看,深度学习帮我们找到了人工很难发现的组合因子。

我的建议:深度学习因子挖掘的结果,一定要用基本面逻辑去验证。如果模型找出的因子在逻辑上说不通,那很可能是过拟合。我曾经挖出一个"月亮相位因子",相关性还挺高,但仔细一想纯属巧合,果断弃用。

19.4 模型选择与融合策略

说了这么多模型,你可能会问:到底该用哪个?

我的答案是——别只用一个。我现在的做法是模型融合:

  • 短期预测(1-3天):用LSTM + 基本面特征,捕捉非线性关系
  • 中期预测(1-2周):用XGBoost + 特征工程,兼顾解释性和准确性
  • 长期趋势(1个月以上):用ARIMA + 宏观因子,把握大方向

最后把三个模型的预测结果做加权平均。权重怎么定?看近期各模型的表现——哪个模型最近预测得准,就给它更高的权重。

重要提醒:机器学习模型不是万能的。基差交易的核心还是基本面逻辑。模型只是工具,帮你更快地处理信息、更客观地做决策。千万别把模型当"圣杯",该止损的时候一定要止损。

好了,关于基差与机器学习的内容,我就讲到这里。这些方法我都实盘验证过,虽然不是百发百中,但确实能提高胜率。你回去可以拿历史数据跑一跑,看看效果如何。


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