订单簿微观结构:限价订单簿的构成、买卖价差、市场深度与订单流
做市交易的核心,说白了就是跟订单簿打交道。你每天盯着屏幕上的买一卖一,其实只是冰山一角。今天我们来拆解一下,订单簿到底长什么样,里面藏着哪些门道。
限价订单簿的构成
限价订单簿,英文叫 Limit Order Book,简称 LOB。它本质上就是一个价格-数量的映射表。买方挂单在左侧,卖方挂单在右侧,中间是价差。
我个人习惯把订单簿想象成一个「排队系统」。每个价格档位就是一个窗口,窗口后面站着想在这个价格成交的人。价格越优,排得越靠前。
举个例子,假设当前 BTC/USDT 的订单簿长这样:
| 买价 (Bid) | 数量 (Size) | 卖价 (Ask) | 数量 (Size) |
|---|---|---|---|
| 100.00 | 1.5 | 100.05 | 2.0 |
| 99.95 | 3.0 | 100.10 | 1.8 |
| 99.90 | 2.2 | 100.15 | 3.5 |
这里有个细节:买一价 100.00 是最高的买入报价,卖一价 100.05 是最低的卖出报价。中间这 0.05 的差距,就是买卖价差。
核心概念:订单簿的每一档都代表一个「价格承诺」。挂单的人承诺:如果有人愿意以这个价格跟我成交,我就卖/买给你。
买卖价差:做市商的利润来源
价差,英文叫 Spread。它是最直观的市场流动性指标。价差越小,说明市场越活跃,流动性越好。
我在项目中遇到过一种情况:某个小币种,平时价差只有 0.01 USDT,但一到半夜,价差能拉到 0.10 USDT。为什么?因为做市商都下班了,没人提供流动性。
价差的计算很简单:
spread = ask_price - bid_price
relative_spread = spread / mid_price
其中 mid_price 是中间价,也就是 (ask + bid) / 2。相对价差更能反映真实的交易成本。
实战经验:我个人习惯用相对价差来判断是否值得做市。如果相对价差小于 0.01%,说明竞争太激烈,利润空间很小。如果大于 0.1%,说明市场深度不足,风险较高。
市场深度:你能吃下多少单子
市场深度,简单说就是「在某个价格附近,有多少单子等着成交」。深度越厚,大单对价格的冲击越小。
你想想看,如果你要买入 100 个 BTC,而买一档只有 2 个 BTC 的挂单,那你的单子会一路吃掉好几档,价格瞬间被推高。这就是深度不足的后果。
衡量市场深度,我常用两个指标:
- 深度总量:从当前价格到某个价格区间内,所有挂单的总数量。
- 深度斜率:价格每变动一个 tick,挂单量的变化速度。
我曾经踩过一个坑:只看深度总量,没看深度斜率。结果发现某个价格档位突然被撤单,深度瞬间塌陷,我的做市策略直接暴露在风险中。嗯,从那以后,我每次都会检查深度分布的均匀性。
订单流:市场的脉搏
订单流,就是所有订单的到达序列。它记录了每一笔订单的到达时间、方向、价格和数量。
为什么订单流重要?因为静态的订单簿只能告诉你「现在是什么样」,而订单流能告诉你「正在发生什么」。
举个例子,如果你看到连续 10 笔市价买单,但价格没怎么涨,说明卖方在源源不断地提供流动性。反过来,如果价格快速拉升,说明买方在主动吃单,卖方在被动防守。
我个人习惯把订单流分成两类:
- 主动订单:市价单,立即成交,吃掉对手方的挂单。
- 被动订单:限价单,挂在订单簿上等待成交。
主动订单是「攻击方」,被动订单是「防守方」。做市商本质上是在做防守方,靠提供流动性赚取价差。
避坑指南:我曾经在分析订单流时,只关注了成交的订单,忽略了撤单。结果发现,很多「假深度」其实是高频交易者挂单后秒撤造成的。一定要把撤单也纳入分析范围。
知识体系结构图
下面这张图,我把订单簿微观结构的核心要素串起来了。你可以把它当作一个思维导图来用。
实战中的订单簿分析
光讲理论没意思,我们来看一段实际代码。这是我常用的一个订单簿快照解析函数:
def parse_orderbook_snapshot(data):
"""
解析交易所返回的订单簿快照
data: {'bids': [[price, size], ...], 'asks': [[price, size], ...]}
"""
bids = sorted(data['bids'], key=lambda x: x[0], reverse=True)
asks = sorted(data['asks'], key=lambda x: x[0])
best_bid = bids[0][0] if bids else 0
best_ask = asks[0][0] if asks else 0
spread = best_ask - best_bid
mid_price = (best_bid + best_ask) / 2
# 计算前5档深度
bid_depth = sum([b[1] for b in bids[:5]])
ask_depth = sum([a[1] for a in asks[:5]])
return {
'best_bid': best_bid,
'best_ask': best_ask,
'spread': spread,
'mid_price': mid_price,
'bid_depth_5': bid_depth,
'ask_depth_5': ask_depth,
'depth_imbalance': (bid_depth - ask_depth) / (bid_depth + ask_depth)
}
这里有个小技巧:depth_imbalance 这个指标,我用来判断当前市场的买卖力量对比。正值说明买方深度更大,负值说明卖方深度更大。当然,这只是一个静态快照,真正的决策还要结合订单流动态来看。
个人建议:不要只看前几档深度。我习惯把整个订单簿的深度分布画成曲线,看看有没有「断层」或者「堆积」。这些异常点往往是做市机会或者风险信号。
好了,订单簿的微观结构就聊到这里。记住一句话:订单簿是市场的「心电图」,订单流是「心跳」。两者结合起来看,你才能读懂市场的真实意图。