3、市场微观结构:订单簿结构、买卖价差、市场深度、订单簿动态变化、订单簿数据获取
做市商这行,说白了就是跟市场微观结构打交道。你想想看,我们每天盯着的那些跳动的数字,背后其实是一套精密的「市场机器」在运转。我个人习惯把市场微观结构比作市场的「骨骼」——你看不见它,但它支撑着一切价格发现的过程。
这一章,我们就来拆解这套骨骼。我会从订单簿的结构讲起,然后聊聊买卖价差、市场深度这些核心概念,最后说说怎么拿到这些数据。嗯,都是实战中每天要用的东西。
3.1 订单簿结构:市场的「实时账本」
订单簿是什么?说白了,就是交易所里所有未成交订单的集合。它分两边:买单(Bid)和卖单(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%): 常见于新币或冷门币对,流动性差,风险高。做市商需要更大的安全边际。
为什么会这样?因为价差本质上是对做市商承担风险的补偿。你想想看,你挂单在那里,万一市场突然暴跌,你的买单可能就被套住了。价差越大,补偿越高,但风险也越大。
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 订单簿数据获取:从哪里拿到这些数据?
说了这么多,数据从哪来?嗯,这里要注意,不同交易所的数据接口不一样,但核心逻辑是相通的。
我常用的数据获取方式有几种:
- WebSocket 实时推送: 这是做市商的首选。延迟低,数据实时。交易所一般会提供「深度流」(Depth Stream),每秒推送多次订单簿快照。
- REST API 轮询: 适合低频策略。但要注意频率限制,别被交易所封了IP。
- 第三方数据服务: 比如一些数据聚合平台,提供统一的接口。但延迟会高一些。
下面是一个简单的 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()
数据拿到后,怎么存?我一般用 Redis 的 Sorted Set 来存储订单簿,因为它的 ZRANGE 操作可以快速获取某个价格区间的挂单量。当然,如果你用 Python,直接用字典加排序也能凑合,但性能会差一些。
3.6 本章知识体系
为了让你更直观地理解这一章的内容,我画了一张结构图。它把订单簿结构、价差、深度、动态变化和数据获取串在了一起。
这张图把五个知识点串起来了。你从订单簿结构出发,理解价差和深度,然后观察动态变化,最后用数据获取来支撑你的策略。每一步都环环相扣。
好了,这一章就到这里。记住,订单簿是市场的「实时心电图」。读懂了它,你就读懂了市场的脉搏。