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

QMT 平台基于日内 VWAP 动态轨道的区间突破策略实现

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

问题描述

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

Title: QMT 日内交易:结合时间加权成交量 (VWAP) 的区间突破策略

Question: 如何使用 QMT 编写一个基于日内 VWAP 上下轨突破的交易策略?

解决方案

QMT 平台基于日内 VWAP 动态轨道的区间突破策略实现

VWAP(Volume-Weighted Average Price,成交量加权平均价)是日内交易中非常重要的基准指标。基于 VWAP 构建的动态上下轨(类似布林带),可以有效捕捉日内强弱趋势的突破行情。


策略逻辑说明

  1. 均线基准:计算当日累积的 VWAP 均价。
  2. 标准差通道:基于价格偏离 VWAP 的幅度计算标准差,构建上限轨(VWAP + N * Std)与下限轨(VWAP - N * Std)。
  3. 买入信号:价格向上突破上限轨,表明多头极强,执行买入开仓。
  4. 卖出/止损信号:价格跌破 VWAP 中轨或下限轨时离场;或在尾盘(如 14:55)强制平仓以规避隔夜风险。

QMT Python 策略源码

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

def init(ContextInfo):
    # 设置标的与资金
    ContextInfo.stock = '600000.SH'
    ContextInfo.set_universe([ContextInfo.stock])
    ContextInfo.set_account('10000001')
    
    # 策略参数
    ContextInfo.std_dev_multiplier = 1.5  # 标准差倍数
    ContextInfo.hold_stock = False        # 持仓状态
    
    print("VWAP 区间突破策略初始化完成。")

def handlebar(ContextInfo):
    # 仅在最后一根 Bar 或盘中实时运行
    if not ContextInfo.is_last_bar():
        return
    
    # 获取当前 K 线索引及时间
    bar_idx = ContextInfo.barpos
    timetag = ContextInfo.get_bar_timetag(bar_idx)
    
    # 获取当日分钟分钟行情数据
    data = ContextInfo.get_market_data_ex(
        fields=['close', 'volume', 'amount'],
        stock_code=[ContextInfo.stock],
        period='1m',
        count=240
    )
    
    if ContextInfo.stock not in data or data[ContextInfo.stock].empty:
        return
        
    df = data[ContextInfo.stock]
    
    # 计算日内累积 VWAP
    cum_volume = df['volume'].cumsum()
    cum_amount = df['amount'].cumsum()
    
    # 避免除以零
    cum_volume = cum_volume.replace(0, np.nan)
    df['vwap'] = cum_amount / cum_volume
    
    # 计算偏离标准差
    std = (df['close'] - df['vwap']).std()
    df['upper_band'] = df['vwap'] + ContextInfo.std_dev_multiplier * std
    df['lower_band'] = df['vwap'] - ContextInfo.std_dev_multiplier * std
    
    latest_close = df['close'].iloc[-1]
    latest_vwap = df['vwap'].iloc[-1]
    latest_upper = df['upper_band'].iloc[-1]
    
    # 获取交易时间 (HHMMSS)
    import time
    time_str = time.strftime('%H%M%S', time.localtime(timetag / 1000))
    
    # 尾盘平仓控制 (14:55 以后平仓避险)
    if time_str >= '145500':
        if ContextInfo.hold_stock:
            passorder(24, 1101, ContextInfo.account, ContextInfo.stock, 5, -1, 100, ContextInfo)
            ContextInfo.hold_stock = False
            print(f"[{time_str}] 尾盘平仓离场")
        return

    # 交易信号判定
    if not ContextInfo.hold_stock and latest_close > latest_upper:
        # 向上突破上轨,买入开仓 100 股
        passorder(23, 1101, ContextInfo.account, ContextInfo.stock, 5, -1, 100, ContextInfo)
        ContextInfo.hold_stock = True
        print(f"[{time_str}] 突破 VWAP 上轨,触发买入信号。最新价: {latest_close}, 上轨: {latest_upper:.2f}")
        
    elif ContextInfo.hold_stock and latest_close < latest_vwap:
        # 跌破 VWAP 中轨,止盈/止损平仓
        passorder(24, 1101, ContextInfo.account, ContextInfo.stock, 5, -1, 100, ContextInfo)
        ContextInfo.hold_stock = False
        print(f"[{time_str}] 跌破 VWAP 中轨,触发卖出信号。最新价: {latest_close}, VWAP: {latest_vwap:.2f}")

策略要点与优化方向

  1. 数据订阅:策略使用 get_market_data_ex 获取 1 分钟周期行情,确保日内成交量与成交额的精度。
  2. 尾盘平仓机制:通过时间戳解析,在 14:55 之后清仓,符合日内交易不留隔夜仓的要求。
  3. 进一步优化:可结合 Level2 的大单买卖数据(如 get_market_data_ex 订阅 l2quoteaux)对突破信号进行二次确认,降低假突破率。