3、订单簿特征工程:盘口不平衡指标、订单簿斜率、价格冲击模型、流动性度量指标、订单簿熵

做量化交易这些年,我越来越觉得——订单簿就是市场的脉搏。你盯着K线看,看到的是结果;你盯着订单簿看,看到的是过程。这一章,咱们就来聊聊怎么从订单簿里挖出那些真正有用的特征。

说白了,特征工程就是把原始数据变成能喂给模型的“养料”。订单簿数据量大、噪声多,直接扔进去肯定不行。我个人的习惯是,先构建几个核心指标,再逐步组合。下面这五个方向,是我在实战中反复打磨过的。

核心观点:订单簿特征不是越多越好,关键是每个特征都要有清晰的微观结构解释。

3.1 盘口不平衡指标

这个指标,我愿称之为“订单簿的晴雨表”。它衡量的是买盘和卖盘的力量对比。公式很简单:

盘口不平衡 = (买一量 - 卖一量) / (买一量 + 卖一量)

取值范围在 -1 到 1 之间。正值表示买方强势,负值表示卖方强势。嗯,这里要注意——只看买一卖一是不够的

我曾经在回测一个高频策略时,发现盘口不平衡指标经常出现“假信号”。后来我深入排查,发现是因为大单挂在买二买三位置,买一只是小单。所以后来我改用了加权版本:

加权不平衡 = Σ(买i量 * 权重i) - Σ(卖i量 * 权重i) / 总深度

权重可以用价格距离的倒数,或者直接用指数衰减。我个人习惯用前5档,权重设为 [1, 0.8, 0.6, 0.4, 0.2]。

实战技巧:盘口不平衡指标在开盘和收盘时段效果最好,因为这时候订单簿的“博弈”最激烈。午盘横盘期,这个指标容易失效。

3.2 订单簿斜率

斜率这个概念,其实是从限价订单的“价格-累积量”曲线里来的。你想想看,如果买盘在靠近最优价的位置堆积了大量订单,那曲线就会很陡;如果订单分散在各个价位,曲线就会很平缓。

我一般这样计算:

斜率 = (累积量_远端 - 累积量_近端) / (价格_远端 - 价格_近端)

具体来说,我会取买一到买五的累积量,拟合一条直线,斜率就是这条线的陡峭程度。斜率越大,说明订单越集中在近端,市场“护盘”意愿强;斜率越小,说明订单稀疏,价格容易滑点。

我记得有一次做股指期货的订单簿分析,发现斜率指标在趋势行情中会突然变平——这说明大资金在撤单,准备发动一波行情。这个发现后来成了我们策略的一个重要预警信号。

避坑指南:我曾经在计算斜率时忽略了价格档位的非均匀性。有些交易所的tick size不一样,比如比特币的0.01和0.1,直接算斜率会失真。一定要先做价格归一化。

3.3 价格冲击模型

价格冲击模型,说白了就是回答一个问题:我吃多少量,价格会动多少?这个在实盘交易中太重要了。

最经典的模型是Kyle的λ模型:

ΔP = λ * Q

其中ΔP是价格变化,Q是成交量,λ就是市场深度系数。λ越小,说明市场越深,吃单对价格影响小。

但在实际应用中,我更喜欢用瞬时冲击模型。它考虑的是订单簿的实时状态:

冲击成本 = Σ(价格i * 量i) / 总成交量 - 当前最优价

举个例子,你想买100手,但买一只有20手,买二有30手,买三有50手。那你的实际成交均价就会高于买一价。这个差值,就是冲击成本。

我建议在策略中把这个指标做成实时监控。当冲击成本突然变大时,说明流动性在枯竭,这时候最好暂停交易。

3.4 流动性度量指标

流动性这个词,大家天天挂在嘴边,但怎么量化?我常用的有三个维度:

指标 计算公式 含义
买卖价差 卖一价 - 买一价 最直接的流动性度量,越小越好
市场深度 买一到买五的总量 + 卖一到卖五的总量 衡量市场能承接多少订单
Amihud非流动性指标 |收益率| / 成交量 单位成交量引起的价格波动

我个人最常用的是深度加权价差

深度加权价差 = (卖一价 * 卖一量 + 买一价 * 买一量) / (卖一量 + 买一量)

这个指标比单纯的价差更稳定。为什么?因为它把量也考虑进去了。有时候价差虽然小,但量也小,这种流动性其实是“虚”的。

一个小技巧:把流动性指标和波动率结合起来看。高波动+低流动性,是典型的“危险组合”,这时候做市策略要格外小心。

3.5 订单簿熵

熵这个概念,是从信息论里借来的。它衡量的是订单簿的“混乱程度”。公式如下:

熵 = - Σ(pi * log(pi))

其中pi是第i档订单量占总订单量的比例。熵值越大,说明订单分布越均匀,市场越“无序”;熵值越小,说明订单集中在少数价位,市场有明确的“共识”。

我刚开始接触这个指标时,觉得它有点玄乎。直到有一次在分析一个闪崩事件时,发现订单簿熵在崩盘前突然飙升——这说明市场参与者意见分歧巨大,流动性在快速分散。嗯,从那以后,我就把熵作为风险监控的必备指标了。

实际计算时,我一般取前10档数据。代码实现也很简单:

import numpy as np

def order_book_entropy(bids, asks, levels=10):
    # bids和asks是二维数组,每行是[价格, 量]
    all_volumes = np.concatenate([bids[:levels, 1], asks[:levels, 1]])
    total_volume = np.sum(all_volumes)
    if total_volume == 0:
        return 0
    probs = all_volumes / total_volume
    entropy = -np.sum(probs * np.log(probs + 1e-10))
    return entropy
注意:熵值对档位数敏感。档位越多,熵值越大。所以不同品种之间不能直接比较熵的绝对值,要看相对变化。

知识体系总览

下面这张图,是我自己梳理的订单簿特征工程框架。你可以把它当作一个“检查清单”,每次做特征时对照一下:

订单簿特征工程 盘口不平衡 买盘 vs 卖盘力量 订单簿斜率 价格-累积量曲线 价格冲击模型 吃单对价格的影响 流动性度量 价差/深度/Amihud 订单簿熵 订单分布的混乱度 简单不平衡 加权不平衡 线性拟合 指数拟合 Kyle λ模型 瞬时冲击 买卖价差 市场深度 Shannon熵 Rényi熵 核心目标:从订单簿中提取可预测市场行为的特征 方向性预测 做市策略 风险监控

这五个特征,每一个单独拿出来都能写一篇论文。但在实战中,我更建议你组合使用。比如盘口不平衡+斜率,可以判断趋势的持续性;流动性+熵,可以识别市场异常状态。

最后说一句:特征工程没有银弹。同样的指标,在股票、期货、加密货币上的表现可能天差地别。我的建议是——先跑一遍回测,看看哪些特征对你的策略有稳定的贡献,然后再深入优化。


公众号:蓝海资料掘金营,微信deep3321