第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、深度特征工程,这三者怎么配合?

我的做法是这样的:

  1. 先用随机森林做特征筛选,从几十个特征中选出最重要的10-15个
  2. 再用深度特征工程,对这些特征进行变换和组合,生成高阶特征
  3. 最后用LSTM,捕捉这些特征在时间序列上的依赖关系

说白了,就是随机森林负责「选什么」特征工程负责「怎么造」LSTM负责「怎么用」。三者缺一不可。

我的建议:别一上来就搞复杂的模型。先用随机森林跑一遍,看看哪些特征重要。然后手动分析这些特征,理解它们的微观结构含义。最后再考虑用LSTM。这样能少走很多弯路。

19.5 知识体系总览

下面这张图,是我对本章知识体系的总结。你可以看到,从原始订单簿数据出发,经过特征工程、模型训练、到最终决策,每一步都有对应的技术和方法。

机器学习在深度分析中的应用框架 原始订单簿数据 深度特征工程 基础特征 → 衍生特征 → 高阶特征 订单簿不平衡度、斜率、信息份额 机器学习模型 随机森林 特征重要性排序 LSTM 时序依赖捕捉 特征筛选 降维与组合 价格弹性预测 / 交易决策 数据层 特征层 模型层 应用层

嗯,这张图其实也反映了我做量化策略的整个流程。从数据到特征,从特征到模型,从模型到决策,每一步都有讲究。你想想看,如果连原始数据都没处理好,再牛的模型也是白搭。

最后说一句:机器学习在深度分析中的应用,不是比谁的模型更复杂,而是比谁对市场微观结构的理解更深。特征工程做得好,简单的模型也能出好效果。反之,再复杂的模型也只是在拟合噪声。