3、市场微观结构:订单簿结构、买卖价差、市场深度、订单簿动态变化、订单簿数据获取

做市商这行,说白了就是跟市场微观结构打交道。你想想看,我们每天盯着的那些跳动的数字,背后其实是一套精密的「市场机器」在运转。我个人习惯把市场微观结构比作市场的「骨骼」——你看不见它,但它支撑着一切价格发现的过程。

这一章,我们就来拆解这套骨骼。我会从订单簿的结构讲起,然后聊聊买卖价差、市场深度这些核心概念,最后说说怎么拿到这些数据。嗯,都是实战中每天要用的东西。

3.1 订单簿结构:市场的「实时账本」

订单簿是什么?说白了,就是交易所里所有未成交订单的集合。它分两边:买单(Bid)和卖单(Ask)。买单按价格从高到低排,卖单按价格从低到高排。中间那个空隙,就是买卖价差。

我刚开始做市的时候,总觉得订单簿就是一堆数字。后来发现,每个订单背后都是一个交易者的决策。你看到的不仅仅是价格和数量,而是市场参与者的「心理地图」。

核心要点:订单簿的每一层都代表一个价格水平上的累计挂单量。买盘最上面那层叫「最高买价」(Best Bid),卖盘最下面那层叫「最低卖价」(Best Ask)。

举个例子,一个典型的订单簿长这样:

卖单价格 卖单数量 买单价格 买单数量
100.05 1,200 100.00 800
100.04 900 99.99 1,500
100.03 2,100 99.98 2,000
100.02 1,500 99.97 1,100
100.01 3,000 99.96 900

这里,Best Bid 是 100.00,Best Ask 是 100.01。价差只有 0.01,说明这个市场流动性不错。我在项目中遇到过一种情况:某个小币种的订单簿,价差能大到 0.5 甚至 1 个点,那种市场你根本没法做高频做市,只能等机会。

3.2 买卖价差:做市商的「面包和黄油」

买卖价差(Bid-Ask Spread),就是 Best Ask 减去 Best Bid。这是做市商最主要的收入来源。你低价买、高价卖,赚的就是这个差价。

但价差不是固定的。它会随着市场波动、流动性变化而改变。我个人习惯把价差分为三类:

  • 窄价差(< 0.01%): 常见于 BTC/ETH 等主流币对,流动性极好,竞争激烈。做市商靠量取胜。
  • 中等价差(0.01% - 0.1%): 常见于一些二线币对,流动性尚可,有套利空间。
  • 宽价差(> 0.1%): 常见于新币或冷门币对,流动性差,风险高。做市商需要更大的安全边际。
实战技巧:我一般会监控价差的「标准差」。如果价差突然扩大超过 2 个标准差,说明市场可能出现了异常波动或流动性枯竭。这时候我会暂停做市,先观察再说。

为什么会这样?因为价差本质上是对做市商承担风险的补偿。你想想看,你挂单在那里,万一市场突然暴跌,你的买单可能就被套住了。价差越大,补偿越高,但风险也越大。

3.3 市场深度:你能吃下多少单子?

市场深度,指的是在某个价格水平上,你能成交多少数量。它通常用「深度图」来表示——横轴是价格,纵轴是累计挂单量。

我记得有一次,我在做市一个刚上线的山寨币。订单簿看起来挺厚,买盘有 50 个 BTC 的深度。结果一个大户砸了 10 个 BTC 的卖单,价格直接跌了 3%。这就是典型的「假深度」——表面挂单多,但都是小单子堆出来的,一碰就碎。

真正的市场深度,要看「吃单成本」。也就是你吃掉一定数量的订单,价格会滑点多少。我一般用这个公式:

滑点成本 = (成交均价 - 当前最优价) / 当前最优价 * 100%

比如你想买入 10 个 BTC,当前 Best Ask 是 100.01,但 100.01 只有 2 个 BTC,剩下的你要从 100.02、100.03 吃上去。最终成交均价可能是 100.03,滑点成本就是 0.02%。

避坑指南:我曾经吃过一次亏——只看订单簿第一层深度,没看累计深度。结果一个大单进来,滑点直接吃掉了我一周的利润。从那以后,我每次做市前都会先算一下「吃单成本曲线」。

3.4 订单簿动态变化:市场的「呼吸」

订单簿不是静止的。它每时每刻都在变化——有人挂单、有人撤单、有人吃单。这些变化背后,反映了市场参与者的意图。

我个人习惯把订单簿的动态变化分为几种模式:

  • 堆积模式:某个价格水平上挂单量持续增加。这通常意味着有资金在「筑墙」,可能是支撑或阻力。
  • 撤单模式:挂单突然大量消失。这往往是「冰山订单」在撤单,或者大户在试探市场。
  • 吃单模式:连续的大额成交,订单簿一层层被吃掉。这是真正的「真金白银」在推动价格。

你想想看,如果你看到买盘在 100.00 位置不断堆积,但价格就是不涨。这说明什么?说明有人在「托底」,但不想拉盘。这时候如果你做市,就要小心了——可能有大户在吸筹。

我一般会用一个简单的指标来量化订单簿的动态变化:

订单簿失衡度 = (买盘累计深度 - 卖盘累计深度) / (买盘累计深度 + 卖盘累计深度)

这个值在 -1 到 1 之间。正值表示买盘更强,负值表示卖盘更强。我习惯在失衡度超过 0.3 或低于 -0.3 时,调整我的做市策略。

3.5 订单簿数据获取:从哪里拿到这些数据?

说了这么多,数据从哪来?嗯,这里要注意,不同交易所的数据接口不一样,但核心逻辑是相通的。

我常用的数据获取方式有几种:

  1. WebSocket 实时推送: 这是做市商的首选。延迟低,数据实时。交易所一般会提供「深度流」(Depth Stream),每秒推送多次订单簿快照。
  2. REST API 轮询: 适合低频策略。但要注意频率限制,别被交易所封了IP。
  3. 第三方数据服务: 比如一些数据聚合平台,提供统一的接口。但延迟会高一些。

下面是一个简单的 WebSocket 订阅订单簿的代码示例(伪代码):

import websocket
import json

def on_message(ws, message):
    data = json.loads(message)
    # 解析订单簿数据
    bids = data['bids']  # 买单列表
    asks = data['asks']  # 卖单列表
    # 更新本地订单簿
    update_orderbook(bids, asks)

def on_error(ws, error):
    print(f"WebSocket error: {error}")

def on_close(ws, close_status_code, close_msg):
    print("WebSocket closed")

def on_open(ws):
    # 订阅 BTC/USDT 的深度流
    subscribe_msg = {
        "method": "SUBSCRIBE",
        "params": ["btcusdt@depth20@100ms"],
        "id": 1
    }
    ws.send(json.dumps(subscribe_msg))

ws = websocket.WebSocketApp(
    "wss://stream.example.com/ws",
    on_open=on_open,
    on_message=on_message,
    on_error=on_error,
    on_close=on_close
)
ws.run_forever()
个人经验:我建议你订阅「增量更新」而不是「全量快照」。增量更新只推送变化的部分,数据量小,处理速度快。但要注意,增量更新可能会有丢包风险,所以每隔一段时间(比如 10 秒)要拉一次全量快照做同步。

数据拿到后,怎么存?我一般用 Redis 的 Sorted Set 来存储订单簿,因为它的 ZRANGE 操作可以快速获取某个价格区间的挂单量。当然,如果你用 Python,直接用字典加排序也能凑合,但性能会差一些。

3.6 本章知识体系

为了让你更直观地理解这一章的内容,我画了一张结构图。它把订单簿结构、价差、深度、动态变化和数据获取串在了一起。

市场微观结构 订单簿结构 买卖价差 市场深度 订单簿动态变化 数据获取 Bid / Ask 分层 Best Bid / Best Ask 窄 / 中 / 宽价差 价差标准差监控 累计挂单量 吃单成本曲线 堆积 / 撤单 / 吃单 订单簿失衡度 WebSocket / REST API 增量更新 + 全量同步 核心:理解订单簿 = 理解市场参与者的意图

这张图把五个知识点串起来了。你从订单簿结构出发,理解价差和深度,然后观察动态变化,最后用数据获取来支撑你的策略。每一步都环环相扣。

好了,这一章就到这里。记住,订单簿是市场的「实时心电图」。读懂了它,你就读懂了市场的脉搏。


蓝海数据掘金营,专注资料整理