3. 订单簿微观结构:限价订单簿(L2/L3)、盘口深度、买卖价差、市场冲击成本

做市商这行干久了,你会发现一个道理:价格波动是表象,订单簿才是真相。我刚开始做量化的时候,整天盯着K线图看,觉得涨涨跌跌挺有规律。后来被市场狠狠教育了几次,才明白——真正决定价格的,是那一层一层挂着的限价单。

今天咱们就来扒一扒订单簿的微观结构。说白了,就是看看市场这个「大水池」里,水到底有多深,暗流又在哪里。

3.1 限价订单簿:市场的「实时地图」

限价订单簿(LOB),你可以把它想象成一个双向拍卖市场。一边是买家,一边是卖家,中间是成交价。

我个人习惯把L2和L3分开看:

  • L2数据:聚合后的盘口。比如「买一价100.00,数量500股;买二价99.99,数量1200股...」。它告诉你每个价位上有多少单子,但不知道这些单子是谁挂的。
  • L3数据:每一笔订单的原始信息。谁挂的?什么时候挂的?ID是什么?这就像拿到了市场的「户籍档案」。

我在做高频做市的时候,L3数据是必须的。为什么?因为你能看到订单的撤销和修改行为。有人挂了一个大单,3秒后又撤了——这可能是试探,也可能是陷阱。L2数据里你只能看到「哦,这个价位有单子」,但L3能告诉你「这个单子活了多久」。

核心观点:L2告诉你「有什么」,L3告诉你「发生了什么」。

3.2 盘口深度:别被表面价格骗了

盘口深度,就是每个价位上的挂单量。很多人只看买卖价差,觉得差1个tick就是流动性好。其实不然。

举个例子:

# 模拟盘口深度数据
order_book = {
    'asks': [  # 卖盘
        (100.00, 100),   # 卖一价100.00,只有100股
        (100.01, 5000),  # 卖二价100.01,有5000股
        (100.02, 200),
    ],
    'bids': [  # 买盘
        (99.99, 300),    # 买一价99.99,300股
        (99.98, 10000),  # 买二价99.98,10000股
        (99.97, 150),
    ]
}

def calculate_market_depth(book, levels=5):
    """计算前N档的累计深度"""
    ask_depth = sum(qty for price, qty in book['asks'][:levels])
    bid_depth = sum(qty for price, qty in book['bids'][:levels])
    return ask_depth, bid_depth

ask_d, bid_d = calculate_market_depth(order_book, 2)
print(f"前2档卖盘深度: {ask_d}股")
print(f"前2档买盘深度: {bid_d}股")

你看,卖一只有100股,但卖二有5000股。如果你只看卖一价,觉得「哇,价差才0.01,流动性真好」。但真要买1000股,你得吃掉卖一,再吃掉卖二的一部分——成交均价就变成了100.009,比卖一贵了0.9%。

这就是深度的重要性。我见过不少新手做市商,只看价差不看深度,结果被大单一口吞掉,滑点吃到哭。

3.3 买卖价差:做市商的「面包和黄油」

买卖价差(Bid-Ask Spread),就是买一价和卖一价之间的差距。这是做市商的主要收入来源——你低价买,高价卖,赚的就是这个差价。

但价差不是固定的。它受很多因素影响:

因素 影响方向 我遇到过的案例
波动率 波动越大,价差越宽 财报发布前,价差能扩大3-5倍
成交量 成交量越大,价差越窄 BTC在亚洲时段价差明显比欧美时段宽
时间 开盘/收盘时段价差宽 A股开盘前5分钟,价差经常是平时的2倍
订单不平衡 买卖单失衡时价差扩大 某次大额卖单涌入,价差瞬间从0.01跳到0.05

我个人习惯用相对价差来衡量,而不是绝对价差。比如一个100块的股票,价差0.01,相对价差是0.01%;一个1块的币,价差0.01,相对价差就是1%。后者明显更难做市。

小技巧:计算相对价差用 (卖一价 - 买一价) / 中间价 × 100%。如果这个值超过0.5%,我一般会降低报价频率,等市场稳定再说。

3.4 市场冲击成本:大单的「隐形杀手」

市场冲击成本,就是你下单时「推动」价格的那部分成本。它不像手续费那样明码标价,但往往比手续费贵得多。

我举个例子你就明白了:

假设当前盘口是这样的:

卖一: 100.00  1000股
卖二: 100.01  2000股
卖三: 100.02  3000股

你想买3000股。如果直接市价买入:

  • 吃掉卖一1000股,成交价100.00
  • 吃掉卖二2000股,成交价100.01
  • 成交均价 = (100.00×1000 + 100.01×2000) / 3000 = 100.0067
  • 相比卖一价,你多付了0.0067/股,这就是冲击成本

冲击成本 = 成交均价 - 最优卖价(或最优买价 - 成交均价)

我曾经踩过一个坑:在流动性差的币对上做市,以为价差小就安全。结果一个大单进来,直接把价格推了2%,我的库存瞬间浮亏。从那以后,我每次报价前都会算一下「每档深度占比」——就是每个价位的挂单量占总深度的比例。如果前3档深度占比超过80%,说明流动性集中,风险相对可控;如果前3档只占30%,那后面可能藏着大单,得小心。

避坑指南:我曾经在ETH/BTC交易对上,看到买一只有10个ETH,但买二到买五加起来有500个ETH。我以为是深度好,结果发现那些大单是「幽灵单」——挂上去就撤,撤了又挂。真实流动性其实很差。所以,别只看静态深度,要看动态行为

3.5 知识体系总览

下面这张图,是我自己梳理的订单簿微观结构知识框架。做市商策略的每一步,都离不开这些基础概念。

订单簿微观结构知识体系 订单簿微观结构 限价订单簿(L2/L3) 盘口深度 买卖价差 市场冲击成本 聚合数据 原始订单 累计深度 深度分布 绝对价差 相对价差 瞬时冲击 永久冲击 核心目标:降低信息不对称,优化报价策略

3.6 实战中的微观结构应用

说了这么多理论,咱们来点实际的。做市商策略里,订单簿微观结构怎么用?

  1. 报价频率调整:当盘口深度突然变薄(比如前3档深度下降30%以上),我会降低报价频率,避免被「钓鱼」。
  2. 价差动态设置:根据相对价差和波动率,动态调整报价价差。波动率上升时,价差放宽;流动性好时,价差收窄。
  3. 大单处理:如果检测到盘口出现「冰山订单」(挂单量远大于显示量),我会暂停报价,等冰山融化再说。
  4. 库存管理:结合市场冲击成本模型,计算最优的报价量和报价价格,避免库存过度暴露。
一句话总结:订单簿微观结构,就是做市商的「雷达」。你看得越清楚,策略就越安全。

嗯,这一章的内容就到这儿。记住,数据是死的,但市场是活的。别死记硬背那些指标,多去观察、多去复盘。你会发现,订单簿里藏着很多市场的「小秘密」。