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 知识体系与核心逻辑

下面这张图,我把整个逻辑串起来了:

订单簿信息熵计算流程 原始订单簿 价格 + 挂单量 概率分布 p_i = 挂单量_i / 总挂单量 计算熵值 H = -Σ p_i log₂(p_i) 买单侧熵 (H_bid) 基于买盘挂单的概率分布 卖单侧熵 (H_ask) 基于卖盘挂单的概率分布 归一化处理 H_norm = H / log₂(N) → 范围 [0, 1]

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