第二章 市场微观结构:订单簿(Order Book)深度解析
做市商这行,说白了就是跟订单簿打交道。你每天盯着屏幕,看到的那些跳动的数字,背后就是整个市场的脉搏。我个人习惯,每天早上开盘前,先花五分钟扫一眼订单簿的形态,心里就有个底了。
2.1 订单簿长什么样?
订单簿,你可以把它想象成一个「排队簿」。买方排一队,卖方排一队。每一笔挂单,都记录着价格和数量。
举个例子,假设现在 BTC/USDT 的订单簿长这样:
| 卖盘 (Ask) | 价格 | 数量 |
|---|---|---|
| 卖5 | 100.05 | 200 |
| 卖4 | 100.04 | 150 |
| 卖3 | 100.03 | 300 |
| 卖2 | 100.02 | 100 |
| 卖1 | 100.01 | 50 |
| 买盘 (Bid) | 价格 | 数量 |
| 买1 | 100.00 | 80 |
| 买2 | 99.99 | 200 |
| 买3 | 99.98 | 150 |
| 买4 | 99.97 | 100 |
| 买5 | 99.96 | 250 |
你看,卖1是 100.01,买1是 100.00。这中间的 0.01 差价,就是「价差」。价差越小,说明市场流动性越好。我在项目中遇到过,有些冷门币种价差能大到 1% 以上,那种币根本没法做市,一进去就被套。
2.2 买卖盘口与价差
盘口,就是订单簿最前面那几档。买1、买2、卖1、卖2,这些是交易最活跃的区域。
价差,是衡量市场效率的关键指标。为什么?
- 价差小:说明买卖双方博弈激烈,流动性好。你挂单很快就能成交。
- 价差大:说明市场深度不足,或者波动剧烈。这时候做市风险很高。
我记得有一次,某个小交易所的 ETH 突然价差从 0.01 扩大到 0.5。我赶紧撤单,果然,下一秒价格就暴跌了 3%。嗯,这里要注意:价差突然扩大,往往是暴风雨的前奏。
核心要点:做市商赚的就是价差。你以买1价买入,以卖1价卖出,中间的差价就是你的利润。但前提是,你得能快速成交。
2.3 深度:订单簿的「厚度」
深度,就是订单簿上每个价格档位的挂单总量。深度越厚,市场越能承受大额订单。
举个例子,如果卖1到卖5的总量是 800 个币,买1到买5的总量是 780 个币。那这个市场的深度就算不错。你想想看,如果你要买入 500 个币,会不会把价格打穿?
计算一下:
# 模拟买入 500 个币的冲击成本
def calculate_impact(buy_quantity, order_book):
"""
计算买入一定数量币的冲击成本
order_book: 卖盘列表,每个元素是 (价格, 数量)
"""
remaining = buy_quantity
total_cost = 0
for price, qty in order_book:
if remaining <= 0:
break
take = min(remaining, qty)
total_cost += take * price
remaining -= take
avg_price = total_cost / buy_quantity
return avg_price
# 假设卖盘数据
asks = [(100.01, 50), (100.02, 100), (100.03, 300), (100.04, 150), (100.05, 200)]
avg = calculate_impact(500, asks)
print(f"买入 500 个币的平均成本: {avg:.2f}")
# 输出: 买入 500 个币的平均成本: 100.03
你看,如果深度不够,你买 500 个币,可能就要吃掉卖3甚至卖4的订单,平均成本就上去了。这就是「冲击成本」。做市商最怕这个。
个人经验:我一般会监控「深度比率」——即买1到买5的总量 / 卖1到卖5的总量。如果这个比率偏离 1 太多,说明市场有偏向,可能是大资金在吃货或砸盘。
2.4 订单类型:限价单 vs 市价单
订单类型,是每个交易者必须搞清楚的。说白了,就两种:
- 限价单 (Limit Order):你指定价格,挂在那里等。成交了就是你的,不成交就挂着。
- 市价单 (Market Order):你不管价格,直接按当前最优价成交。快,但可能滑点。
做市商主要用限价单。为什么?因为我们提供流动性,赚价差。你挂一个限价单,别人来吃你的单,你就赚到了。
但市价单也有用。比如,我发现市场出现套利机会,需要快速成交,就会用市价单。不过,市价单的滑点风险很大。我曾经有一次,用市价单买入 1000 个币,结果滑点了 0.2%,直接亏了一笔。
避坑指南:我曾经在波动市里用市价单平仓,结果滑点吃掉了我一周的利润。从那以后,我给自己定了个规矩:非紧急情况,绝不用市价单。如果非要用,也要先看深度,估算滑点。
2.5 订单簿的动态变化
订单簿不是静止的。每一秒,都有新订单进来,也有订单被撤掉。做市商需要实时监控这些变化。
我个人习惯,用 Python 写一个简单的订单簿快照分析工具:
import time
class OrderBookSnapshot:
def __init__(self, bids, asks):
self.bids = bids # 买盘,按价格降序
self.asks = asks # 卖盘,按价格升序
self.timestamp = time.time()
def spread(self):
"""计算价差"""
if self.bids and self.asks:
return self.asks[0][0] - self.bids[0][0]
return None
def depth(self, levels=5):
"""计算前 N 档的总深度"""
bid_depth = sum(qty for _, qty in self.bids[:levels])
ask_depth = sum(qty for _, qty in self.asks[:levels])
return bid_depth, ask_depth
# 模拟一个快照
bids = [(100.00, 80), (99.99, 200), (99.98, 150)]
asks = [(100.01, 50), (100.02, 100), (100.03, 300)]
snap = OrderBookSnapshot(bids, asks)
print(f"价差: {snap.spread()}")
print(f"深度: 买盘 {snap.depth()[0]}, 卖盘 {snap.depth()[1]}")
这个工具虽然简单,但很实用。你想想看,如果你能实时监控价差和深度的变化,就能提前发现异常。
2.6 总结
订单簿是市场的微观缩影。做市商的一切策略,都建立在对订单簿的理解之上。记住三点:
- 价差是你的利润来源,也是风险信号。
- 深度决定了你能承受多大的订单。
- 订单类型选对了,事半功倍;选错了,血本无归。
嗯,这一章就到这里。下一章,我们会深入讲解如何利用订单簿数据,构建一个简单的做市策略。到时候,我会分享一些我在实战中踩过的坑,保证让你少走弯路。