「要不要上 Level 2?」是行情选型里最常见的纠结之一。它通常不是成本问题,而是能力焦虑——担心没有深度数据会「错过什么」。但 Level 2 的数据量、存储成本与工程复杂度都远高于 Level 1,买错方向的代价很实在。
这篇文章给一个判断框架:Level 2 到底解决什么问题,以及什么时候你其实不需要它。
Level 1 与 Level 2 的本质区别
| 维度 | Level 1 | Level 2 |
|---|---|---|
| 内容 | 最优买价、最优卖价、最新成交价、成交量 | 多档买卖盘口,含各档价格与挂单量 |
| 能回答的问题 | 现在成交在什么价格 | 这个价格的成交能承接多大规模 |
| 数据量级 | 基准 | 显著更高,随档位数量与更新频率放大 |
| 更新频率 | 较低 | 盘口每次变动都可能触发更新 |
| 典型用途 | 行情展示、估值、信号生成 | 流动性评估、大单拆分、微观结构研究 |
核心差异可以概括成一句话:Level 1 告诉你「价格是多少」,Level 2 告诉你「这个价格能吃下多少量」。
Level 2 真正解决的问题
只有三类问题必须用 Level 2 才能回答:
问题一:这笔单子会不会显著推动价格
Level 1 只能看到最优价上的挂单量。如果你要成交的规模超过最优档的挂单量,价格会向下一档滑动,但 Level 1 无法告诉你滑到哪里、总成本是多少。这是 Level 2 最不可替代的用途。
问题二:盘口是否真实
盘口挂单可能包含虚假流动性(挂单后快速撤单)。只看最优档无法判断这个报价是否稳固;多档盘口的挂单分布能提供更多线索。
问题三:微观结构研究
订单流不平衡、盘口压力、价差动态等研究需要多档数据。这类需求本身就要求 Level 2。
三类不需要 Level 2 的场景
反过来看,以下场景买 Level 2 通常是浪费:
- 行情展示与看板:用户需要看价格与涨跌幅,不需要看五档盘口。绝大多数面向普通用户的行情界面用 Level 1 就够了。
- 中低频策略:按日或按小时决策的策略,最优价的信息量已经足够,盘口深度不会改变信号。
- 估值与风控快照:组合估值、风险敞口计算用最新成交价即可,不需要盘口结构。
这三类的共同点是:决策不依赖「能成交多少」,只依赖「成交在什么价格」。 只要满足这一条,Level 2 就是过度采购。
成本不止是订阅费
Level 2 的真实成本包含四块,后三块经常被忽略:
| 成本项 | 说明 |
|---|---|
| 订阅费用 | 通常只在最高档套餐开放 |
| 传输与处理 | 盘口更新频率高,消息量远大于 Level 1 |
| 存储 | 多档盘口的历史数据体积显著更大 |
| 工程复杂度 | 需要盘口重建、档位对齐、异常盘口过滤等额外逻辑 |
其中工程复杂度最容易被低估。多档盘口不是「多几个字段」——它是状态型的:你需要按序应用增量更新来重建盘口,处理乱序、缺口和快照对齐。这套逻辑的开发和维护成本往往超过订阅费本身。
决策清单
回答以下问题,如果全部为「否」,就不需要 Level 2:
- 你的策略是否会下超过最优档挂单量的单?
- 你是否需要评估「以当前价格能成交多少」而不只是「当前价格是多少」?
- 你是否需要判断盘口报价的真实性(虚假流动性)?
- 你是否在做订单流或微观结构相关的研究?
- 你是否有团队能维护盘口重建与异常过滤这套工程逻辑?
第 5 条是很多团队的盲点:有能力消费 Level 2 数据,不等于有能力正确使用它。 如果没人维护盘口重建逻辑,拿到多档数据也只能当摆设。
Python:先用 Level 1 数据做一次需求验证
在升级之前,可以用 Level 1 数据做一次粗略验证:如果按最优价挂单量估算,你的目标单量已经频繁超过最优档,那 Level 2 才有意义。
import httpx
API_KEY = "your_api_key"
BASE = "https://api.tiqex.io/api/v1/market"
# 你的典型单量(以股数或合约数为单位)
TARGET_ORDER_SIZE = 5_000
def assess_depth_need(codes: list[str], order_size: int) -> None:
"""用 Level 1 的 bid/ask 量做一次粗筛,判断是否需要 Level 2。"""
resp = httpx.get(
f"{BASE}/quote",
params={"codes": ",".join(codes)}, # 单次最多 50 个 codes
headers={"X-API-Key": API_KEY},
timeout=10,
)
rows = resp.json().get("data", [])
over = 0
for r in rows:
if r.get("unavailable"):
print(f"{r.get('code'):<12} 数据不可用,跳过")
continue
# Level 1 只给出最优档量,用较小的一侧作为保守估计
top_size = min(v for v in (r.get("bidSize"), r.get("askSize")) if v is not None) if (r.get("bidSize") or r.get("askSize")) else None
if top_size is None:
print(f"{r.get('code'):<12} 无盘口量字段,需人工确认")
continue
if order_size > top_size:
over += 1
print(f"{r.get('code'):<12} 单量 {order_size} > 最优档 {top_size} → 需要深度")
else:
print(f"{r.get('code'):<12} 单量 {order_size} ≤ 最优档 {top_size} → Level 1 足够")
print(f"\n{over}/{len(rows)} 个标的会击穿最优档")
if over == 0:
print("结论:当前单量下 Level 2 不是必需品")
else:
print("结论:存在价格滑点风险,值得评估 Level 2")
assess_depth_need(["AAPL", "MSFT", "NVDA"], TARGET_ORDER_SIZE)
这段代码的逻辑是:用「单量是否超过最优档挂单量」作为是否需要深度的第一层筛选。 如果所有标的的最优档都远大于你的单量,Level 2 带来的额外信息对你的决策没有影响。
需要说明的是,盘口量字段的可用性取决于套餐权限与市场,如果返回为空说明当前权限下拿不到该字段,需要先确认接口的实际返回结构。
务实的结论
- 先用 Level 1 验证需求:如果单量从未超过最优档,Level 2 不解决问题。
- 明确触发条件:把「单量超过最优档」或「需要评估流动性」设为升级 Level 2 的明确触发条件,而不是凭感觉升级。
- 先评估工程能力:盘口重建、档位对齐与异常过滤的开发维护成本往往高于订阅费。
- 混合使用:对少数需要深度的标的启用 Level 2,其余继续用 Level 1。
常见问题
Level 2 数据一定比 Level 1 好吗?
不是。Level 2 提供更多信息,但成本更高、工程复杂度更大。如果决策不依赖「能成交多少」,Level 1 的最优价信息已经足够。
做高频交易是不是必须用 Level 2?
高频策略通常确实需要盘口深度,但前提是团队有能力处理盘口重建、增量更新与异常过滤。如果缺少这套工程能力,拿到数据也无法正确使用。
Level 2 的盘口数据可以直接拿来用吗?
不能直接使用。多档盘口是状态型数据,需要按序应用增量更新来重建,并处理乱序、缺口与快照对齐。这是 Level 2 最大的工程成本来源。
怎么判断我的单量是否真的需要深度?
用 Level 1 的最优档挂单量做粗筛:如果你的典型单量频繁超过最优档挂单量,价格滑点风险显著,才值得评估 Level 2。
可以只对部分标的启用 Level 2 吗?
可以,而且推荐。对流动性较差或单量较大的少数标的启用深度数据,其余标的继续用 Level 1,是成本与效果的合理平衡。
下一步
先回答决策清单里的五个问题,再决定是否升级。Level 1 与 Level 2 的概念差异见 Level 1 与 Level 2 对比;各套餐的市场权限与深度数据开放情况见 套餐定价;如果你在做流动性评估或大单拆分,可参考 交易平台方案;盘口相关的字段定义见 多市场行情接口文档。