🚀 AI 一键生成 qmt 策略代码

QMT/MiniQMT 高效获取全量股票 Level 2 数据(逐笔成交/委托)的解决方案

qmt | 发布时间: 2026/5/22
以下内容由 EasyQuant 生成。

问题描述

MINIQMT 券商Level 2 数据获取问题

QMT 技术团队,您好! 请问如果我想获取日内 level 2 的全部股票数据,比如说以下几类:

l2order - level2 逐笔委托
l2transaction - level2 逐笔成交
l2quoteaux - level2 实时行情补充(总买总卖)
l2orderqueue - level2 委买委卖一档委托队列
请问应该如何高效获取?(全量股票的实时 level 2)

对此有些困惑,文档中不建议订阅单股数量大于 50,但是却没有 L2 的全推订阅函数(subscribe_whole_quote 回调返回的是 tick 数据,而非 L2 逐笔成交数据)

请问应该如何高效获取全量股票的实时 level 2 数据,以逐笔成交订单为例(l2transaction)

我是应该先订阅全推行情(subscribe_whole_quote(code_list, callback=None)),然后使用 get_l2transaction 进行获取数据?

解决方案

您好!关于在 MINIQMT/QMT 中高效获取全量股票 Level 2 数据的问题,以下是详细的解答与最佳实践建议:

1. 为什么不建议/不支持全量订阅 L2 逐笔数据?

首先,强烈不建议尝试实时全量订阅全市场(5000+只股票)的 Level 2 逐笔数据(l2order, l2transaction)。原因如下:

  • 数据量极其庞大:全市场的 L2 逐笔委托和逐笔成交数据每天高达几十GB,盘中高峰期每秒推送的数据条数是海量的。
  • 性能瓶颈:Python 的 GIL(全局解释器锁)机制决定了它在处理如此高频、海量的回调推送时,会产生严重的阻塞和延迟。如果强行全推,您的策略进程极大概率会卡死或内存溢出。

2. 您的设想可行吗?

您提到:“先订阅全推行情(subscribe_whole_quote),然后使用 get_l2transaction 进行获取数据”。
这种方式在实盘中是不可行的。 全推行情的回调频率极高,如果在每次 Tick 回调中再去调用接口拉取该股票的 L2 逐笔数据,网络 I/O 和接口调用的开销会瞬间压垮策略,导致严重的行情延迟,失去 L2 数据的时效性意义。

3. 高效获取 Level 2 数据的最佳实践

为了在 QMT/MiniQMT 中高效利用 L2 数据,建议采用以下几种替代方案:

方案一:使用 QMT 内置的 L2 聚合统计指标(强烈推荐)

QMT 官方为了解决 L2 逐笔数据量过大的问题,已经在服务端对逐笔数据进行了聚合统计,并提供了专门的周期类型。您可以直接获取这些加工好的高价值特征,而无需自己处理海量的原始逐笔明细。

根据 QMT API 文档,支持以下两种 L2 特色周期(需开通 Level-2 增强版权限):

  • l2quoteaux:Level2 行情快照指标(包含委买委卖均价、总量、撤单总量/总额等)。
  • l2transactioncount:Level2 大单统计(包含主买主卖的特大单、大单、中单、小单的成交量和成交额,以及资金博弈等指标)。

获取方式:

# 批量拉取截面 L2 统计数据
data = ContextInfo.get_market_data_ex(
    fields=[], 
    stock_code=['000001.SZ', '600000.SH'], 
    period='l2transactioncount', # 或 'l2quoteaux'
    count=1
)
print(data)

方案二:缩小目标股票池,精准订阅

如果您确实需要原始的逐笔数据(如 l2transaction),必须先通过其他逻辑(如基本面、昨日收盘量价、早盘集合竞价等)筛选出一个较小的目标股票池(建议 50-200 只以内),然后再对这个精简后的股票池进行 L2 数据订阅。

def on_l2_quote(datas):
    # 处理 L2 推送数据
    print(datas)

# 假设 target_pool 是您通过策略筛选出的 50 只活跃股票
target_pool = ['000001.SZ', '600000.SH', ...]

for code in target_pool:
    # 订阅 L2 统计快照或逐笔数据(具体支持的 period 视您的权限和 xtquant 版本而定)
    ContextInfo.subscribe_quote(code, period='l2transactioncount', dividend_type='none', callback=on_l2_quote)

方案三:定时轮询代替高频回调

如果您需要监控较多股票的 L2 状态,放弃实时回调(subscribe_quote),改用定时器(如每 3 秒或 5 秒)批量拉取(get_market_data_ex)当前截面的 L2 聚合数据。这样可以有效控制 CPU 和网络负载。

总结

  1. 不要尝试全量实时订阅 L2 逐笔明细,架构上无法支撑。
  2. 优先使用 l2quoteauxl2transactioncount 这两个官方聚合好的 L2 周期数据。
  3. 必须结合股票池过滤,将 L2 数据的获取集中在策略真正关注的标的群上。