3、订单簿动态分析:订单簿的构建与更新、深度图解读、订单流不平衡、买卖盘口压力分析

3.1 订单簿的构建与更新

做市商的核心战场,就是订单簿。说白了,订单簿就是交易所里所有挂单的实时快照。我个人习惯把它理解成一个「价格-数量」的二维矩阵。

订单簿的构建其实不复杂。交易所会推送两种数据:增量更新快照。增量更新告诉你「谁变了」,快照告诉你「现在长什么样」。

我建议你这么做:

  1. 先拿一个快照,初始化本地订单簿
  2. 然后不断接收增量更新,修改本地数据
  3. 每隔一段时间(比如10秒),重新拉一次快照做校准

为什么要校准?因为网络丢包或者处理延迟,会导致本地订单簿和交易所不一致。我在项目中遇到过,有一次因为没做校准,本地显示的买一价和实际差了2个tick,直接导致一笔做市单被吃掉。嗯,从那以后我再也不敢省这一步了。

下面是一个简单的订单簿更新逻辑:

class OrderBook:
    def __init__(self):
        self.bids = {}  # 价格 -> 数量
        self.asks = {}
    
    def apply_snapshot(self, snapshot):
        self.bids = {item[0]: item[1] for item in snapshot['bids']}
        self.asks = {item[0]: item[1] for item in snapshot['asks']}
    
    def apply_update(self, update):
        side = self.bids if update['side'] == 'bid' else self.asks
        price = update['price']
        size = update['size']
        if size == 0:
            side.pop(price, None)  # 撤单
        else:
            side[price] = size     # 新单或改单
注意: 增量更新的顺序很重要。如果先处理了后面的更新,再处理前面的,订单簿就乱了。我建议用队列缓存更新,按时间戳严格排序。

3.2 深度图解读

深度图,就是把订单簿可视化。横轴是价格,纵轴是累计挂单量。你想想看,它像什么?像一座山。买盘是左边的山,卖盘是右边的山。

深度图能告诉你三件事:

  • 流动性分布:哪里挂单多,哪里就是支撑位或阻力位
  • 市场深度:吃透一定数量的订单,需要滑多少点
  • 大单痕迹:突然出现的厚墙,往往是机构在操作

我记得有一次做BTC的做市,深度图上买一价附近突然出现了一个500 BTC的买单。当时很多人觉得是支撑,但我仔细一看,这个单子挂上去之后,卖盘那边也跟着堆起来了。这明显是诱多。我没跟,果然几分钟后那个大单撤了,价格直接砸下去。

深度图的解读,不能只看静态。要看动态变化。一个单子挂上去多久了?有没有被吃掉?这些信息比深度图本身更有价值。

小技巧: 我习惯把深度图分成三个区域:浅层(0-5档)、中层(5-15档)、深层(15档以上)。浅层反映短期博弈,中层反映日内趋势,深层反映大资金意图。

3.3 订单流不平衡

订单流不平衡,英文叫Order Flow Imbalance。它衡量的是「主动买」和「主动卖」的力量对比。

怎么算?很简单:

def order_flow_imbalance(trades, window=100):
    buy_volume = sum(t.size for t in trades if t.side == 'buy')
    sell_volume = sum(t.size for t in trades if t.side == 'sell')
    total = buy_volume + sell_volume
    if total == 0:
        return 0
    return (buy_volume - sell_volume) / total

这个值在-1到1之间。正值说明买方更积极,负值说明卖方更主动。但这里有个坑:不是所有成交都算主动。只有吃单的才算,挂单成交不算。为什么?因为挂单是被动的,它不反映交易意愿。

我在项目中遇到过,一开始没区分主动和被动,结果算出来的不平衡指标完全没信号。后来改了,效果立竿见影。

订单流不平衡的用法:

  • 当OFI > 0.7且价格还在低位,大概率要涨
  • 当OFI < -0.7且价格在高位,小心回调
  • OFI和价格背离时,往往是反转信号
核心观点: 订单流不平衡比成交量更能反映真实意图。成交量可以造假(对倒),但订单流很难造假,因为每一笔主动成交都要付出滑点成本。

3.4 买卖盘口压力分析

盘口压力,说白了就是「买一卖一」附近的博弈。我把它拆成三个维度:

维度 指标 含义
宽度 买卖价差 价差越小,流动性越好
深度 买一量 vs 卖一量 哪边厚,哪边支撑强
速度 挂单撤单频率 高频撤单说明有人在试盘

我个人最常用的是盘口压力比

def pressure_ratio(bid_qty, ask_qty):
    if bid_qty + ask_qty == 0:
        return 0.5
    return bid_qty / (bid_qty + ask_qty)

这个比值大于0.6,说明买盘压力大;小于0.4,说明卖盘压力大。但要注意,这只是第一档的数据。有时候第一档只有一点点,第二档却堆了厚厚一层。所以我会把前五档都算一遍,加权平均。

你想想看,如果买一只有10个币,但买二到买五有1000个币,这说明什么?说明买方在「藏单」。他们不想暴露真实意图,但又想接住可能的价格下跌。这种时候,价格往往跌不下去。

避坑指南: 我曾经因为只看第一档盘口,被假突破坑了好几次。后来我养成了习惯:至少看前三档,最好看五档。而且要注意挂单的「存活时间」——一个挂了10秒还没被吃的单子,和刚挂上去的单子,意义完全不同。

最后说一句,订单簿分析不是算命。它给的是概率,不是确定性。但如果你能把订单簿、订单流、盘口压力这三个维度结合起来看,胜率会明显提升。我在实盘里就是这么做的,效果还不错。