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

qmt 主动买卖盘策略:基于 get_bvol 与 get_svol 的资金流向择时

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

问题描述

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

Title: qmt 主动买卖盘策略:基于 get_bvol 与 get_svol 的资金流向择时

Question: 如何在 qmt 中利用内外盘数据 get_bvol 和 get_svol 构建主动买卖盘资金流向择时策略?

解决方案

QMT 主动买卖盘策略:基于 get_bvol 与 get_svol 的资金流向择时

在股票量化交易中,内外盘数据是衡量市场多空博弈和资金主动买卖意愿的重要指标:

  • 外盘(Bvol / 主动买盘):指以卖出价成交的交易,反映买方的急迫与主动买入意愿。
  • 内盘(Svol / 主动卖盘):指以买入价成交的交易,反映卖方的急迫与主动卖出意愿。

利用 QMT(迅投量化交易系统)提供的 get_bvolget_svol 接口,我们可以实时计算外盘与内盘的比率(如外盘占比),捕捉资金的主动净流入方向,从而构建高胜率的资金流向择时策略。


1. QMT API 接口说明

QMT 提供了两个直接获取当前股票内外盘成交量的 ContextInfo 方法:

1.1 ContextInfo.get_bvol()

  • 用法ContextInfo.get_bvol(stockcode)
  • 释义:根据股票代码获取对应股票的外盘成交量(主动买盘量)。
  • 参数stockcode(如 '000001.SZ'),缺省为空时默认取当前主图代码。
  • 返回stringnumber

1.2 ContextInfo.get_svol()

  • 用法ContextInfo.get_svol(stockcode)
  • 释义:根据股票代码获取对应股票的内盘成交量(主动卖盘量)。
  • 参数stockcode(如 '000001.SZ'),缺省为空时默认取当前主图代码。
  • 返回stringnumber

2. 策略核心逻辑

  1. 信号指标定义
    • 计算内外盘总成交量:total_vol = bvol + svol
    • 计算外盘占比(主动买盘比例):buy_ratio = bvol / total_vol
  2. 买入条件
    • 当外盘占比 buy_ratio > 0.6(即主动买盘超过 60%),且内外盘总量具备一定规模时,判定多头资金强劲,执行买入/建仓。
  3. 卖出条件
    • 当外盘占比 buy_ratio < 0.4(即主动卖盘超过 60%)时,判定空头力量占优,执行卖出/平仓。

3. QMT 完整策略源码

以下策略代码基于 QMT Python API 编写,实现了基于内外盘资金流向的主动择时逻辑:

#coding:gbk
import float

def init(ContextInfo):
    # 设定股票池
    ContextInfo.symbol = '000001.SZ'
    ContextInfo.set_universe([ContextInfo.symbol])
    
    # 绑定交易账号
    ContextInfo.account = '6000000248'
    ContextInfo.set_account(ContextInfo.account)
    
    # 参数设置
    ContextInfo.buy_threshold = 0.60   # 外盘占比高于60%买入
    ContextInfo.sell_threshold = 0.40  # 外盘占比低于40%卖出
    ContextInfo.trade_lots = 100        # 每次交易股数
    
    print("主动买卖盘资金流向择时策略初始化完成!")

def handlebar(ContextInfo):
    # 仅在最新 K 线运行(盘中 Tick 驱动或最新Bar)
    if not ContextInfo.is_last_bar():
        return
        
    code = ContextInfo.symbol
    
    # 获取内盘和外盘成交量
    try:
        bvol_str = ContextInfo.get_bvol(code)
        svol_str = ContextInfo.get_svol(code)
        
        bvol = float(bvol_str) if bvol_str else 0.0
        svol = float(svol_str) if svol_str else 0.0
    except Exception as e:
        print(f"获取内外盘数据失败: {e}")
        return
        
    total_vol = bvol + svol
    if total_vol <= 0:
        return
        
    # 计算主动买盘(外盘)占比
    buy_ratio = bvol / total_vol
    print(f"[{code}] 外盘(主动买): {bvol}, 内盘(主动卖): {svol}, 外盘占比: {buy_ratio:.2%}")
    
    # 查询账户持仓
    pos_list = get_trade_detail_data(ContextInfo.account, 'STOCK', 'POSITION')
    hold_vol = 0
    for pos in pos_list:
        if pos.m_strInstrumentID == code.split('.')[0]:
            hold_vol = pos.m_nCanUseVolume
            break
            
    # 交易决策
    if buy_ratio >= ContextInfo.buy_threshold and hold_vol == 0:
        print(f"[买入信号] 外盘占比 {buy_ratio:.2%} 达到买入阈值,执行买入!")
        # 使用 passorder 市价/最新价买入
        passorder(23, 1101, ContextInfo.account, code, 5, -1, ContextInfo.trade_lots, ContextInfo)
        
    elif buy_ratio <= ContextInfo.sell_threshold and hold_vol > 0:
        print(f"[卖出信号] 外盘占比 {buy_ratio:.2%} 降至卖出阈值,执行卖出!")
        passorder(24, 1101, ContextInfo.account, code, 5, -1, hold_vol, ContextInfo)

4. 策略优化建议

  1. 结合 Level-2 逐笔数据:对于有高频或 Level-2 权限的用户,可配合 Level-2 逐笔成交统计(如 ddx, ddy)和大单资金净流入做二次确认,过滤假突破。
  2. 配合均线/量价过滤:在日线趋势向上(如价格位于 20 日均线上方)时,仅参考主动买盘建仓,能大幅提升策略胜率。
  3. 动态阈值调整:可以根据过去 N 个交易日的平均内外盘分布动态调整买卖阈值,适应不同市场波动周期。