MarketMaker.cc Team
量化研究与策略
MarketMaker.cc Team
量化研究与策略
订单簿深度可视化:交易者在价格墙内的位置展示
理解自己在价格层级中的排队位置,如何将高频交易从猜测变为精确的工程问题
每一位看盘口交易的交易者都会看到同样的画面:左边是买盘(bid),右边是卖盘(ask),每个价格层级显示一个数字,代表限价单的总量。例如:
价格 10001 | 150 手
价格 10000 | 2,400 手 ← 挂单墙
价格 9999 | 80 手
10000 价位上的 2,400 手就是一堵"墙"(wall、density,即密集挂单区)。这里出现了一个大多数交易者忽视的关键问题:我们的订单在这 2,400 手中到底排在哪个位置?
价格 10000 [ 我们前面 1,800 手 ][ 我们的订单 10 手 ][ 我们后面 590 手 ]
这不是学术上的好奇心。这是订单被执行与未被执行的区别。是盈利与亏损的区别。是回测中显示漂亮净值曲线与现实中策略失效的区别。
FIFO 队列可视化:交易者在价格层级中与其他订单的相对位置
绝大多数交易所——无论是传统交易所(CME、NASDAQ),还是加密货币交易所(Binance、Bybit、OKX)——都采用**价格-时间优先(FIFO)**规则。这意味着:在相同价格下,最先提交的订单最先被执行。
当一个市价卖单到达并"击中"我们的 bid 价格层级时,它会按照从队首到队尾的顺序依次执行限价单。如果该市价单不够大,无法到达我们在队列中的位置——我们的订单就不会被执行。
学术研究(Moallemi & Yuan,哥伦比亚商学院,2017)将排队位置的价值分为两个组成部分:
静态组成部分 —— 赚取价差与逆向选择之间的权衡。我们在队列中越靠后,被大型知情订单(而非噪音交易)执行的概率就越高。简单来说:如果你是队列中最后被执行的——价格很可能已经朝不利方向运动了。
动态组成部分 —— 随着时间推移,队列位置改善带来的期权价值。当排在我们前面的订单被取消或执行时,我们的位置会自动改善,无需任何主动操作。
实证数据表明,对于大 tick 品种,排队位置的价值可以与价差大小相当。这是一个巨大的数值。
我们以价格 P 提交一笔大小为 S 的限价单。提交时该价格层级上已有 Q 手。我们的初始位置估计:
V̂(t₀) = Q(t₀) — 排在我们前面的手数
然后,我们跟踪该价格层级上所有的成交量变化。这是 Erik Rigtorp 描述并在 Trading Technologies (TT)、Bookmap 等产品中实现的核心算法。
每当价格层级上的量减少 ΔQ 时,我们需要判断:减少的是排在我们前面的还是排在我们后面的订单?
如果我们能区分成交(fills)和撤单(cancellations):
V̂ = max(V̂ + ΔQ, 0)对于撤单,使用概率模型:
V̂(n+1) = max(V̂(n) + p(n) × ΔQ(n), 0)
其中 p(n) 是被撤订单排在我们前面的概率。一类模型为:
p(n) = f(V̂(n)) / (f(V̂(n)) + f(max(Q(n) - S - V̂(n), 0)))
其中 f(x) 是递增函数,例如 ln(1+x) 或恒等函数。直觉是:相对于后方量,前方量越大,撤单发生在前方的概率就越高。
评估质量直接取决于数据的精细度:
| 数据层级 | 可见内容 | PIQ 评估精度 |
|---|---|---|
| Level 1 (BBO) | 最优买卖价 + 量 | 无法评估 |
| Level 2 (价格聚合) | 每个价格层级的量 | 概率估计 |
| Level 3 (Market-by-Order, MBO) | 每笔独立订单及其 ID | 精确位置 |
加密市场的现状:
大多数加密交易者使用 L2 数据,因此只能进行概率估计。但即使是概率估计,也远好于完全没有评估。
我们建议将每个显著的密集挂单区(墙)可视化为盘口中的迷你盘口:
╔════════════════════════════════════════════════════════════════╗
║ 价格 10001 │ 150 手 ║
╠════════════════════════════════════════════════════════════════╣
║ 价格 10000 │ [████████████░░░▓▓░░░░░░░] 2,400 手 ║
║ │ ↑ 前方 1,800 ↑ 我们 ↑ 后方 590 ║
║ │ 消耗速度: ~120 手/秒 ║
║ │ 预计成交时间: ~15 秒 ║
╠════════════════════════════════════════════════════════════════╣
║ 价格 9999 │ 80 手 ║
╚════════════════════════════════════════════════════════════════╝
我们订单前方的手数 —— 在轮到我们之前,需要被执行或撤销的量的估计值。
我们订单后方的手数 —— 排在我们后面的量。如果墙从尾部快速"膨胀"——意味着其他参与者认为该价位有吸引力。
队列消耗速度 —— 基于该价格层级实际成交(trades)计算。以手/秒表示。
预计成交时间(Estimated Time to Fill, ETF) —— 我们订单被执行的时间预测,计算公式为 前方手数 / 消耗速度。
同一密集区的多笔订单 —— 如果机器人在同一面墙内有多笔订单,可以看到每笔订单各自的位置。
朴素回测与 Queue-aware 回测的对比:真实成交概率 vs 乐观估计
经典的 OHLCV K线回测逻辑是:如果价格触及我们的限价单——就算作成交。但这是一个严重的错误:
示例。 我们在 10000 价位有一笔买入限价单。分钟 K线的最低价 low = 10000。K线回测记录为成交。但实际上:
Queue-aware 回测解决了这个问题:它模拟排队位置,根据逐笔数据统计该价位的成交量,判断成交量是否足以到达我们的位置。
在活跃的高频交易中,一个订单可能在一分钟内被执行并重新提交多次。K线回测根本无法模拟这种情况。只有带队列模拟的逐笔分析才能:
了解自身排队位置和当前墙消耗速度的机器人可以:
对高频交易者而言最有价值的指标:当前队列消耗速度 vs 过去 N 根 K线的平均速度。
最成熟的实现。TT 在 Floating Order Book 列中为每笔交易者订单显示 PIQ。对于通过数据源直接提供排队位置信息的交易所(CME、ICE),显示精确值。其余交易所则为保守估计。
Bookmap 专业版($499/月)包含订单排队位置可视化和事件导出功能。Bookmap Quant 使用 MBO 数据,其 L0 API 允许为任意数据源构建自定义适配器。
CQG 为期货市场提供排队位置估算功能。该平台基于 L2/L3 数据计算概率性 PIQ 估算值,并在 DOMTrader 界面中显示。
Rithmic 是一家市场数据提供商,提供低延迟的排队位置评估数据。许多自营交易公司和算法交易者将其作为基础设施层,用于构建自己的 PIQ 模型。
Jigsaw Trading 专注于带排队位置估算的订单流可视化。其 Depth & Sales 和 Reconstructed Tape 工具帮助交易者看到价格层级上的真实执行情况。
目前没有任何现有产品为加密市场提供专门面向高频交易机器人的墙内部结构可视化。 这正是 Marketmaker.cc 可以填补的空白。
识别虚假挂单墙:真实订单 vs 高撤单率的幌骗订单
理解墙的内部结构不仅仅是优化自身的执行质量。它是防范操纵的工具,如果运用得当,也是解读大户意图的工具。
幌骗是指提交大额订单并打算在执行前撤销。目的是制造虚假的供需印象。
PIQ 分析如何帮助识别:
Layering 是幌骗的高级形式,在多个价格层级上提交虚假订单。
PIQ 分析如何帮助识别:
冰山订单是将大额订单拆分为小的可见部分。当一部分被执行后,下一部分自动出现。
PIQ 分析如何帮助识别:
专业做市商使用多种策略:
1. WebSocket 订单簿数据流(L2 depth):
- 最优买卖价更新
- 深度更新(每个价格层级的量)
2. WebSocket 成交数据流:
- 每笔成交: 价格、数量、方向(买/卖)、时间戳
3. 自有订单(来自交易机器人):
- order_id、价格、数量、提交时间戳
class QueuePositionTracker:
def __init__(self, order_price, order_size, initial_depth):
self.price = order_price
self.size = order_size
self.queue_ahead = initial_depth # V̂(t₀) = Q(t₀)
self.queue_behind = 0
self.fill_velocity = EMA(span=30) # 成交速度的指数移动平均
def on_trade(self, trade_price, trade_size):
"""每当我们的价格层级发生成交时调用"""
if trade_price == self.price:
self.queue_ahead = max(self.queue_ahead - trade_size, 0)
self.fill_velocity.update(trade_size)
def on_depth_change(self, new_depth, change_type):
"""每当我们的价格层级深度变化时调用"""
if change_type == 'cancel':
total = self.queue_ahead + self.size + self.queue_behind
p_ahead = log(1 + self.queue_ahead) / (
log(1 + self.queue_ahead) + log(1 + self.queue_behind)
)
cancelled = abs(new_depth - total)
self.queue_ahead = max(
self.queue_ahead - p_ahead * cancelled, 0
)
self.queue_behind = max(
self.queue_behind - (1 - p_ahead) * cancelled, 0
)
elif change_type == 'new_order':
added = new_depth - (self.queue_ahead + self.size + self.queue_behind)
self.queue_behind += added
@property
def estimated_time_to_fill(self):
"""预计成交时间(秒)"""
if self.fill_velocity.value <= 0:
return float('inf')
return self.queue_ahead / self.fill_velocity.value
@property
def fill_probability(self, horizon_sec=60):
"""在给定时间范围内的成交概率"""
expected_volume = self.fill_velocity.value * horizon_sec
return min(expected_volume / max(self.queue_ahead, 1), 1.0)
queue_ahead 降为 0,下一笔市价单就会执行我们的订单queue_ahead 跳跃式变化| 指标 | 公式 | 颜色 |
|---|---|---|
| 排队位置 % | queue_ahead / total_depth × 100 | 绿色 < 30%,黄色 30-70%,红色 > 70% |
| 预计成交时间 | queue_ahead / fill_velocity | 秒 |
| 墙体健康度 | depth_now / depth_5sec_ago | 墙体稳定性 |
| 吸收率 | filled_volume / visible_depth | 是否存在隐藏流动性 |
| 幌骗评分 | cancel_rate × sudden_appear × distance_from_price | 0-100,虚假指标 |
三级可见性模型:个人订单、订阅者和团队持仓在墙内的展示
如果你是交易所或交易终端,你拥有关于每个用户每笔订单位置的绝对知识。平台可以向每位用户展示:在他的订单前后有多少"他人"的量,而不泄露其他参与者的身份。
在 Marketmaker.cc 中,我们计划实现墙内订单的三级可见性模型:
个人订单 —— 基础层。每位交易者可以看到自己所有订单的独立指标。
订阅者订单(信号提供者) —— 通过订阅分享持仓的交易者。采用 Opt-in 机制:领导者自行决定是否展示持仓。
团队订单(交易团队/基金) —— 对专业团队最有价值的层级。解决的问题包括:订单冲突、流动性分配、团队风险监控、培训。
┌─────────────────────────────────────────────────────────────┐
│ 交易者的订单 │
│ │
│ 可见性: │
│ ├── 交易者本人 → 始终可见 │
│ ├── 订阅者 → 如果交易者开启了该功能 │
│ │ ├── 显示延迟 → 可配置 (0s–60s) │
│ │ ├── 显示数量 → 是 / 隐藏 / 取整 │
│ │ └── 显示预计成交时间 → 是 / 否 │
│ └── 团队 → 如果加入了团队 │
│ ├── 延迟 → 可配置 (0s–5s) │
│ ├── 显示数量 → 是(用于风险管理) │
│ └── 角色可见性 → 交易员 / 经理 / 观察者 │
└─────────────────────────────────────────────────────────────┘
在拥有链上订单簿的 DEX 上——尤其是 Hyperliquid——每笔订单都绑定到特定的钱包地址。我们不仅可以看到聚合后的墙,还可以看到每个参与者的每笔独立订单。
然而,要实时处理这些数据,需要搭建自己的 Hyperliquid 区块链节点。
第四层可视化——按参与者类型对订单进行算法标注:做市商、幌骗者、散户。分类算法在多个层面运作:幌骗检测、做市商分类、轧空场景检测、交易者数字指纹。
更多详情请参阅本系列下一篇文章:《交易者数字指纹:如何通过订单簿行为识别做市商》
订单簿密集区内的挂单位置分析是从"看盘口"到"理解市场微观结构"的下一个进化步骤。这是多个领域的交叉地带:
截至目前,加密市场上没有任何产品在统一界面中提供完整的"墙作为迷你盘口"可视化,包含用户订单位置、预计成交时间估算、幌骗检测和 queue-aware 回测。
我们在 Marketmaker.cc 致力于让每一位交易者——从个人高频交易者到专业自营团队——都能使用这些分析工具。