第二章 订单簿微观结构:限价订单簿的构成、价格优先与时间优先原则、订单簿的深度与宽度
做市商这行,说白了就是跟订单簿打交道。你每天盯着的那个不断跳动的数字矩阵,就是我们的战场。我个人习惯把订单簿比作一个「多层停车场」——每一层价格都是一个车位,每个车位上都停着不同数量的车(订单)。今天我们就来拆解这个停车场到底是怎么运作的。
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 图来展示订单簿的完整结构。这张图我画了很多次,每次给团队新人培训时都会用到。
这张图把整个订单簿的骨架都画出来了。左侧是卖单,右侧是买单,中间是价差。每个价格档位上的订单数量,就是深度。从最低价到最高价的范围,就是宽度。
核心总结:订单簿的微观结构,本质上是一个「价格-时间-数量」的三维空间。价格决定了优先级,时间决定了同价位的排队顺序,数量决定了市场的承载能力。做市商的所有策略,都是在这个三维空间里寻找最优的「站位」。
好了,这一章的内容就到这里。记住,理解订单簿是成为合格做市商的第一步。下一章我们会聊到订单簿的动态变化——当新订单进来时,整个结构是如何演变的。
公众号:蓝海资料掘金营,微信deep3321