第二章 订单簿深度解析

做市商的核心战场,就是订单簿。

我经常跟团队里的新人说,如果你看不懂订单簿,那你做市就是在闭着眼睛开车。今天咱们就把订单簿掰开揉碎,从结构到实战,一步步讲清楚。

2.1 订单簿结构:Bid 与 Ask

订单簿说白了,就是一个「想买的人」和「想卖的人」的排队列表。

左边是 Bid(买方队列),右边是 Ask(卖方队列)。中间那个缝隙,就是当前的市场价差。

我举个例子你就明白了:

Bid 价格Bid 数量Ask 价格Ask 数量
100.10500100.15300
100.091200100.16800
100.082000100.171500
100.073500100.182200

看到没?最高买入价是 100.10,最低卖出价是 100.15。这 0.05 的差距,就是 价差(Spread)。做市商赚的就是这个差价。

核心概念:价差 = 最低 Ask 价 - 最高 Bid 价。价差越小,流动性越好。

2.2 限价单与市价单

这两种订单类型,是做市商每天打交道最多的东西。

限价单(Limit Order):你指定一个价格,挂在那里等成交。比如我挂一个 100.10 的买单,那只有价格跌到 100.10 或以下才会成交。限价单提供流动性,是做市商的主要工具。

市价单(Market Order):不管价格,直接吃掉当前最优的对手单。比如我下了一个市价买单,系统会立刻吃掉 Ask 队列里最便宜的 300 手,成交价 100.15。市价单消耗流动性。

嗯,这里要注意:市价单虽然成交快,但滑点风险大。我见过有人用市价单砸盘,结果把价格打穿了两个档位,多亏了好几个基点。

实战技巧:做市商通常用限价单挂双边,赚取价差。但遇到大行情时,我也会用市价单快速平掉库存风险。

2.3 订单簿的构建与更新

订单簿不是静态的。每一秒都有成千上万的订单进来、撤单、成交。交易所会通过增量快照(Incremental Snapshot)的方式,把变化推送给做市商。

我个人习惯用这样的数据结构来维护订单簿:

class OrderBook:
    def __init__(self):
        self.bids = {}  # 价格 -> 数量
        self.asks = {}  # 价格 -> 数量
        self.best_bid = 0.0
        self.best_ask = float('inf')
    
    def update(self, side, price, size):
        if size == 0:
            # 撤单:删除该价格档位
            if side == 'bid':
                self.bids.pop(price, None)
            else:
                self.asks.pop(price, None)
        else:
            # 新增或更新
            if side == 'bid':
                self.bids[price] = size
            else:
                self.asks[price] = size
        
        # 更新最优价格
        if side == 'bid':
            self.best_bid = max(self.bids.keys()) if self.bids else 0.0
        else:
            self.best_ask = min(self.asks.keys()) if self.asks else float('inf')

这段代码看起来简单,但实际生产环境里,订单簿的更新速度是微秒级的。我曾经在优化过程中,因为用了 Python 的 dict 导致延迟过高,后来换成了红黑树结构才解决问题。

避坑指南:千万不要在订单簿更新时做复杂的计算。把计算逻辑放到单独的线程里,否则你会错过下一个 tick。

2.4 深度图与市场流动性

深度图,就是把订单簿可视化。横轴是价格,纵轴是累计挂单量。你一眼就能看出哪个价位有支撑,哪个价位有阻力。

我画了一张简单的 SVG 图,帮你理解深度图的结构:

订单簿深度图示例 价差 Bid 100.10 Ask 100.15 累计深度 累计深度

深度图的斜率,反映了流动性。斜率越陡,说明该价位附近挂单越密集,流动性越好。反之,如果深度图很平缓,说明市场很薄,一个大单就能把价格打穿。

我记得有一次做 BTC 的做市,深度图显示 50000 附近有大量买单堆积。我当时判断这是一个强支撑位,于是放心地加大了挂单量。结果一个巨鲸砸了 2000 个 BTC 的市价单,直接把支撑打穿了。嗯,从那以后我学会了看「真实深度」——要把那些可能撤单的虚假挂单剔除掉。

流动性指标:我常用「市场深度 1%」来衡量流动性——即当前价格上下 1% 范围内,总共能成交多少量。这个数值越大,市场越健康。

2.5 实战中的订单簿洞察

说了这么多理论,咱们聊聊实战中怎么看订单簿。

  • 大单挂单:如果 Bid 侧突然出现一个大单,可能是有人在托底。但也要小心,可能是诱多。
  • 撤单速度:如果某个价位的挂单频繁撤了又挂,挂了又撤,大概率是算法在试探市场。
  • 价差变化:价差突然扩大,说明流动性在流失。这时候我会降低挂单量,减少风险暴露。
  • 订单簿不平衡:如果 Bid 总量远大于 Ask 总量,短期看涨情绪强。反之亦然。
一个小技巧:我习惯监控「订单簿斜率比」——即 Bid 侧前 5 档的累计深度除以 Ask 侧前 5 档的累计深度。比值大于 1.2 或小于 0.8 时,往往预示着短期方向变化。

订单簿这东西,看一天和看一年,感觉完全不一样。刚开始你可能觉得就是一堆数字在跳,但时间久了,你能从这些数字里读出市场的情绪、博弈的痕迹,甚至能预判接下来几秒钟的走势。

说白了,订单簿就是市场的脉搏。做市商要做的,就是顺着这个脉搏,在每一次跳动中赚取那一点点差价。


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