🚀 AI 一键生成 qmt 策略代码
立即体验

qmt 高频交易:基于 Level-2 逐笔成交与订单流失衡 (OBI) 策略

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: qmt 高频交易:基于 Level-2 逐笔成交与订单流失衡 (OBI) 策略

Question: qmt 如何利用 Level-2 逐笔数据构建订单流失衡指标?

解决方案

qmt 高频交易:基于 Level-2 逐笔成交与订单流失衡 (OBI) 策略

订单流失衡(Order Book Imbalance, OBI)是高频交易(HFT)与短线量化策略中的核心微观结构指标。它通过衡量买卖双方挂单量及逐笔成交量的强弱对比,预测短期价格的变动方向。

在 QMT(迅投量化交易平台)中,我们可以直接通过 Python API 订阅 Level-2 特色指标与逐笔数据,快速构建 OBI 策略。


1. 策略原理与 OBI 公式

传统的 OBI 基于盘口前几档的挂单量计算:
$$
OBI = \frac{V_{bid} - V_{ask}}{V_{bid} + V_{ask}}
$$

在 QMT 平台上,结合 Level-2 逐笔成交统计数据(l2transactioncount),我们不仅可以获取买卖挂单总量,还可以结合**主动买入(主买)主动卖出(主卖)**的成交量进行加权修正,使得 OBI 指标对短期价格动量的预测更为精准。


2. QMT Level-2 接口获取

在 QMT 中,通过 ContextInfo.subscribe_quote()ContextInfo.get_market_data_ex() 传入 period='l2quoteaux'(Level2 行情快照指标)或 period='l2transactioncount'(Level2 逐笔成交统计)即可获取高频数据。

常用属性字段:

  • totalBidQuantity: 委买总量
  • totalOffQuantity: 委卖总量
  • bidNumber / offNumber: 主买/主卖总单数
  • bidMostVolmue / offMostVolmue: 主买/主卖特大单成交量

3. Python 策略源码实现

以下是在 QMT 中利用 handlebar 驱动的高频 OBI 策略示例源码:

#coding:gbk
import numpy as np

def init(ContextInfo):
    # 设置交易标的
    ContextInfo.symbol = '600000.SH'
    ContextInfo.set_universe([ContextInfo.symbol])
    
    # 设置账号
    ContextInfo.account = '6000000248'
    ContextInfo.set_account(ContextInfo.account)
    
    # 策略参数
    ContextInfo.obi_threshold = 0.4  # OBI 阈值触发信号
    ContextInfo.trade_units = 100    # 单笔交易股数
    
    # 订阅 Level-2 逐笔成交统计数据与快照指标
    ContextInfo.subscribe_quote(ContextInfo.symbol, period='l2quoteaux', dividend_type='none')
    ContextInfo.subscribe_quote(ContextInfo.symbol, period='l2transactioncount', dividend_type='none')

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    # 获取最新的 Level-2 行情快照数据
    l2_snapshot = ContextInfo.get_market_data_ex(
        fields=['totalBidQuantity', 'totalOffQuantity'],
        stock_code=[ContextInfo.symbol],
        period='l2quoteaux',
        count=1
    )
    
    # 获取最新的 Level-2 逐笔成交统计数据
    l2_trans = ContextInfo.get_market_data_ex(
        fields=['bidMostVolmue', 'offMostVolmue', 'bidBigVolmue', 'offBigVolmue'],
        stock_code=[ContextInfo.symbol],
        period='l2transactioncount',
        count=1
    )
    
    if ContextInfo.symbol not in l2_snapshot or ContextInfo.symbol not in l2_trans:
        return
    
    df_snap = l2_snapshot[ContextInfo.symbol]
    df_trans = l2_trans[ContextInfo.symbol]
    
    if df_snap.empty or df_trans.empty:
        return
    
    # 1. 计算挂单盘口失衡度 (Order Imbalance)
    bid_qty = df_snap['totalBidQuantity'].iloc[-1]
    ask_qty = df_snap['totalOffQuantity'].iloc[-1]
    
    if (bid_qty + ask_qty) == 0:
        return
    
    order_obi = (bid_qty - ask_qty) / (bid_qty + ask_qty)
    
    # 2. 计算大单/特大单主动成交失衡度 (Trade Imbalance)
    big_buy = df_trans['bidMostVolmue'].iloc[-1] + df_trans['bidBigVolmue'].iloc[-1]
    big_sell = df_trans['offMostVolmue'].iloc[-1] + df_trans['offBigVolmue'].iloc[-1]
    
    trade_obi = 0.0
    if (big_buy + big_sell) > 0:
        trade_obi = (big_buy - big_sell) / (big_buy + big_sell)
    
    # 3. 综合 OBI 指标 (结合盘口挂单与大单流向)
    final_obi = 0.6 * order_obi + 0.4 * trade_obi
    
    print(f"[OBI监控] 盘口失衡: {order_obi:.2f}, 大单成交失衡: {trade_obi:.2f}, 综合OBI: {final_obi:.2f}")
    
    # 获取当前持仓
    pos_list = get_trade_detail_data(ContextInfo.account, 'STOCK', 'POSITION')
    current_pos = 0
    for pos in pos_list:
        if pos.m_strInstrumentID == '600000':
            current_pos = pos.m_nCanUseVolume
            break
            
    # 交易逻辑:高 OBI 提示买入信号,低 OBI 提示卖出信号
    if final_obi > ContextInfo.obi_threshold and current_pos == 0:
        print("-> 触发多头信号,市价买入")
        passorder(23, 1101, ContextInfo.account, ContextInfo.symbol, 5, -1, ContextInfo.trade_units, ContextInfo)
    elif final_obi < -ContextInfo.obi_threshold and current_pos > 0:
        print("-> 触发空头/平仓信号,市价卖出")
        passorder(24, 1101, ContextInfo.account, ContextInfo.symbol, 5, -1, current_pos, ContextInfo)

4. 总结

利用 QMT 提供的 Level-2 逐笔数据与高频行情快照,开发者可以轻松计算 OBI 等订单流指标,捕捉盘口毫秒级的买卖博弈信号。在实盘应用中,建议结合止盈止损模块以及网格/冰山等算法拆单(如 smart_algo_passorder),以降低冲击成本。