4、订单簿动态特征:订单到达率模型、订单撤销行为、订单簿恢复速度、微观结构噪声
订单簿不是静止的。它每时每刻都在变化。
我刚开始做高频策略时,犯过一个低级错误——把订单簿当成快照来用。结果回测曲线漂亮得像假的一样,实盘一跑就崩。后来我才明白,订单簿的动态特征才是策略能否赚钱的关键。
这一节,我们聊聊订单簿的四个核心动态特征。说白了,就是搞清楚订单怎么来、怎么走、市场受伤后怎么恢复,以及那些让你头疼的噪声到底是怎么回事。
4.1 订单到达率模型
订单到达率,就是单位时间内新订单进入订单簿的数量。你想想看,如果每秒进来1000个订单,和每秒进来10个订单,策略逻辑肯定不一样。
最常见的模型是泊松过程。假设订单到达是独立的、均匀的,那么到达间隔服从指数分布。代码实现很简单:
import numpy as np
# 假设平均每秒到达 50 个订单
lambda_rate = 50.0
# 模拟 10 秒内的到达间隔
inter_arrival_times = np.random.exponential(1/lambda_rate, 10)
print(inter_arrival_times)
但现实没那么理想。我在实盘数据中发现,订单到达率有明显的日内模式。开盘和收盘前,到达率会飙升;中午时段,到达率会下降。所以,我个人习惯用自激励点过程(Hawkes过程)来建模。
核心要点:
- 泊松过程:简单,适合低频场景
- Hawkes过程:考虑历史事件的激励效应,适合高频场景
- 实际应用中,建议用5分钟窗口滚动估计到达率
我的经验: 曾经有一个策略,在模拟盘上表现很好,实盘却一直亏损。排查后发现,订单到达率在实盘中比模拟盘高了3倍,导致我的限价单总是排不到前面。后来我加了一个到达率自适应模块,才把问题解决。
4.2 订单撤销行为
订单撤销,是订单簿里最容易被忽视的特征。很多人只关注成交,却忽略了那些「来了又走」的订单。
为什么会这样?因为高频做市商和套利者会频繁挂单和撤单,来探测市场深度或诱骗对手。我见过一个极端案例:某个股票在1秒内,订单簿顶部被撤销和重新挂单超过200次。
订单撤销率是一个重要指标。计算公式:
撤销率 = 撤销订单数 / (成交订单数 + 撤销订单数)
一般来说,撤销率超过60%,说明市场中有大量「虚假流动性」。这时候,你看到的深度可能只是幻象。
| 市场状态 | 典型撤销率 | 策略建议 |
|---|---|---|
| 正常交易 | 30% - 50% | 正常使用限价单 |
| 高波动期 | 50% - 70% | 减少限价单,多用市价单 |
| 异常行情 | > 70% | 暂停交易,等待稳定 |
避坑指南: 我曾经在撤单率高的时段使用冰山订单,结果被高频交易者反复「钓鱼」。后来我学乖了——撤单率高的时候,要么不做,要么用暗池。
4.3 订单簿恢复速度
订单簿恢复速度,指的是大单成交后,订单簿恢复到之前状态所需的时间。这个指标直接反映了市场的韧性和流动性质量。
我习惯用恢复时间(Recovery Time)来衡量。具体做法:
- 记录大单成交时刻t0
- 记录t0时刻的买卖盘口深度D0
- 记录深度恢复到D0的90%所需时间
举个例子:
# 伪代码示例
def compute_recovery_time(order_book_snapshots, trade_time):
depth_before = get_depth_at(order_book_snapshots, trade_time)
for t in range(trade_time, trade_time + 100):
current_depth = get_depth_at(order_book_snapshots, t)
if current_depth >= 0.9 * depth_before:
return t - trade_time
return None
恢复速度快的市场(< 1秒),说明做市商活跃,流动性好。恢复速度慢(> 5秒),说明市场脆弱,大单容易造成价格滑点。
实战应用: 我做过一个统计,恢复速度快的股票,做市策略的胜率能提高15%以上。所以,我现在选标的时,一定会看这个指标。
4.4 微观结构噪声
微观结构噪声,说白了就是订单簿里那些「不干净」的信号。比如报价跳跃、买卖价差波动、订单簿深度突变等。
噪声的来源主要有三个:
- 离散报价: 价格只能以最小变动单位跳动,导致真实价格被「量化」了
- 订单流不均衡: 买卖订单到达的随机性
- 信息延迟: 不同交易所之间的数据不同步
我常用的噪声度量方法是Realized Variance(已实现方差)的分解:
# 计算微观结构噪声
def microstructure_noise(prices, interval=5):
# 计算高频已实现方差
rv_high = np.sum(np.diff(prices)**2)
# 计算低频已实现方差(降采样)
low_freq_prices = prices[::interval]
rv_low = np.sum(np.diff(low_freq_prices)**2)
# 噪声占比
noise_ratio = (rv_high - rv_low) / rv_high
return noise_ratio
当噪声占比超过30%时,很多统计套利策略会失效。我记得有一次,一个基于协整关系的配对交易策略,在噪声高的时段回测表现很好,实盘却一直亏损。后来发现,噪声把协整关系给「淹没」了。
我的建议: 处理噪声,我一般用两种方法:一是用中位数滤波平滑价格序列;二是用交易量加权价格(VWAP)代替最后一笔成交价。效果都不错。
知识体系总览
下面这张图,把订单簿动态特征的四个维度串起来了。你可以看到它们之间的关联:
嗯,这四个特征,你如果都能量化出来,那你的策略就已经超越了90%的对手。剩下的,就是实盘中的细节打磨了。
公众号:蓝海资料掘金营,微信deep3321