第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 |
|---|---|---|---|
| R² | 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 知识体系总览
下面这张图,是我对本章核心逻辑的梳理:
从这张图可以看得很清楚:三种模型共享同一套输入特征,但内部机制完全不同。随机森林靠多棵树投票,XGBoost靠迭代纠错,LSTM靠记忆门控。最终输出的基差预测值,再用R²、MAE、方向准确率来评估。
17.7 实战中的选择策略
说了这么多,到底该用哪个模型?
我的经验是:不要迷信任何一个模型。我见过有人用LSTM跑出漂亮回测,实盘一塌糊涂;也见过有人用简单的随机森林,配合扎实的特征工程,稳定盈利。
我个人习惯的做法是:
- 先用随机森林做特征筛选,剔除掉不重要的因子
- 再用XGBoost做主力模型,调参优化
- 如果数据量足够大(日频数据超过3年),再尝试LSTM作为辅助
- 最终用集成策略,把三个模型的预测结果做个加权平均
你想想看,每个模型都有自己的盲区。随机森林对异常值不敏感,但趋势预测弱;XGBoost精度高,但容易过拟合;LSTM能捕捉长期依赖,但训练不稳定。把它们结合起来,反而能互补。
一个小技巧:在做模型集成时,不要用固定的权重。我通常根据最近30天的预测误差来动态调整权重——哪个模型最近表现好,就给它更高的权重。这个方法虽然简单,但效果往往比固定权重好不少。
好了,关于基差回归与机器学习的结合,今天就聊到这儿。三种模型各有千秋,关键还是看你的数据特征和交易场景。记住一点:模型只是工具,对市场的理解才是核心。
公众号:蓝海资料掘金营,微信deep3321