3、订单簿动态分析:订单簿的构建与更新、深度图解读、订单流不平衡、买卖盘口压力分析
3.1 订单簿的构建与更新
做市商的核心战场,就是订单簿。说白了,订单簿就是交易所里所有挂单的实时快照。我个人习惯把它理解成一个「价格-数量」的二维矩阵。
订单簿的构建其实不复杂。交易所会推送两种数据:增量更新和快照。增量更新告诉你「谁变了」,快照告诉你「现在长什么样」。
我建议你这么做:
- 先拿一个快照,初始化本地订单簿
- 然后不断接收增量更新,修改本地数据
- 每隔一段时间(比如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的买单。当时很多人觉得是支撑,但我仔细一看,这个单子挂上去之后,卖盘那边也跟着堆起来了。这明显是诱多。我没跟,果然几分钟后那个大单撤了,价格直接砸下去。
深度图的解读,不能只看静态。要看动态变化。一个单子挂上去多久了?有没有被吃掉?这些信息比深度图本身更有价值。
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个币,这说明什么?说明买方在「藏单」。他们不想暴露真实意图,但又想接住可能的价格下跌。这种时候,价格往往跌不下去。
最后说一句,订单簿分析不是算命。它给的是概率,不是确定性。但如果你能把订单簿、订单流、盘口压力这三个维度结合起来看,胜率会明显提升。我在实盘里就是这么做的,效果还不错。