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

如何利用qmt的get_svol和get_bvol接口编写日内内外盘动量突破策略?

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

问题描述

qmt 日内量价策略:结合 get_svol 与 get_bvol 的内外盘动量系统
如何利用 qmt 的 get_svol 和 get_bvol 接口编写一个日内内外盘动量突破策略?

解决方案

qmt日内量价策略:结合get_svol与get_bvol的内外盘动量系统

在日内量化交易中,内外盘数据是衡量多空双方即时力量对比的核心指标。外盘(Active Buy)代表主动买入盘,外盘越大说明买方意愿越强烈;内盘(Active Sell)代表主动卖出盘,内盘越大说明卖方抛压越重。

QMT平台提供了 ContextInfo.get_svol()ContextInfo.get_bvol() 接口,允许开发者实时获取个股的内盘和外盘成交量。本文将指导您如何结合这两个接口,编写一个经典的日内内外盘动量突破策略


一、 策略核心逻辑

  1. 动量指标构建
    我们定义一个外盘占比指标(BVOL_Ratio)
    $$\text{BVOL_Ratio} = \frac{\text{BVOL}}{\text{BVOL} + \text{SVOL}}$$

    • 当 $\text{BVOL_Ratio} > 0.6$ 时,说明主动买盘占据绝对优势,多头动量爆发,触发买入信号
    • 当 $\text{BVOL_Ratio} < 0.4$ 时,说明主动卖盘占据绝对优势,空头动量爆发,触发卖出/平仓信号
  2. 日内过滤

    • 仅在 09:4514:45 之间进行交易,避开开盘剧烈波动期,并在尾盘前强制平仓。

二、 QMT Python 策略源码

以下是完整的策略代码。请注意,由于 get_svolget_bvol 返回的是字符串格式,代码中进行了安全的数值转换处理。

#coding:gbk
import datetime

def init(ContextInfo):
    # 设定标的与交易账号
    ContextInfo.stock = '600000.SH' # 浦发银行
    ContextInfo.set_universe([ContextInfo.stock])
    ContextInfo.accid = '6000000248' # 请替换为您的实际资金账号
    ContextInfo.set_account(ContextInfo.accid)
    
    # 策略参数设置
    ContextInfo.buy_threshold = 0.60  # 买入外盘占比阈值
    ContextInfo.sell_threshold = 0.40 # 平仓外盘占比阈值
    ContextInfo.trade_volume = 100    # 每次交易股数
    ContextInfo.holding = 0           # 虚拟持仓记录

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
        
    stock = ContextInfo.stock
    
    # 1. 获取当前时间
    tick_time = ContextInfo.get_tick_timetag()
    time_str = timetag_to_datetime(tick_time, '%H%M%S')
    int_time = int(time_str)
    
    # 2. 获取内外盘数据
    svol_str = ContextInfo.get_svol(stock)
    bvol_str = ContextInfo.get_bvol(stock)
    
    try:
        svol = float(svol_str) if svol_str else 0.0
        bvol = float(bvol_str) if bvol_str else 0.0
    except ValueError:
        return # 防止数据未准备好时转换报错
        
    total_vol = bvol + svol
    if total_vol == 0:
        return
        
    # 3. 计算外盘占比
    bvol_ratio = bvol / total_vol
    
    # 4. 交易逻辑执行 (日内时间窗口:09:45 - 14:45)
    if 94500 <= int_time <= 144500:
        # 多头突破买入
        if bvol_ratio >= ContextInfo.buy_threshold and ContextInfo.holding == 0:
            print(f"[{time_str}] 外盘占比 {bvol_ratio:.2f} 突破上限,买入 {stock}")
            order_shares(stock, ContextInfo.trade_volume, 'LATEST', 0, ContextInfo, ContextInfo.accid)
            ContextInfo.holding += ContextInfo.trade_volume
            
        # 空头动量平仓
        elif bvol_ratio <= ContextInfo.sell_threshold and ContextInfo.holding > 0:
            print(f"[{time_str}] 外盘占比 {bvol_ratio:.2f} 跌破下限,平仓 {stock}")
            order_shares(stock, -ContextInfo.holding, 'LATEST', 0, ContextInfo, ContextInfo.accid)
            ContextInfo.holding = 0
            
    # 5. 尾盘强制平仓 (14:50 之后)
    elif int_time >= 145000 and ContextInfo.holding > 0:
        print(f"[{time_str}] 尾盘强制平仓 {stock}")
        order_shares(stock, -ContextInfo.holding, 'LATEST', 0, ContextInfo, ContextInfo.accid)
        ContextInfo.holding = 0

三、 关键接口解析

  • ContextInfo.get_svol(stockcode):获取指定股票的内盘成交量(主动卖出量)。
  • ContextInfo.get_bvol(stockcode):获取指定股票的外盘成交量(主动买入量)。
  • order_shares(stockcode, shares, style, price, ContextInfo, accId):指定股数交易函数。正数代表买入,负数代表卖出。本策略采用 'LATEST'(最新价)快速撮合。

四、 策略优化建议

  1. 结合均线过滤:在日内动量突破的基础上,可以引入大周期(如日线级)的MA均线。只有当价格在均线之上时才允许做多,以提高胜率。
  2. 动态阈值:目前的 0.60.4 是固定阈值,实盘中可以根据个股过去5天的平均内外盘比例进行动态标准差(Bollinger Band 思想)计算。
  3. 防虚假突破:内外盘数据在开盘前15分钟极易出现虚假繁荣,策略中设置的 09:45 启动时间能有效过滤开盘噪音。