4. 订单簿信息熵定义:将订单簿视为概率分布
好,咱们进入正题。
前面几章我们聊了信息熵的基本概念,也看了订单簿的微观结构。现在,是时候把这两者真正结合起来了。
说白了,订单簿信息熵就是——把订单簿里的挂单量,看作一个概率分布,然后计算这个分布的不确定性。
我刚开始接触这个思路时,也觉得有点绕。订单簿明明是价格和数量的集合,怎么就成了概率分布?
嗯,这里的关键在于视角转换。
4.1 从挂单量到概率质量
想象一下,你面前有一个订单簿。买一价挂了100手,买二价挂了200手,买三价挂了50手……卖一侧同理。
如果我们把所有挂单的总量看作一个整体(比如100%),那么每个价格档位上的挂单量,就相当于这个整体的一部分。
这不就是概率吗?
核心思想:
将每个价格档位上的挂单量,除以总挂单量,得到该价格档位的“概率”。
这个概率反映了市场在当前价格水平上的“共识强度”或“流动性集中度”。
举个例子:
| 价格档位 | 挂单量(手) | 概率(挂单量/总量) |
|---|---|---|
| 买一 (100.0) | 100 | 100/350 ≈ 0.286 |
| 买二 (99.9) | 200 | 200/350 ≈ 0.571 |
| 买三 (99.8) | 50 | 50/350 ≈ 0.143 |
| 合计 | 350 | 1.0 |
你看,这样就把订单簿变成了一个离散概率分布。每个价格档位对应一个概率值。
我个人习惯: 在计算时,我会把买卖两侧分开处理。因为买盘和卖盘代表的是不同的市场力量,混在一起算会丢失信息。
4.2 买卖两侧的熵值计算
有了概率分布,计算熵就很简单了。直接用香农熵公式:
H = - Σ (p_i * log₂(p_i))
其中 p_i 是第 i 个价格档位的概率。
对于买单侧和卖单侧,我们分别计算:
- 买单熵 (H_bid): 反映买盘挂单的分散程度。熵值高,说明买盘挂单分散,没有明确的支撑位;熵值低,说明买盘集中在少数价格上,支撑位明确。
- 卖单熵 (H_ask): 反映卖盘挂单的分散程度。熵值高,说明卖盘分散,抛压不集中;熵值低,说明卖盘集中在少数价格上,阻力位明确。
我在项目中遇到过这样的情况:某只股票在盘整期,买卖两侧的熵值都很高,说明多空双方都在观望,没有形成合力。一旦某侧熵值突然下降,往往预示着方向选择即将到来。
4.3 归一化处理:让熵值可比较
直接算出来的熵值有个问题——它受价格档位数量的影响。
比如,一个只有3档价格的订单簿,最大熵是 log₂(3) ≈ 1.58。而一个有10档价格的订单簿,最大熵是 log₂(10) ≈ 3.32。
这两个值没法直接比较。
所以我们需要归一化。
归一化的方法很简单:
H_norm = H / H_max
其中 H_max = log₂(N),N 是价格档位的数量。
归一化后的熵值范围在 [0, 1] 之间:
- 0: 所有挂单集中在同一个价格档位,确定性最高。
- 1: 挂单均匀分布在所有价格档位,不确定性最高。
注意: 我曾经踩过一个坑——当某个价格档位的挂单量为0时,log₂(0) 是未定义的。所以在计算前,一定要把挂单量为0的档位剔除掉,或者给一个极小值(比如 1e-10)来避免除零错误。
4.4 知识体系与核心逻辑
下面这张图,我把整个逻辑串起来了:
4.5 代码实现:从理论到实践
光说不练假把式。下面是一个简单的 Python 实现:
import numpy as np
def order_book_entropy(volumes):
"""
计算订单簿某一侧的熵值
参数:
volumes: list, 每个价格档位的挂单量
返回:
entropy: float, 归一化后的熵值
"""
# 剔除挂单量为0的档位
volumes = [v for v in volumes if v > 0]
if not volumes:
return 0.0
# 计算概率分布
total = sum(volumes)
probs = [v / total for v in volumes]
# 计算香农熵
entropy = -sum(p * np.log2(p) for p in probs)
# 归一化
n = len(volumes)
max_entropy = np.log2(n)
normalized_entropy = entropy / max_entropy if max_entropy > 0 else 0.0
return normalized_entropy
# 示例用法
bid_volumes = [100, 200, 50, 30, 10] # 买一到买五
ask_volumes = [80, 150, 100, 40, 20] # 卖一到卖五
h_bid = order_book_entropy(bid_volumes)
h_ask = order_book_entropy(ask_volumes)
print(f"买单侧熵: {h_bid:.4f}")
print(f"卖单侧熵: {h_ask:.4f}")
避坑指南: 我曾经在实盘环境中直接用这个函数处理全量订单簿数据,结果发现性能瓶颈。后来加了两个优化:一是只取前20档价格(深度的边际贡献很小),二是用 numpy 向量化计算。速度提升了近百倍。
4.6 熵值的实际含义
算出来熵值之后,怎么用?
我总结了几条经验:
- H_bid 和 H_ask 都接近 0: 多空双方都在关键价位重兵把守,市场处于僵持状态,波动率可能下降。
- H_bid 低、H_ask 高: 买盘集中(有强支撑),卖盘分散(抛压不集中),短期偏多。
- H_bid 高、H_ask 低: 买盘分散,卖盘集中(有强阻力),短期偏空。
- 两者都接近 1: 市场极度不确定,多空都在试探,容易出现剧烈波动。
你想想看,这其实就是在用信息论的语言,描述市场的“共识度”。
熵值低,说明市场有共识;熵值高,说明市场在分歧。
嗯,这一章的内容就到这里。核心就是三件事:把订单簿变成概率分布、分别计算买卖两侧的熵、然后归一化。代码也给了,你可以直接拿去跑跑看。
公众号:蓝海资料掘金营,微信deep3321