第二章 订单簿微观结构:限价订单簿的构成、价格优先与时间优先原则、订单簿的深度与宽度

做市商这行,说白了就是跟订单簿打交道。你每天盯着的那个不断跳动的数字矩阵,就是我们的战场。我个人习惯把订单簿比作一个「多层停车场」——每一层价格都是一个车位,每个车位上都停着不同数量的车(订单)。今天我们就来拆解这个停车场到底是怎么运作的。

2.1 限价订单簿(LOB)的构成

限价订单簿,英文叫 Limit Order Book,简称 LOB。它记录着所有尚未成交的限价订单。我刚开始做量化时,以为订单簿就是简单的买一卖一,后来才发现,真正的微观结构远比这复杂。

一个标准的 LOB 由两部分组成:

  • 买单队列(Bid Side):按价格从高到低排列。最高买价叫 Best Bid。
  • 卖单队列(Ask Side):按价格从低到高排列。最低卖价叫 Best Ask。

中间那个空隙,就是买卖价差(Spread)。

核心概念:订单簿中的每一个价格水平,都对应一个「价格档位」(Price Level)。每个档位上可能堆积着多个订单,这些订单按到达时间排队。

举个例子,假设当前 BTC 的订单簿长这样:

卖单价格 卖单数量 买单价格 买单数量
100.05 200 99.95 150
100.04 100 99.94 300
100.03 500 99.93 80
100.02 250 99.92 450
100.01 600 99.91 200

这里 Best Ask 是 100.01,Best Bid 是 99.95,价差为 0.06。嗯,这里要注意,价差越小,说明市场流动性越好。

2.2 价格优先与时间优先原则

这是订单簿的「宪法」。所有交易所都遵循这个规则,没有例外。

价格优先:买单出价高的优先成交,卖单要价低的优先成交。说白了,谁出的价更「激进」,谁就先走。

时间优先:当价格相同时,先到订单簿的订单优先成交。这个规则决定了我们做市商抢单的策略。

我的经验:在价格优先面前,时间优先就是个「辅助规则」。我曾经见过有人为了抢时间优先,把订单价格提高 0.01 个 tick,结果反而因为价格太激进,被吃掉了。记住,价格优先永远是第一位的。

为什么会这样设计?你想想看,如果时间优先优先于价格优先,那所有人都可以挂一个极端的低价然后慢慢等,市场就乱套了。交易所要保证的是「最优价格成交」,而不是「最早到达成交」。

2.3 订单簿的深度与宽度

这两个概念经常被混淆,我当年也踩过坑。

订单簿深度(Depth):指在某个价格水平上,所有订单的总数量。深度越大,说明这个价格水平上的「厚度」越足。比如上面表格中,100.01 这个价格有 600 个卖单,深度就是 600。

订单簿宽度(Width):指订单簿覆盖的价格范围。从最低买单到最高卖单,这个区间就是宽度。宽度越大,说明市场参与者的报价范围越广。

避坑指南:我曾经犯过一个错误——只看深度不看宽度。有一次我发现某个价格档位深度很大,以为流动性很好,结果一查,整个订单簿只有 3 个价格档位,宽度极窄。这种市场一旦出现大单,价格会瞬间滑穿好几个档位。所以,深度和宽度要一起看。

在实际做市策略中,我通常会关注以下几个指标:

  • Top-of-Book 深度:买卖一档的订单数量。这决定了你能否快速成交。
  • 累计深度:从 Best Bid 往下数 N 个档位的总买单量,或者从 Best Ask 往上数 N 个档位的总卖单量。这决定了市场的「抗冲击能力」。
  • 宽度比率:宽度除以中间价格。比率越小,说明市场越集中。

下面我用一个简单的 Python 代码来演示如何计算这些指标:

def compute_lob_metrics(bids, asks):
    """
    bids: list of (price, volume) 买单队列,按价格降序
    asks: list of (price, volume) 卖单队列,按价格升序
    """
    best_bid = bids[0][0]
    best_ask = asks[0][0]
    spread = best_ask - best_bid
    
    # 计算买卖一档深度
    bid_depth_top = bids[0][1]
    ask_depth_top = asks[0][1]
    
    # 计算前5档累计深度
    cum_bid_depth = sum(v for _, v in bids[:5])
    cum_ask_depth = sum(v for _, v in asks[:5])
    
    # 计算宽度(价格范围)
    width = asks[-1][0] - bids[-1][0]
    mid_price = (best_bid + best_ask) / 2
    width_ratio = width / mid_price
    
    return {
        'spread': spread,
        'bid_depth_top': bid_depth_top,
        'ask_depth_top': ask_depth_top,
        'cum_bid_depth_5': cum_bid_depth,
        'cum_ask_depth_5': cum_ask_depth,
        'width': width,
        'width_ratio': width_ratio
    }

这段代码虽然简单,但我在实盘策略中每天跑几百次。你想想看,如果某个时刻 cum_bid_depth_5 突然变小,而 width_ratio 突然变大,说明市场正在「变薄」且「变散」,这时候做市商应该收缩报价,减少风险暴露。

2.4 订单簿的微观结构图

下面我用一张 SVG 图来展示订单簿的完整结构。这张图我画了很多次,每次给团队新人培训时都会用到。

限价订单簿微观结构图 卖单队列 (Ask Side) 价格 100.05 数量 200 价格 100.04 数量 100 价格 100.03 数量 500 价格 100.02 数量 250 价格 100.01 (Best Ask) 数量 600 价差 (Spread) = 0.06 买单队列 (Bid Side) 价格 99.95 (Best Bid) 数量 150 价格 99.94 数量 300 价格 99.93 数量 80 价格 99.92 数量 450 价格 99.91 数量 200 关键指标 📊 深度 (Depth): Best Ask 深度 = 600,Best Bid 深度 = 150 📏 宽度 (Width): 从 99.91 到 100.05,宽度 = 0.14 ⚖️ 价格优先: 买单 99.95 优先于 99.94,卖单 100.01 优先于 100.02

这张图把整个订单簿的骨架都画出来了。左侧是卖单,右侧是买单,中间是价差。每个价格档位上的订单数量,就是深度。从最低价到最高价的范围,就是宽度。

核心总结:订单簿的微观结构,本质上是一个「价格-时间-数量」的三维空间。价格决定了优先级,时间决定了同价位的排队顺序,数量决定了市场的承载能力。做市商的所有策略,都是在这个三维空间里寻找最优的「站位」。

好了,这一章的内容就到这里。记住,理解订单簿是成为合格做市商的第一步。下一章我们会聊到订单簿的动态变化——当新订单进来时,整个结构是如何演变的。


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