3、订单簿动态分析:限价单与市价单、订单簿重建与快照、买卖压力计算、订单簿不平衡指标

做市策略的核心,说白了就是跟订单簿打交道。你每天盯着那个不断跳动的深度图,其实背后藏着很多门道。今天这一节,我带你把这些门道拆开揉碎了讲清楚。

3.1 限价单与市价单:订单簿的两种基本元素

订单簿里只有两种订单:限价单和市价单。这个道理大家都懂,但实际跑策略时,很多人会忽略它们的本质区别。

限价单,就是挂在那里等人来吃。你设定一个价格,然后排队。它给市场提供了流动性。我个人习惯把限价单叫做「被动单」——你不主动成交,而是等着别人来成交你。

市价单,就是直接吃掉对手盘上最好的价格。它消耗流动性。说白了,市价单是「主动单」,你进场就要立刻成交,代价是付出滑点。

嗯,这里要注意一个坑:限价单不一定能成交,市价单不一定有好价格。我在做高频做市策略时,曾经因为限价单挂得太远,结果行情瞬间拉穿,单子根本没吃到利润,反而被套住了。后来我学乖了——限价单的挂单位置,必须结合订单簿的深度来定。

核心观点: 限价单提供流动性,市价单消耗流动性。做市商的核心任务,就是用限价单赚取买卖价差,同时用市价单管理风险。

3.2 订单簿重建与快照:你看到的数据是怎么来的

交易所给的数据,通常有两种形式:增量更新全量快照

增量更新,就是告诉你「第5档价格变了」「第10档数量撤了」。你需要自己维护一个本地的订单簿,每次收到增量就更新它。这个过程叫订单簿重建

全量快照,就是直接把当前整个订单簿的深度发给你。你拿到手就能直接用,不用自己拼。

你想想看,如果你做高频策略,用全量快照肯定不行——数据量太大,延迟太高。所以大部分量化系统都走增量更新路线。但增量更新有个致命问题:丢包。一旦你漏掉一条增量消息,本地订单簿就跟交易所对不上了。

避坑指南: 我曾经因为网络抖动丢了一个增量包,结果本地订单簿的买卖盘口全乱了,策略直接开反向单,亏了十几万。后来我加了一个定时校验机制——每5秒拉一次全量快照,跟本地订单簿做对比,发现不一致就立即重建。

订单簿重建的伪代码,大概长这样:

# 伪代码:订单簿重建流程
class OrderBook:
    def __init__(self):
        self.bids = {}  # 买盘,价格-数量映射
        self.asks = {}  # 卖盘,价格-数量映射
    
    def apply_snapshot(self, snapshot):
        # 全量快照直接覆盖
        self.bids = snapshot['bids']
        self.asks = snapshot['asks']
    
    def apply_update(self, update):
        # 增量更新:新增、修改、删除
        for side in ['bids', 'asks']:
            for price, size in update[side]:
                if size == 0:
                    # 数量为0表示删除该档位
                    del self[side][price]
                else:
                    # 否则更新或新增
                    self[side][price] = size
    
    def rebuild(self, snapshot):
        # 重建:先清空,再加载快照
        self.bids.clear()
        self.asks.clear()
        self.apply_snapshot(snapshot)

3.3 买卖压力计算:谁在主导市场

订单簿里,买盘和卖盘的深度对比,直接反映了市场情绪。我常用的一个指标叫买卖压力比(Bid-Ask Pressure Ratio)。

计算方法很简单:

买卖压力比 = 买盘总深度 / 卖盘总深度

如果比值大于1,说明买盘更强,市场偏多。小于1,说明卖盘更强,市场偏空。

但这里有个细节:深度应该算多少档? 我个人习惯只算前10档。为什么?因为太远的档位流动性差,挂单容易被撤,参考意义不大。你想想看,第50档挂了一个大单,可能只是某个大户在钓鱼,根本不会成交。

档位数 买盘深度(BTC) 卖盘深度(BTC) 买卖压力比
前5档 120.5 98.3 1.23
前10档 245.8 210.2 1.17
前20档 410.3 395.6 1.04

你看,档位越多,比值越趋近于1。因为远端的挂单大多是随机挂的,没有太多信息量。所以做策略时,我一般只看前10档的买卖压力。

3.4 订单簿不平衡指标:一个更灵敏的信号

买卖压力比虽然直观,但不够灵敏。有时候买盘和卖盘深度差不多,但价格却在快速上涨。为什么?因为挂单的分布形态不一样。

我常用的一个改进指标叫订单簿不平衡指标(Order Book Imbalance, OBI)。它的计算公式是:

OBI = (买盘加权深度 - 卖盘加权深度) / (买盘加权深度 + 卖盘加权深度)

加权深度怎么算?不是简单累加数量,而是按价格距离加权。离当前价格越近的档位,权重越大。

举个例子:

# 加权深度计算示例
def weighted_depth(orders, current_price, decay=0.9):
    """
    orders: [(价格, 数量), ...]
    current_price: 当前最新成交价
    decay: 衰减系数,越远权重越小
    """
    total = 0
    for price, size in orders:
        distance = abs(price - current_price)
        weight = decay ** distance  # 指数衰减
        total += size * weight
    return total

这个指标的值域在-1到1之间。大于0表示买盘占优,小于0表示卖盘占优。绝对值越大,不平衡越严重。

实战技巧: 我习惯把OBI和价格走势结合起来看。如果OBI持续为正但价格不涨,说明有人在挂假单托市,随时可能撤单砸盘。这时候我会反向做空。这个信号比单纯看深度准得多。

3.5 知识体系总览

下面这张图,把订单簿动态分析的核心逻辑串起来了。你可以把它当作一个思维导图来理解。

订单簿动态分析 限价单 vs 市价单 限价单:提供流动性,被动成交 市价单:消耗流动性,主动成交 ⚠ 限价单可能不成交 订单簿重建与快照 增量更新:实时维护本地订单簿 全量快照:定时校验,防丢包 ⚠ 丢包会导致订单簿错乱 买卖压力计算 压力比 = 买盘深度 / 卖盘深度 建议只看前10档深度 订单簿不平衡指标 OBI = 加权深度差 / 加权深度和 近端权重高,远端权重低 核心目标:通过订单簿结构预判短期价格方向

这张图把四个知识点串在了一起。你从左上角开始看,限价单和市价单是基础,订单簿重建是数据来源,买卖压力和不平衡指标是分析工具。最终目标只有一个:通过订单簿结构,预判短期价格方向

好了,这一节的内容就到这里。记住,订单簿分析不是看静态的数字,而是看动态的变化。挂单在撤、新单在进、价格在动——这些信号组合在一起,才是真正的市场语言。

专注资料整理