做市这件事,说白了就是在“愿意成交”和“控制风险”之间不断走钢丝。你挂得太保守,没人跟你成交;你挂得太激进,市场一波波动就把你扫出局。

尤其是在加密货币市场,这种矛盾会被放大。因为价格是 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 这样的实时多资产数据流,会让策略从“静态挂单”走向“动态适应”。

如果说传统做市是“设好价格等市场来”,那么基于订单簿不平衡的做市,就是:边看市场呼吸,边调整自己的报价节奏。