订单簿微观结构:限价订单簿的构成、买卖价差、市场深度与订单流

做市交易的核心,说白了就是跟订单簿打交道。你每天盯着屏幕上的买一卖一,其实只是冰山一角。今天我们来拆解一下,订单簿到底长什么样,里面藏着哪些门道。

限价订单簿的构成

限价订单簿,英文叫 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 这个指标,我用来判断当前市场的买卖力量对比。正值说明买方深度更大,负值说明卖方深度更大。当然,这只是一个静态快照,真正的决策还要结合订单流动态来看。

个人建议:不要只看前几档深度。我习惯把整个订单簿的深度分布画成曲线,看看有没有「断层」或者「堆积」。这些异常点往往是做市机会或者风险信号。

好了,订单簿的微观结构就聊到这里。记住一句话:订单簿是市场的「心电图」,订单流是「心跳」。两者结合起来看,你才能读懂市场的真实意图。

专注资料整理