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

如何在 QMT 中利用 Tick 级行情驱动实现高精度日内 VWAP 算法?

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

问题描述

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

Title: QMT 基于实时 Tick 流的日内高频 VWAP 执行算法

Question: 如何利用 Tick 级行情驱动在 QMT 中实现高精度的日内 VWAP 算法?

解决方案

QMT 基于实时 Tick 流的日内高频 VWAP 执行算法

在日内高频执行策略中,成交量加权平均价格(VWAP, Volume Weighted Average Price)是一种广泛使用的算法交易策略,旨在减少对市场的冲击成本,使执行均价接近全天的 VWAP 均价。

在 QMT(迅投量化平台)中,我们可以利用 handlebar 驱动机制在获取最新的 Tick 数据时实时计算目标执行量,并结合 passorder 进行精确拆单下单。


一、核心实现逻辑

  1. Tick 级数据驱动:QMT 盘中最后一根 K 线的每个 Tick 都会触发一次 handlebar(ContextInfo),利用 ContextInfo.get_full_tick() 获取实时盘口与成交量。
  2. 历史切片与预测:根据历史日内成交量分布预估当天的成交量分布比例。
  3. 动态计算执行量:在每个 Tick 周期计算累计目标成交量与实际已成交量的偏差,动态生成下单委托。
  4. 订单发送:调用 passorder 按照指定选价类型(如对手价或最新价)提交委托。

二、QMT VWAP 策略源码示例

#coding:gbk
import numpy as np
import pandas as pd

def init(ContextInfo):
    # 设置交易标的与账号
    ContextInfo.stock = '600000.SH'
    ContextInfo.account = '6000000248'
    ContextInfo.set_universe([ContextInfo.stock])
    ContextInfo.set_account(ContextInfo.account)
    
    # 设置策略目标总交易股数(正数买入,负数卖出)
    ContextInfo.total_target_shares = 10000
    ContextInfo.traded_shares = 0
    
    # 预设全天交易时间片段数(如5分钟为一个 slice,全天48个片段)
    # 这里简化为按进度驱动,利用 Tick 数据更新比例
    print("VWAP 算法策略初始化完成")

def handlebar(ContextInfo):
    # 仅在最后一根 Bar(实时盘中)触发执行
    if not ContextInfo.is_last_bar():
        return
    
    stock = ContextInfo.stock
    acc = ContextInfo.account
    
    # 1. 获取最新 Tick 数据
    tick_data = ContextInfo.get_full_tick([stock])
    if stock not in tick_data:
        return
    
    last_price = tick_data[stock]['lastPrice']
    current_vol = tick_data[stock]['volume'] # 当天累计成交量(手)
    
    # 2. 查询当前账户委托与成交明细,计算已成交量
    deals = get_trade_detail_data(acc, 'STOCK', 'DEAL')
    completed_vol = 0
    for d in deals:
        if d.m_strInstrumentID == stock:
            completed_vol += d.m_nVolume
    
    # 3. 计算剩余目标量与发单逻辑
    remaining_target = ContextInfo.total_target_shares - completed_vol
    if remaining_target <= 0:
        return
    
    # 简易VWAP逻辑:根据实时买卖盘口量和剩余量,小批量拆单(如每次买入1000股或对手盘一档量的10%)
    ask_vol_1 = tick_data[stock]['askVol'][0] * 100 # 卖一档挂单量(股)
    order_vol = int(min(remaining_target, max(100, ask_vol_1 * 0.1)))
    
    # 调整为一手(100股)的整数倍
    order_vol = (order_vol // 100) * 100
    
    if order_vol >= 100:
        # 4. 调用 passorder 下单,采用对手价(prType=14)或最新价(prType=5)
        # opType 23 代表股票买入;orderType 1101 代表单股单账号股数下单
        passorder(23, 1101, acc, stock, 14, -1, order_vol, 'VWAP_ALGO', 1, ContextInfo)
        print(f"[VWAP执行] 最新价:{last_price}, 发送委托股数:{order_vol}, 剩余未执行:{remaining_target - order_vol}")

三、注意事项与优化方向

  1. 快速交易模式(quickTrade):在 passorder 中将 quickTrade 参数设置为 12,可实现在 Tick 到来时立即触发下单,无需等待 Bar 走完。
  2. 高级内置算法:QMT 系统内置了高级算法交易接口 smart_algo_passorder,支持原生 VWAP / TWAP 算法拆单。如果柜台支持智能算法,可以直接调用:
    smart_algo_passorder(23, 1101, acc, stock, 5, -1, 10000, "VWAP_ALGO", 1, "remark", "VWAP", 20, 0, ContextInfo)
    
  3. 撤单与挂单管理:高频执行中需配合 can_cancel_ordercancel 及时撤销未成交的挂单,防止追单导致仓位超限。