第二章 市场微观结构:订单簿(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 总结

订单簿是市场的微观缩影。做市商的一切策略,都建立在对订单簿的理解之上。记住三点:

  1. 价差是你的利润来源,也是风险信号。
  2. 深度决定了你能承受多大的订单。
  3. 订单类型选对了,事半功倍;选错了,血本无归。

嗯,这一章就到这里。下一章,我们会深入讲解如何利用订单簿数据,构建一个简单的做市策略。到时候,我会分享一些我在实战中踩过的坑,保证让你少走弯路。