订单簿预测:深度、方向、成交量与事件

订单簿预测,说白了就是盯着盘口的买卖挂单,猜接下来会发生什么。我做了这么多年量化,发现很多人把这事想得太玄乎了。其实核心就四个方向:深度会怎么变?价格往哪走?能成交多少?会不会有异常事件?

嗯,咱们一个一个来拆解。

订单簿深度预测

深度预测,就是预测未来几秒或几分钟内,买一卖一、买五卖五这些价位的挂单量会变成多少。我个人习惯把它当作一个时序回归问题来处理。

核心思路:把订单簿的快照数据(比如每100ms一次)当作特征,预测下一个时间点的深度分布。

我在项目中遇到过一个问题:直接用原始挂单量做预测,效果很差。为什么?因为挂单量波动太大,而且有大量噪音。后来我改用对数变换,效果好了不少。

常用的特征包括:

  • 当前各档位的挂单量及变化率
  • 买卖价差(spread)
  • 订单簿不平衡度(bid-ask imbalance)
  • 最近N笔成交的成交量加权价格

模型方面,我建议从LSTM开始试。别一上来就搞Transformer,数据量不够反而容易过拟合。

# 一个简单的LSTM深度预测示例
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

def build_depth_predictor(input_shape, output_size=10):
    model = Sequential([
        LSTM(64, return_sequences=True, input_shape=input_shape),
        LSTM(32),
        Dense(16, activation='relu'),
        Dense(output_size)  # 预测未来10个档位的挂单量
    ])
    model.compile(optimizer='adam', loss='mse')
    return model

# 假设特征维度为20,时间步长为50
model = build_depth_predictor((50, 20))
model.summary()

小技巧:训练时可以用分位数损失(quantile loss),这样不仅能预测均值,还能给出置信区间。我在实盘里就是这么干的,比单纯MSE靠谱得多。

价格方向预测

价格方向预测,就是判断接下来价格会涨还是跌。很多人觉得这是圣杯,其实它只是整个策略的一环。

我个人习惯把这个问题分成两类:

  • 短期方向(秒级到分钟级):主要依赖订单簿的微观特征
  • 中期方向(分钟级到小时级):需要结合成交量和事件信息

我曾经踩过一个坑:用全量订单簿数据训练模型,结果过拟合严重。后来我意识到,很多特征其实是冗余的。比如买一和买二的变化高度相关,没必要都放进去。

我建议的特征组合:

特征类别 具体特征 说明
订单簿形态 价差、深度不平衡、斜率 反映当前供需状态
成交动态 最近成交价变化、成交量 反映资金流向
微观结构 订单到达率、撤销率 反映市场参与者的行为

模型选择上,我推荐用XGBoost做分类。为什么?因为它对特征工程的要求没那么高,而且训练速度快。你想想看,做高频预测,模型训练时间太长根本没法迭代。

注意:价格方向预测的准确率很难超过60%。如果有人跟你说他能做到80%,要么是过拟合,要么是用了未来数据。别信。

成交量预测

成交量预测,说白了就是猜接下来能成交多少手。这个在算法交易里特别重要——你要拆单,得知道市场能吸收多少。

我习惯把成交量预测分成两个层次:

  1. 微观成交量:未来1-10秒内的成交笔数和手数
  2. 宏观成交量:未来几分钟到几小时的累计成交量

微观层面,我常用的是泊松回归或者负二项回归。为什么?因为成交量是计数数据,用线性回归会出问题。我曾经用线性回归试过,预测值经常出现负数,你说这合理吗?

# 使用泊松回归预测短期成交量
from sklearn.linear_model import PoissonRegressor
import numpy as np

# 假设特征X已经准备好,y是未来1秒的成交量
X = np.random.randn(1000, 10)  # 10个特征
y = np.random.poisson(lam=5, size=1000)  # 泊松分布模拟

model = PoissonRegressor(alpha=0.1)
model.fit(X, y)

# 预测
pred = model.predict(X[:5])
print(f"预测成交量: {pred}")

宏观层面,我建议用GRU或者简单的Transformer。不过要注意,成交量有很强的日周期性和周周期性,别忘了加入时间特征。

经验之谈:成交量预测的误差通常服从对数正态分布。所以评估时别用MAE,用MAPE(平均绝对百分比误差)更合理。

事件预测

事件预测,就是预测一些特殊事件,比如大单出现、价格跳空、订单簿异常等。这个最难,但收益也最大。

我把它分成三类:

  • 大单事件:单笔成交超过某个阈值(比如平均成交量的5倍)
  • 价格跳空:价格在极短时间内出现大幅变动
  • 订单簿异常:比如深度突然消失、价差急剧扩大

这类问题,我建议用异常检测的思路来做。具体来说:

  1. 先定义什么是「正常」的订单簿状态
  2. 然后检测偏离正常状态的程度
  3. 当偏离超过阈值时,发出预警

我曾经在实盘里部署过一个事件预测系统,用的是孤立森林(Isolation Forest)。效果还行,但有个问题:误报率太高。后来我加了一个规则过滤器——只有连续3个时间步都检测到异常,才触发预警。误报率降了一半。

核心逻辑:事件预测不是要精确预测事件发生的时刻,而是要提前几秒到几十秒给出预警信号。这已经足够做风控了。

下面是我画的一张流程图,把整个订单簿预测的知识体系串起来了:

订单簿预测知识体系 订单簿预测 深度预测 方向预测 成交量预测 事件预测 LSTM时序模型 对数变换特征 分位数损失 XGBoost分类 订单簿不平衡 准确率≤60% 泊松/负二项回归 GRU宏观预测 MAPE评估 孤立森林检测 大单/跳空/异常 连续预警过滤 核心:特征工程 + 模型选择 + 风控过滤 没有银弹,只有不断迭代

最后说一句,订单簿预测没有银弹。我见过太多人花几个月调参,结果还不如一个简单的移动平均策略。我的建议是:先跑通最简单的基线模型,再逐步加复杂度。别一上来就搞深度学习,先把特征工程做好,效果往往出乎意料。

我的习惯:每次迭代只改一个变量。比如这周只优化特征,下周只调模型参数。这样出了问题,你能立刻知道是哪里改坏了。

无相订单流研究社 微信Lucian808555