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

QMT 平台如何利用内外盘数据(get_svol/get_bvol)编写资金流向交易策略?

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

问题描述

qmt 资金流向策略:利用 get_svol 与 get_bvol 计算内外盘净流入
QMT中如何使用内外盘数据get_svol和get_bvol编写资金流向交易策略?

解决方案

什么是内外盘与资金流向?

在股票交易中,内盘(Active Sell)和外盘(Active Buy)是判断市场多空力量对比的重要指标:

  • 外盘(Bvol):以卖出价成交的交易。通常被认为是买方主动买入,反映了买方的力量和资金流入。
  • 内盘(Svol):以买入价成交的交易。通常被认为是卖方主动卖出,反映了卖方的力量和资金流出。

通过计算外盘与内盘的差值(外盘 - 内盘),我们可以得到主动性买入净额(即内外盘净流入)。当外盘显著大于内盘时,说明资金在主动流入,股价上涨概率较大;反之,则说明资金在流出。


QMT 相关 API 接口介绍

QMT 提供了直接获取个股内盘和外盘成交量的接口:

1. 获取内盘成交量 ContextInfo.get_svol()

  • 用法ContextInfo.get_svol(stockcode)
  • 参数stockcode(股票代码,如 '000001.SZ'
  • 返回string(内盘成交量)

2. 获取外盘成交量 ContextInfo.get_bvol()

  • 用法ContextInfo.get_bvol(stockcode)
  • 参数stockcode(股票代码,如 '000001.SZ'
  • 返回string(外盘成交量)

资金流向交易策略设计

策略逻辑

  1. handlebar 驱动中,实时获取目标股票的内盘成交量(svol)与外盘成交量(bvol)。
  2. 计算内外盘净流入比例:Net_Ratio = (外盘 - 内盘) / (外盘 + 内盘)
  3. 买入信号:当净流入比例大于阈值(如 0.15,即主动买盘比主动卖盘多出15%以上),且当前无持仓时,买入目标股票。
  4. 卖出信号:当净流入比例小于负阈值(如 -0.15),且当前持有仓位时,卖出平仓。

Python 策略源码实现

请在 QMT 策略编辑器中新建 Python 策略,并粘贴以下代码:

#coding:gbk

def init(ContextInfo):
    # 设置目标股票与资金账号
    ContextInfo.stock = '600000.SH' # 浦发银行
    ContextInfo.set_universe([ContextInfo.stock])
    ContextInfo.account_id = '6000000248' # 请替换为您的真实/模拟资金账号
    ContextInfo.set_account(ContextInfo.account_id)
    
    # 策略参数设置
    ContextInfo.threshold = 0.15 # 资金净流入比例阈值
    print("资金流向策略初始化成功!")

def handlebar(ContextInfo):
    # 仅在最后一根Bar(最新Tick驱动)执行交易逻辑
    if not ContextInfo.is_last_bar():
        return
        
    stock = ContextInfo.stock
    acc_id = ContextInfo.account_id
    
    # 1. 获取内外盘数据
    svol_str = ContextInfo.get_svol(stock)
    bvol_str = ContextInfo.get_bvol(stock)
    
    # 2. 数据类型转换与安全处理
    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 = svol + bvol
    if total_vol == 0:
        return
        
    # 3. 计算净流入比例
    net_inflow_ratio = (bvol - svol) / total_vol
    
    # 4. 获取当前持仓状态
    holding_vol = 0
    position_info = get_trade_detail_data(acc_id, 'STOCK', 'POSITION')
    for pos in position_info:
        if pos.m_strInstrumentID == stock:
            holding_vol = pos.m_nVolume
            break
            
    # 5. 信号判断与下单交易
    if net_inflow_ratio > ContextInfo.threshold and holding_vol == 0:
        # 资金强劲流入,买入100股
        print(f"【买入信号】净流入比例: {net_inflow_ratio:.2%}, 大于阈值 {ContextInfo.threshold:.2%}")
        passorder(23, 1101, acc_id, stock, 5, -1, 100, '资金流向策略', 1, ContextInfo)
        
    elif net_inflow_ratio < -ContextInfo.threshold and holding_vol > 0:
        # 资金强劲流出,卖出平仓
        print(f"【卖出信号】净流出比例: {abs(net_inflow_ratio):.2%}, 大于阈值 {ContextInfo.threshold:.2%}")
        passorder(24, 1101, acc_id, stock, 5, -1, holding_vol, '资金流向策略', 1, ContextInfo)

注意事项

  1. 数据补充:运行此策略前,请确保通过 QMT 客户端的【数据管理】功能补充了对应品种的日线及分笔(Tick)历史数据。
  2. 实盘与回测get_svolget_bvol 在盘中实时行情下表现最精准。回测模式下,其数值取决于历史分笔数据的完整度。