订单簿预测:深度、方向、成交量与事件
订单簿预测,说白了就是盯着盘口的买卖挂单,猜接下来会发生什么。我做了这么多年量化,发现很多人把这事想得太玄乎了。其实核心就四个方向:深度会怎么变?价格往哪走?能成交多少?会不会有异常事件?
嗯,咱们一个一个来拆解。
订单簿深度预测
深度预测,就是预测未来几秒或几分钟内,买一卖一、买五卖五这些价位的挂单量会变成多少。我个人习惯把它当作一个时序回归问题来处理。
核心思路:把订单簿的快照数据(比如每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-10秒内的成交笔数和手数
- 宏观成交量:未来几分钟到几小时的累计成交量
微观层面,我常用的是泊松回归或者负二项回归。为什么?因为成交量是计数数据,用线性回归会出问题。我曾经用线性回归试过,预测值经常出现负数,你说这合理吗?
# 使用泊松回归预测短期成交量
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倍)
- 价格跳空:价格在极短时间内出现大幅变动
- 订单簿异常:比如深度突然消失、价差急剧扩大
这类问题,我建议用异常检测的思路来做。具体来说:
- 先定义什么是「正常」的订单簿状态
- 然后检测偏离正常状态的程度
- 当偏离超过阈值时,发出预警
我曾经在实盘里部署过一个事件预测系统,用的是孤立森林(Isolation Forest)。效果还行,但有个问题:误报率太高。后来我加了一个规则过滤器——只有连续3个时间步都检测到异常,才触发预警。误报率降了一半。
核心逻辑:事件预测不是要精确预测事件发生的时刻,而是要提前几秒到几十秒给出预警信号。这已经足够做风控了。
下面是我画的一张流程图,把整个订单簿预测的知识体系串起来了:
最后说一句,订单簿预测没有银弹。我见过太多人花几个月调参,结果还不如一个简单的移动平均策略。我的建议是:先跑通最简单的基线模型,再逐步加复杂度。别一上来就搞深度学习,先把特征工程做好,效果往往出乎意料。
我的习惯:每次迭代只改一个变量。比如这周只优化特征,下周只调模型参数。这样出了问题,你能立刻知道是哪里改坏了。