3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
订单流失衡(Order Book Imbalance, OBI)是高频交易(HFT)与短线量化策略中的核心微观结构指标。它通过衡量买卖双方挂单量及逐笔成交量的强弱对比,预测短期价格的变动方向。
在 QMT(迅投量化交易平台)中,我们可以直接通过 Python API 订阅 Level-2 特色指标与逐笔数据,快速构建 OBI 策略。
传统的 OBI 基于盘口前几档的挂单量计算:
$$
OBI = \frac{V_{bid} - V_{ask}}{V_{bid} + V_{ask}}
$$
在 QMT 平台上,结合 Level-2 逐笔成交统计数据(l2transactioncount),我们不仅可以获取买卖挂单总量,还可以结合**主动买入(主买)与主动卖出(主卖)**的成交量进行加权修正,使得 OBI 指标对短期价格动量的预测更为精准。
在 QMT 中,通过 ContextInfo.subscribe_quote() 或 ContextInfo.get_market_data_ex() 传入 period='l2quoteaux'(Level2 行情快照指标)或 period='l2transactioncount'(Level2 逐笔成交统计)即可获取高频数据。
totalBidQuantity: 委买总量totalOffQuantity: 委卖总量bidNumber / offNumber: 主买/主卖总单数bidMostVolmue / offMostVolmue: 主买/主卖特大单成交量以下是在 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)
利用 QMT 提供的 Level-2 逐笔数据与高频行情快照,开发者可以轻松计算 OBI 等订单流指标,捕捉盘口毫秒级的买卖博弈信号。在实盘应用中,建议结合止盈止损模块以及网格/冰山等算法拆单(如 smart_algo_passorder),以降低冲击成本。