第19章 机器学习在深度分析中的应用:随机森林、LSTM、深度特征工程
说实话,做市场深度分析这么多年,我见过太多人把机器学习当成万能药。一上来就上LSTM,结果跑出来的预测还不如简单的移动平均线。为什么会这样?因为大家忽略了一个核心问题——特征工程才是机器学习的灵魂。
今天我就把我在实盘交易中积累的经验,拆开来跟你聊聊。随机森林、LSTM、深度特征工程,这三样东西怎么用在市场深度分析上,咱们一个一个说清楚。
19.1 随机森林:订单簿特征的重要性排序
随机森林这个算法,说白了就是一群决策树投票。每棵树都学一点特征,最后综合判断。我在做高频策略时,最喜欢用它来做特征重要性排序。
为什么?因为市场深度数据里,特征太多了。买卖10档的价格、数量、价差、斜率……你不可能全塞进去。随机森林能告诉你:哪些特征真正有用。
核心思路:用随机森林对订单簿特征进行重要性排序,筛选出对价格变动影响最大的特征子集。
举个例子。我曾在某个期货品种上,用随机森林跑了1000棵树。结果发现,买1档的挂单量变化率和卖1档到卖2档的价差,这两个特征的重要性远超其他。嗯,这其实符合微观结构理论——最靠近成交价的订单,信息含量最高。
# 随机森林特征重要性示例(伪代码)
from sklearn.ensemble import RandomForestRegressor
# 特征:买卖10档量价、价差、斜率等
X = order_book_features
# 目标:未来1秒的价格变动
y = future_price_change
model = RandomForestRegressor(n_estimators=1000, max_depth=10)
model.fit(X, y)
# 输出特征重要性
importance = model.feature_importances_
top_features = np.argsort(importance)[-10:] # 取前10个
我的经验:随机森林的max_depth别设太大。我试过设到20,结果过拟合严重,回测漂亮,实盘一塌糊涂。一般5-10就够了。
19.2 LSTM:捕捉订单簿的时序依赖
随机森林有个硬伤——它看不到时间顺序。而市场深度数据,本质上是时间序列。上一秒的挂单变化,会影响下一秒的价格走向。
这时候LSTM就派上用场了。LSTM能记住过去的信息,捕捉长期依赖。我在做日内策略时,用LSTM预测短期价格方向,效果比传统模型好不少。
但要注意,LSTM不是万能的。我曾经踩过一个坑:直接把原始订单簿数据喂进去,结果模型训练了三天,收敛效果极差。后来才发现,数据标准化和序列长度选择是关键。
# LSTM模型结构示例
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
model = Sequential()
model.add(LSTM(64, input_shape=(lookback, n_features), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(32, return_sequences=False))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy')
避坑指南:我曾经把lookback设成100步,以为越多越好。结果模型记住了太多噪声,预测效果反而变差。后来我改成20步,效果明显提升。记住:不是越长越好,要匹配你的交易频率。
19.3 深度特征工程:从原始数据到有效特征
这是我最想强调的部分。很多人觉得特征工程就是算几个指标,其实远不止如此。深度特征工程,是把原始订单簿数据,转换成能反映市场微观结构的特征。
我个人习惯把特征分成三类:
| 特征类别 | 具体特征 | 说明 |
|---|---|---|
| 基础特征 | 买卖价差、中间价、挂单量 | 直接从订单簿计算 |
| 衍生特征 | 斜率、曲率、不平衡度 | 反映订单簿形状 |
| 高阶特征 | 订单流毒性、信息份额 | 需要结合成交数据 |
举个例子。订单簿不平衡度(Order Book Imbalance)是我常用的一个特征。它计算的是买盘和卖盘的相对力量:
# 订单簿不平衡度计算
def order_book_imbalance(bid_volumes, ask_volumes, levels=5):
"""
bid_volumes: 买1到买5的挂单量
ask_volumes: 卖1到卖5的挂单量
"""
total_bid = sum(bid_volumes[:levels])
total_ask = sum(ask_volumes[:levels])
if total_bid + total_ask == 0:
return 0
imbalance = (total_bid - total_ask) / (total_bid + total_ask)
return imbalance
这个特征的值域在[-1, 1]之间。正值表示买盘强,负值表示卖盘强。我在实盘中发现,当不平衡度超过0.6时,价格短期内上涨的概率超过70%。
深度特征工程的核心:不是堆砌特征,而是理解每个特征背后的微观结构含义。一个有效的特征,往往对应着某种市场行为模式。
19.4 三者如何协同工作
你可能会问:随机森林、LSTM、深度特征工程,这三者怎么配合?
我的做法是这样的:
- 先用随机森林做特征筛选,从几十个特征中选出最重要的10-15个
- 再用深度特征工程,对这些特征进行变换和组合,生成高阶特征
- 最后用LSTM,捕捉这些特征在时间序列上的依赖关系
说白了,就是随机森林负责「选什么」,特征工程负责「怎么造」,LSTM负责「怎么用」。三者缺一不可。
我的建议:别一上来就搞复杂的模型。先用随机森林跑一遍,看看哪些特征重要。然后手动分析这些特征,理解它们的微观结构含义。最后再考虑用LSTM。这样能少走很多弯路。
19.5 知识体系总览
下面这张图,是我对本章知识体系的总结。你可以看到,从原始订单簿数据出发,经过特征工程、模型训练、到最终决策,每一步都有对应的技术和方法。
嗯,这张图其实也反映了我做量化策略的整个流程。从数据到特征,从特征到模型,从模型到决策,每一步都有讲究。你想想看,如果连原始数据都没处理好,再牛的模型也是白搭。
最后说一句:机器学习在深度分析中的应用,不是比谁的模型更复杂,而是比谁对市场微观结构的理解更深。特征工程做得好,简单的模型也能出好效果。反之,再复杂的模型也只是在拟合噪声。