第17章:基差回归与机器学习结合:随机森林、XGBoost、LSTM在基差预测中的对比

做基差交易这么多年,我一直在琢磨一个问题:传统的时间序列模型,到底能不能搞定基差预测?

说实话,ARIMA、GARCH这些经典模型,在平稳市场里表现还行。但一遇到政策突变、交割月临近、或者市场情绪剧烈波动,它们就有点力不从心了。我2019年做螺纹钢基差策略时,ARIMA模型在5月份回测漂亮得很,结果6月份一换月,直接给我来了个连续三天的反向波动——那叫一个惨。

后来我开始尝试机器学习模型。说白了,基差预测本质上是个回归问题——用历史数据去预测未来的价差。而机器学习,尤其是集成学习和深度学习,在处理非线性关系上确实有天然优势。

今天咱们就来聊聊三种主流模型:随机森林、XGBoost、LSTM。它们各自有什么特点?在基差预测中谁更靠谱?我踩过哪些坑?

17.1 为什么传统模型不够用?

基差数据有几个特点,让传统模型很头疼:

  • 非线性关系:库存、持仓、期限结构这些因子,跟基差之间不是简单的线性关系。比如库存高到一定程度,基差可能突然崩塌
  • 多因子交互:单一时间序列模型很难同时处理几十个特征
  • 市场状态切换:牛熊市、交割月、政策窗口期,数据分布完全不一样

我个人的习惯是,先用传统模型做个基准,再上机器学习模型看能不能超越。如果连ARIMA都跑不过,那说明特征工程有问题,不是模型的问题。

17.2 随机森林:简单粗暴但有效

随机森林是我最早尝试的机器学习模型。为什么选它?因为参数少、不容易过拟合、对异常值不敏感。

在基差预测中,我通常这样构建特征:

  • 价格类:近月合约价格、远月合约价格、近远月价差
  • 持仓类:主力合约持仓量、持仓变化率、多空比
  • 库存类:显性库存、仓单数量、库存变化率
  • 时间类:距离交割日天数、是否临近交割月

代码实现其实不复杂:

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

# 假设 X 是特征矩阵,y 是未来N日的基差变化
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, shuffle=False
)

model = RandomForestRegressor(
    n_estimators=200,
    max_depth=8,
    min_samples_leaf=10,
    random_state=42
)
model.fit(X_train, y_train)

# 特征重要性
importance = pd.DataFrame({
    'feature': feature_names,
    'importance': model.feature_importances_
}).sort_values('importance', ascending=False)

嗯,这里要注意:shuffle=False 这个参数很关键。时间序列数据不能随机打乱,否则就相当于用未来的数据去预测过去,回测结果会虚高。我曾经犯过这个错误,回测年化收益30%,实盘一跑直接亏了两个月。

随机森林在基差预测中的表现

  • 优点:训练快、可解释性强、特征重要性一目了然
  • 缺点:对趋势性预测能力弱、外推效果差
  • 适用场景:震荡市、特征数量在20-50个之间

17.3 XGBoost:梯度提升的王者

如果说随机森林是「民主投票」,那XGBoost就是「迭代纠错」。每一棵树都在修正前一棵树的错误,所以精度通常更高。

我在做豆粕基差预测时,对比过随机森林和XGBoost。同样的特征集,XGBoost的R²从0.32提升到了0.41。别小看这0.09,在基差交易里,这往往意味着从亏损到盈利的跨越。

XGBoost有几个关键参数需要调:

import xgboost as xgb

model = xgb.XGBRegressor(
    n_estimators=300,
    learning_rate=0.05,
    max_depth=5,
    subsample=0.8,
    colsample_bytree=0.8,
    reg_alpha=0.1,
    reg_lambda=1.0
)
model.fit(X_train, y_train, 
          eval_set=[(X_test, y_test)],
          early_stopping_rounds=20,
          verbose=False)

我个人习惯用 early_stopping_rounds 来防止过拟合。你想想看,如果验证集上的误差连续20轮都不下降,那再训练下去也没意义了。

避坑指南:我曾经在XGBoost里把 learning_rate 设成0.3,n_estimators 设成1000,结果模型在训练集上R²高达0.95,验证集上只有0.15。这就是典型的过拟合。后来我把学习率降到0.05,树的数量控制在300以内,效果反而好了很多。

17.4 LSTM:序列建模的利器

LSTM跟前面两个模型最大的区别在于:它能捕捉时间序列中的长期依赖关系。

基差数据是有记忆效应的。比如,过去5天的基差走势,往往会影响未来3天的方向。随机森林和XGBoost虽然也能用滞后特征(lag features)来模拟这种关系,但本质上还是「截断」的——你只能手动指定用过去多少天的数据。

LSTM则不同,它通过门控机制自动学习「应该记住多久的历史信息」。

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')
model.fit(X_train, y_train, 
          validation_data=(X_test, y_test),
          epochs=50, batch_size=32, verbose=0)

这里有个关键点:lookback 参数怎么设?我试过5天、10天、20天、60天。结果发现,对于大多数商品期货,10-20天的回溯窗口效果最好。太短了学不到趋势,太长了反而引入噪声。

LSTM的坑

  • 训练时间长,尤其是数据量大时
  • 对数据标准化敏感,一定要做归一化
  • 结果不稳定,同样的代码跑两次可能结果不同
  • 可解释性差,你不知道它到底学到了什么规律

17.5 三种模型的对比

我拿2022-2023年的螺纹钢基差数据做了个对比测试。样本外预测结果如下:

指标 随机森林 XGBoost LSTM
0.32 0.41 0.38
MAE(元/吨) 18.5 15.2 16.1
方向准确率 62% 68% 65%
训练时间 12秒 45秒 8分钟
过拟合风险

说实话,这个结果有点出乎我的意料。我原本以为LSTM会大幅领先,毕竟它是专门为序列数据设计的。但实际表现跟XGBoost差不多,甚至在某些指标上还略逊一筹。

为什么会这样?我分析下来有几个原因:

  • 基差数据的样本量通常不大(日频数据,一年也就200多个样本),LSTM这种深度模型容易欠拟合
  • 基差的影响因子很多是离散的(比如交割月、库存报告发布日),LSTM对这种「事件驱动」的模式不太敏感
  • XGBoost对特征工程的要求更低,你扔进去几十个特征,它自己就能筛选出重要的

我的建议

  • 如果特征数量少(<10个),数据量大(>5000样本),优先考虑LSTM
  • 如果特征数量多(20-100个),数据量中等,XGBoost是最稳妥的选择
  • 如果只是做个快速验证,或者需要可解释性,随机森林就够了

17.6 知识体系总览

下面这张图,是我对本章核心逻辑的梳理:

基差回归与机器学习模型对比 输入特征 价格类特征 持仓类特征 库存类特征 时间类特征 随机森林 Bagging集成 XGBoost 梯度提升 LSTM 长短期记忆 基差预测值 评估指标:R² / MAE / 方向准确率

从这张图可以看得很清楚:三种模型共享同一套输入特征,但内部机制完全不同。随机森林靠多棵树投票,XGBoost靠迭代纠错,LSTM靠记忆门控。最终输出的基差预测值,再用R²、MAE、方向准确率来评估。

17.7 实战中的选择策略

说了这么多,到底该用哪个模型?

我的经验是:不要迷信任何一个模型。我见过有人用LSTM跑出漂亮回测,实盘一塌糊涂;也见过有人用简单的随机森林,配合扎实的特征工程,稳定盈利。

我个人习惯的做法是:

  1. 先用随机森林做特征筛选,剔除掉不重要的因子
  2. 再用XGBoost做主力模型,调参优化
  3. 如果数据量足够大(日频数据超过3年),再尝试LSTM作为辅助
  4. 最终用集成策略,把三个模型的预测结果做个加权平均

你想想看,每个模型都有自己的盲区。随机森林对异常值不敏感,但趋势预测弱;XGBoost精度高,但容易过拟合;LSTM能捕捉长期依赖,但训练不稳定。把它们结合起来,反而能互补。

一个小技巧:在做模型集成时,不要用固定的权重。我通常根据最近30天的预测误差来动态调整权重——哪个模型最近表现好,就给它更高的权重。这个方法虽然简单,但效果往往比固定权重好不少。

好了,关于基差回归与机器学习的结合,今天就聊到这儿。三种模型各有千秋,关键还是看你的数据特征和交易场景。记住一点:模型只是工具,对市场的理解才是核心。


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