2、订单簿结构:限价单与市价单、订单簿的买卖盘口、订单簿的深度与宽度

做市商这行干久了,你会发现一个很有意思的现象:很多人把订单簿当成一个静态的表格来看。其实不是的,它更像一个活着的、会呼吸的有机体。每一秒都有新的订单进来,旧的订单被吃掉,价格在跳动,深度在变化。今天我们就来拆解这个核心结构。

2.1 限价单与市价单:两种最基本的武器

先说说最基础的东西。限价单和市价单,这两个概念我估计大家都懂,但实际用起来,坑特别多。

限价单(Limit Order),说白了就是你指定一个价格,挂在那里等。比如你觉得BTC在30000美元这个位置有支撑,你就挂一个30000的买单。价格到了,你的单子就成交;到不了,就一直在那挂着。

我个人习惯把限价单叫做「被动单」。为什么?因为你是提供流动性的人。你挂单在那里,别人来吃你的单子。在交易所眼里,你是「maker」,做市商嘛,主要就是干这个的。

市价单(Market Order),这个更直接。你不管价格多少,我就要现在成交。你想想看,这就像你冲进菜市场喊「不管多少钱,给我来一斤猪肉」。市价单是「主动单」,你是来吃流动性的,你是「taker」。

核心区别:

  • 限价单:指定价格,等待成交,提供流动性(maker)
  • 市价单:立即成交,吃掉流动性,支付手续费(taker)

我在项目中遇到过一件事,有个新手做市商,为了抢一个大的卖单,直接上了市价单。结果呢?因为深度不够,他的市价单直接把价格打穿了两个档位,多亏了好几个基点。嗯,这就是典型的「滑点」问题。所以做市商一般很少用市价单,除非你确定深度足够厚。

2.2 订单簿的买卖盘口:Bid和Ask的世界

打开任何一个交易平台的订单簿,你都会看到左右两列。左边是买单(Bid),右边是卖单(Ask)。中间那个价差,就是我们做市商吃饭的地方。

买盘(Bid Side):所有想买的人挂的限价单。价格从高到低排列。最高的那个买单价格,我们叫它「Bid 1」或者「最高买价」。

卖盘(Ask Side):所有想卖的人挂的限价单。价格从低到高排列。最低的那个卖单价格,叫「Ask 1」或者「最低卖价」。

这两个价格之间的差值,就是价差(Spread)。价差越小,说明市场越活跃,流动性越好。我记得有一次做ETH的做市,价差只有0.01美元,那感觉就像在刀尖上跳舞,每一笔单子都要算得特别精细。

盘口 价格 数量 累计
Ask 3 30,010 5.0 15.0
Ask 2 30,005 3.0 10.0
Ask 1 30,000 2.0 7.0
--- 价差: 0.5 --- ---
Bid 1 29,999.5 1.5 1.5
Bid 2 29,995 4.0 5.5
Bid 3 29,990 6.0 11.5

你看这个表格,Bid 1是29,999.5,Ask 1是30,000,价差只有0.5美元。这说明什么?说明这个市场很「薄」,但也很「紧」。薄是指每个价位的挂单量不大,紧是指价差小。

2.3 订单簿的深度与宽度:两个维度的博弈

好,接下来是重点。深度和宽度,这两个概念经常被混用,但其实它们描述的是订单簿的两个不同维度。

深度(Depth),指的是在某个价格附近,有多少订单在等着。深度越大,说明这个价格区间有足够的对手盘。你想想看,如果你要卖100个BTC,而买一只有2个BTC,那你的单子一下去,价格直接被打穿好几层。这就是深度不够。

宽度(Width),指的是订单簿覆盖的价格范围。宽度越宽,说明市场参与者的报价范围越广,市场越有韧性。我曾经见过一个冷门币种,订单簿宽度只有几个百分点,稍微大一点的单子就能把价格拉飞。

我的经验:

做市商最怕的不是深度不够,而是宽度太窄。深度不够你可以分批挂单,但宽度太窄意味着市场没有足够的「安全垫」。一旦有突发事件,价格会像断崖一样下跌或上涨。

怎么量化这两个指标?我一般用这个公式:

# 深度计算示例(Python伪代码)
def calculate_depth(order_book, price, level=10):
    """
    计算指定价格附近N个档位的总深度
    """
    bids = order_book['bids'][:level]  # 取前N档买单
    asks = order_book['asks'][:level]  # 取前N档卖单
    
    bid_depth = sum([bid[1] for bid in bids])  # 买单总数量
    ask_depth = sum([ask[1] for ask in asks])  # 卖单总数量
    
    return bid_depth, ask_depth

# 宽度计算
def calculate_width(order_book):
    """
    计算订单簿的宽度(最高买价到最低卖价之间的价格范围)
    """
    best_bid = order_book['bids'][0][0]
    best_ask = order_book['asks'][0][0]
    width = (best_ask - best_bid) / best_bid * 100  # 以百分比表示
    return width

这段代码看起来简单,但实际生产环境中,你需要考虑的东西多得多。比如,有些交易所的订单簿数据是增量推送的,你需要维护一个本地的订单簿快照。我曾经因为没处理好增量更新的时序问题,导致深度计算差了整整一个数量级,那叫一个惨。

避坑指南:

我曾经在对接某个二线交易所时,发现他们的订单簿数据有延迟。你以为看到的深度是实时的,其实已经是3秒前的数据了。3秒在加密货币市场里,足够发生很多事情。所以,一定要做延迟检测,必要时加上时间戳校验。

2.4 深度曲线的实际应用

光看数字不够直观,我习惯把深度画成曲线。横轴是价格,纵轴是累计挂单量。你会得到一条S型的曲线。

这条曲线有几个关键点:

  • 中间最陡峭的部分:就是当前价格附近,深度最集中的区域。这里流动性最好。
  • 两端的平坦区域:远离当前价格,挂单量很少。这里一旦被触及,价格会剧烈波动。
  • 曲线的斜率:斜率越大,说明价格变动对挂单量的敏感度越高。说白了,就是「一碰就倒」。

做市商策略的核心,就是在这条曲线上找到自己的位置。你挂单在陡峭区域,成交概率高,但利润薄;你挂单在平坦区域,利润厚,但可能很久都成交不了。这是一个永恒的权衡。

嗯,说到这里,我想起一个案例。有一次我们团队在做一个新币种的做市,发现它的深度曲线在某个价格区间有一个明显的「缺口」。就是那个价格区间几乎没人挂单。我们当时判断,这是市场参与者的心理价位空白区。于是我们果断在那个区间两边挂单,一边吃价差,一边等市场来填这个缺口。结果呢?三天后,那个缺口被填平了,我们赚了一波不错的利润。

所以,读懂订单簿的深度和宽度,不仅仅是看数字,更是读懂市场参与者的心理。每一笔挂单背后,都是一个活生生的人在决策。你想想看,是不是这个道理?