
做市这件事,说白了就是在“愿意成交”和“控制风险”之间不断走钢丝。你挂得太保守,没人跟你成交;你挂得太激进,市场一波波动就把你扫出局。
尤其是在加密货币市场,这种矛盾会被放大。因为价格是 24/7 跳动的,情绪变化比传统市场更快,而订单簿结构又非常“诚实”——它几乎实时暴露了市场的供需倾斜。
于是,一个很关键的问题就出现了:
能不能用订单簿的不平衡度(Order Book Imbalance),动态调整做市报价?
这篇文章就围绕这个问题展开,用 Python 思路拆解一个“可落地”的做市策略框架。
一、做市策略的核心不是预测,而是“定价”
很多人理解做市策略时,会不自觉地往“预测涨跌”上靠,但真实的做市逻辑完全不同。
做市商真正关心的是三件事:
- 当前价格附近的真实流动性在哪里
- 买盘和卖盘谁更“急”
- 在什么价位挂单能更高概率成交,同时不被过度击穿
在加密货币领域(Cryptocurrency Market),订单簿就是最直接的信号源。如果你能读懂订单簿结构变化,你就已经比“看K线”的策略提前半步了。
二、订单簿不平衡度(Order Book Imbalance)
最常见的定义方式是:
Order Imbalance = (Bid Volume – Ask Volume) / (Bid Volume + Ask Volume)
我们可以在不同深度(例如前5档、前10档)计算该指标:
- 0:买盘更强(多头压力)
- < 0:卖盘更强(空头压力)
- 接近 0:市场均衡
这个指标的关键意义不是“预测方向”,而是:告诉你“价格更可能向哪一侧更容易被吃掉流动性”
三、策略核心:动态调整报价
传统做市策略通常是:
- Mid Price ± Spread/2 固定挂单
但在订单簿不平衡情况下,这种方法过于“机械”。
我们可以改成:
动态报价模型:
Bid Price = Mid - Spread/2 + α × Imbalance Ask Price = Mid + Spread/2 + α × Imbalance
其中:
- α 控制“激进程度”
- Imbalance 决定偏移方向
四、从订单簿数据到策略信号
要实现这个策略,核心是实时订单簿数据。
通过类似 AllTick API 的多资产行情流,可以直接订阅 Level2 / Depth 数据。
Python(WebSocket 实时行情订阅优化版)
import json
import websocket
import uuid
import time
API_KEY = "YOUR_API_KEY"
SYMBOLS = ["BTCUSDT", "ETHUSDT", "XAUUSD"]
WS_URL = f"wss://quote.alltick.co/quote-b-ws-api?token={API_KEY}"
def build_subscribe_msg(symbols):
return {
"cmd_id": 22004,
"seq_id": int(time.time()),
"trace": str(uuid.uuid4()),
"data": {
"symbol_list": [
{"code": s} for s in symbols
]
}
}
def on_open(ws):
print("WebSocket connected")
msg = build_subscribe_msg(SYMBOLS)
ws.send(json.dumps(msg))
def on_message(ws, message):
data = json.loads(message)
# 只处理行情推送
if "cmd_id" in data and data.get("cmd_id") == 22998:
tick = data["data"]
code = tick["code"]
price = float(tick["price"])
volume = float(tick.get("volume", 0))
direction = tick.get("trade_direction", 0)
print(
f"[{code}] price={price} "
f"volume={volume} "
f"dir={direction}"
)
def on_error(ws, error):
print("WebSocket error:", error)
def on_close(ws, close_status_code, close_msg):
print("WebSocket closed, reconnecting in 3s...")
time.sleep(3)
start()
def start():
ws = websocket.WebSocketApp(
WS_URL,
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
ws.run_forever(ping_interval=10, ping_timeout=5)
if __name__ == "__main__":
start()
这个结构本质上做了三件事:
- 实时读取订单簿
- 计算买卖力量差
- 动态更新报价
五、为什么“不平衡度”对做市很重要?
做市策略的核心风险是:
- 逆向选择(Adverse Selection)
- 被“聪明资金”吃单
订单簿不平衡度的价值在于:
1. 提前识别流动性倾斜
比如:
- 买单突然堆积
- 卖单瞬间撤单
价格还没动,但“压力已经出现”
2. 避免挂在错误一侧
如果 imbalance < 0(卖压强),继续高价挂 bid,就容易被持续成交后“接刀”。
3. 提高成交质量
动态报价可以让你:
- 在强买盘时提高 ask 成交概率
- 在强卖盘时提高 bid 成交概率
本质是“顺着流动性做市”,而不是对抗市场。
六、进阶优化:加入波动率过滤
单独使用 imbalance 会有一个问题:在高波动市场容易“误判”
所以通常会加一层过滤:
if volatility > threshold:
alpha = alpha * 0.5
逻辑是:
- 市场越乱,越保守
- 市场稳定,允许更激进报价
七、策略扩展:从单资产到多资产对冲
当你同时接入多个市场(BTC、ETH、EURUSD、黄金等),可以进一步做:
- 跨资产 imbalance 对比
- 波动率归一化
- 流动性迁移检测
例如:
- BTC 买盘强 + ETH 卖盘弱 → 可能资金轮动
- 黄金上涨 + 美元走弱 → 宏观驱动信号
这时做市不再是“单点定价”,而是“结构化定价”。
八、做市的本质是“读懂订单簿情绪”
订单簿不只是数据,它更像市场的“呼吸”。
- 买单堆积 = 情绪偏热
- 卖单撤退 = 流动性退潮
- imbalance = 情绪差值的量化表达
做市策略真正的进化方向,不是更复杂的预测模型,而是:
用更低延迟的数据结构,持续修正报价偏移
在这个过程中,像 AllTick API 这样的实时多资产数据流,会让策略从“静态挂单”走向“动态适应”。
如果说传统做市是“设好价格等市场来”,那么基于订单簿不平衡的做市,就是:边看市场呼吸,边调整自己的报价节奏。


