3、订单簿动态分析:限价单与市价单、订单簿重建与快照、买卖压力计算、订单簿不平衡指标
做市策略的核心,说白了就是跟订单簿打交道。你每天盯着那个不断跳动的深度图,其实背后藏着很多门道。今天这一节,我带你把这些门道拆开揉碎了讲清楚。
3.1 限价单与市价单:订单簿的两种基本元素
订单簿里只有两种订单:限价单和市价单。这个道理大家都懂,但实际跑策略时,很多人会忽略它们的本质区别。
限价单,就是挂在那里等人来吃。你设定一个价格,然后排队。它给市场提供了流动性。我个人习惯把限价单叫做「被动单」——你不主动成交,而是等着别人来成交你。
市价单,就是直接吃掉对手盘上最好的价格。它消耗流动性。说白了,市价单是「主动单」,你进场就要立刻成交,代价是付出滑点。
嗯,这里要注意一个坑:限价单不一定能成交,市价单不一定有好价格。我在做高频做市策略时,曾经因为限价单挂得太远,结果行情瞬间拉穿,单子根本没吃到利润,反而被套住了。后来我学乖了——限价单的挂单位置,必须结合订单簿的深度来定。
3.2 订单簿重建与快照:你看到的数据是怎么来的
交易所给的数据,通常有两种形式:增量更新和全量快照。
增量更新,就是告诉你「第5档价格变了」「第10档数量撤了」。你需要自己维护一个本地的订单簿,每次收到增量就更新它。这个过程叫订单簿重建。
全量快照,就是直接把当前整个订单簿的深度发给你。你拿到手就能直接用,不用自己拼。
你想想看,如果你做高频策略,用全量快照肯定不行——数据量太大,延迟太高。所以大部分量化系统都走增量更新路线。但增量更新有个致命问题:丢包。一旦你漏掉一条增量消息,本地订单簿就跟交易所对不上了。
订单簿重建的伪代码,大概长这样:
# 伪代码:订单簿重建流程
class OrderBook:
def __init__(self):
self.bids = {} # 买盘,价格-数量映射
self.asks = {} # 卖盘,价格-数量映射
def apply_snapshot(self, snapshot):
# 全量快照直接覆盖
self.bids = snapshot['bids']
self.asks = snapshot['asks']
def apply_update(self, update):
# 增量更新:新增、修改、删除
for side in ['bids', 'asks']:
for price, size in update[side]:
if size == 0:
# 数量为0表示删除该档位
del self[side][price]
else:
# 否则更新或新增
self[side][price] = size
def rebuild(self, snapshot):
# 重建:先清空,再加载快照
self.bids.clear()
self.asks.clear()
self.apply_snapshot(snapshot)
3.3 买卖压力计算:谁在主导市场
订单簿里,买盘和卖盘的深度对比,直接反映了市场情绪。我常用的一个指标叫买卖压力比(Bid-Ask Pressure Ratio)。
计算方法很简单:
买卖压力比 = 买盘总深度 / 卖盘总深度
如果比值大于1,说明买盘更强,市场偏多。小于1,说明卖盘更强,市场偏空。
但这里有个细节:深度应该算多少档? 我个人习惯只算前10档。为什么?因为太远的档位流动性差,挂单容易被撤,参考意义不大。你想想看,第50档挂了一个大单,可能只是某个大户在钓鱼,根本不会成交。
| 档位数 | 买盘深度(BTC) | 卖盘深度(BTC) | 买卖压力比 |
|---|---|---|---|
| 前5档 | 120.5 | 98.3 | 1.23 |
| 前10档 | 245.8 | 210.2 | 1.17 |
| 前20档 | 410.3 | 395.6 | 1.04 |
你看,档位越多,比值越趋近于1。因为远端的挂单大多是随机挂的,没有太多信息量。所以做策略时,我一般只看前10档的买卖压力。
3.4 订单簿不平衡指标:一个更灵敏的信号
买卖压力比虽然直观,但不够灵敏。有时候买盘和卖盘深度差不多,但价格却在快速上涨。为什么?因为挂单的分布形态不一样。
我常用的一个改进指标叫订单簿不平衡指标(Order Book Imbalance, OBI)。它的计算公式是:
OBI = (买盘加权深度 - 卖盘加权深度) / (买盘加权深度 + 卖盘加权深度)
加权深度怎么算?不是简单累加数量,而是按价格距离加权。离当前价格越近的档位,权重越大。
举个例子:
# 加权深度计算示例
def weighted_depth(orders, current_price, decay=0.9):
"""
orders: [(价格, 数量), ...]
current_price: 当前最新成交价
decay: 衰减系数,越远权重越小
"""
total = 0
for price, size in orders:
distance = abs(price - current_price)
weight = decay ** distance # 指数衰减
total += size * weight
return total
这个指标的值域在-1到1之间。大于0表示买盘占优,小于0表示卖盘占优。绝对值越大,不平衡越严重。
3.5 知识体系总览
下面这张图,把订单簿动态分析的核心逻辑串起来了。你可以把它当作一个思维导图来理解。
这张图把四个知识点串在了一起。你从左上角开始看,限价单和市价单是基础,订单簿重建是数据来源,买卖压力和不平衡指标是分析工具。最终目标只有一个:通过订单簿结构,预判短期价格方向。
好了,这一节的内容就到这里。记住,订单簿分析不是看静态的数字,而是看动态的变化。挂单在撤、新单在进、价格在动——这些信号组合在一起,才是真正的市场语言。