2. 订单簿微观结构:限价单与市价单、买卖价差、订单簿深度与弹性
做市商这行,说白了就是跟订单簿打交道。你每天盯着的那个不断跳动的数字列表,就是你的战场。我刚开始做市的时候,总觉得订单簿就是一堆买单卖单堆在那,后来被市场狠狠教育了几次,才真正理解它的微观结构有多重要。
今天咱们就聊聊订单簿的四个核心要素:限价单、市价单、买卖价差,还有深度和弹性。这些东西搞明白了,你才知道自己的库存风险到底在哪。
2.1 限价单与市价单:两种基本武器
做市商手里就两种订单类型,限价单和市价单。听起来简单,但用起来门道很多。
限价单(Limit Order),就是你指定一个价格,挂在那等人来吃。比如BTC当前价格30000,你挂个29950的买单,那就等着价格跌下来成交。限价单提供流动性,但存在不成交的风险——价格没到你的价位,你就只能干瞪眼。
市价单(Market Order),就是不管三七二十一,按当前最优价格立刻成交。你想买,就直接吃掉卖一价。市价单消耗流动性,但保证成交——代价是你要承受滑点。
我个人习惯把限价单比作钓鱼,市价单比作直接去菜市场买鱼。钓鱼可能等半天没收获,但价格好;直接买贵点,但马上能吃到。
核心关系:限价单提供流动性,市价单消耗流动性。做市商主要挂限价单赚价差,但必要时也会用市价单调整库存。
我在项目中遇到过一件事:有个新手做市商,为了抢成交量,大量使用市价单吃单。结果一天下来,手续费加上滑点,把赚的价差全赔进去了。嗯,这里要注意——市价单是工具,不是玩具。
2.2 买卖价差:做市商的饭碗
买卖价差(Bid-Ask Spread),就是买一价和卖一价之间的差额。说白了,这就是做市商的利润来源。你低价买,高价卖,中间的差价就是你的收入。
但价差不是固定的。它受几个因素影响:
- 流动性:交易量大的品种,价差通常小。比如BTC/USDT,主流交易所价差可能只有0.01%。
- 波动性:市场波动大的时候,做市商不敢挂太近的价,价差会扩大。
- 竞争程度:做市商越多,价差越薄。这是个内卷的行业。
举个例子,假设某股票当前买一价10.00,卖一价10.02,价差就是0.02元。如果你做市,每成交一个来回,理论上赚0.02元。但别忘了手续费和库存风险,实际利润要打折扣。
实战技巧:我一般会监控价差的动态变化。如果价差突然扩大,说明市场可能出问题了——要么流动性枯竭,要么有大波动要来。这时候我会缩小挂单量,甚至暂停做市。
2.3 订单簿深度:你的安全垫
订单簿深度,指的是不同价格水平上的挂单量。深度好的市场,你吃个几百万的单子,价格几乎不动。深度差的市场,几十万就能把价格打穿。
深度通常用深度图来展示。横轴是价格,纵轴是累计挂单量。你想想看,如果买一价下面密密麻麻全是买单,那价格就很难跌下去。反过来,卖一价上面堆满卖单,上涨也费劲。
我做市的时候,最怕的就是深度不足。有一次做一个小币种的做市,订单簿上买一只有几百个币,结果一个大户砸了5000个币的市价单,直接把价格砸穿了3%。我的库存瞬间亏损。从那以后,我给自己定了个规矩:深度不足的品种,坚决不做市。
避坑指南:我曾经因为只看买一卖一,忽略了深度,结果被大单打穿。现在我会同时看订单簿前10档的累计深度。如果前5档的总量小于我库存的10%,我会立刻缩小挂单规模。
2.4 订单簿弹性:市场的恢复能力
弹性(Resilience),指的是订单簿被大单冲击后,恢复到正常状态的速度。弹性好的市场,大单吃完后,新的限价单会迅速补上来,价差很快恢复正常。弹性差的市场,大单吃完后,订单簿就像被掏空了一样,半天恢复不过来。
弹性可以用一个简单的指标衡量:恢复时间。从大单成交到订单簿恢复到冲击前80%的深度,这个时间越短,弹性越好。
我记得有一次做ETH的做市,一个巨量市价单把卖一到卖五全吃了。但不到3秒钟,新的卖单就涌了进来,价差只扩大了0.02%就恢复了。这就是弹性好的典型表现。
反过来,如果一个大单吃完后,订单簿空了十几秒,价差扩大了好几倍,那你就要小心了——市场可能处于脆弱状态,随时可能继续波动。
2.5 知识体系结构图
下面这张图,把订单簿微观结构的核心逻辑串起来了。你可以看到,限价单和市价单是基础,它们决定了价差和深度,而弹性则是整个系统的动态特性。
2.6 实战中的订单簿分析
光讲理论没用,咱们得能动手。下面是我常用的一个订单簿分析代码片段,用来计算价差和深度指标。
import pandas as pd
import numpy as np
def analyze_orderbook(bids, asks):
"""
分析订单簿的核心指标
bids: [[price, volume], ...] 买单列表
asks: [[price, volume], ...] 卖单列表
"""
# 买卖价差
best_bid = bids[0][0]
best_ask = asks[0][0]
spread = best_ask - best_bid
spread_bps = spread / best_bid * 10000 # 以基点表示
# 前5档深度
bid_depth_5 = sum([v for p, v in bids[:5]])
ask_depth_5 = sum([v for p, v in asks[:5]])
# 深度不平衡指标
depth_imbalance = (bid_depth_5 - ask_depth_5) / (bid_depth_5 + ask_depth_5)
# 价格冲击成本(吃100个单位的成本)
def market_impact(volume, side='buy'):
remaining = volume
cost = 0
if side == 'buy':
for price, vol in asks:
if remaining <= 0:
break
trade_vol = min(remaining, vol)
cost += trade_vol * price
remaining -= trade_vol
else:
for price, vol in bids:
if remaining <= 0:
break
trade_vol = min(remaining, vol)
cost += trade_vol * price
remaining -= trade_vol
avg_price = cost / volume
return avg_price
impact_buy = market_impact(100, 'buy')
impact_sell = market_impact(100, 'sell')
return {
'spread': spread,
'spread_bps': spread_bps,
'bid_depth_5': bid_depth_5,
'ask_depth_5': ask_depth_5,
'depth_imbalance': depth_imbalance,
'impact_buy': impact_buy,
'impact_sell': impact_sell
}
# 示例数据
bids = [[100.0, 50], [99.9, 100], [99.8, 150], [99.7, 200], [99.6, 250]]
asks = [[100.1, 50], [100.2, 100], [100.3, 150], [100.4, 200], [100.5, 250]]
result = analyze_orderbook(bids, asks)
print(f"价差: {result['spread_bps']:.2f} bps")
print(f"买五档深度: {result['bid_depth_5']}, 卖五档深度: {result['ask_depth_5']}")
print(f"深度不平衡: {result['depth_imbalance']:.2%}")
这段代码我用了好几年,每次接入新交易所都会跑一遍,看看订单簿的健康状况。你想想看,如果深度不平衡指标超过0.3,说明买单明显多于卖单,价格可能短期偏强。这时候我会调整做市策略,多挂一些卖单。
个人习惯:我每天开盘前会跑一次这个分析,记录当天的价差和深度基线。如果盘中指标偏离基线超过2倍标准差,我会手动检查市场,看是不是有什么异常。
好了,订单簿微观结构就聊到这。这些东西看着基础,但真正吃透了,你就能从订单簿的跳动中读出市场的情绪和风险。做市商不是靠运气赚钱,是靠对微观结构的深刻理解。