🚀 AI 一键生成 qmt 策略代码

QMT 智能算法交易:VWAP 和 TWAP 应该如何选择?

qmt | 发布时间: 2025/12/18
以下内容由 EasyQuant 生成。

问题描述

VWAP 和 TWAP 算法有什么区别,我该用哪个?

解决方案

VWAP(成交量加权平均价)和 TWAP(时间加权平均价)是量化交易和算法交易中最基础且最常用的两种拆单策略。它们的主要目的是为了在大额交易时减少对市场的冲击(Market Impact),并隐藏交易意图。

以下是两者的详细对比及选择建议:

VWAP 与 TWAP 算法的区别与选择指南

1. 定义与核心逻辑

VWAP (Volume-Weighted Average Price)

成交量加权平均价算法

  • 核心逻辑:VWAP 策略认为市场的成交量分布是有规律的(例如开盘和收盘成交量大,午盘成交量小)。它会根据标的股票的历史成交量分布模型,预测当天的成交量分布,并按照这个比例来分配下单量。
  • 执行方式:在市场成交活跃时多下单,在成交清淡时少下单。
  • 目标:使最终的成交均价尽可能接近当天的市场 VWAP 均价。

TWAP (Time-Weighted Average Price)

时间加权平均价算法

  • 核心逻辑:TWAP 策略假设价格在时间上是均匀分布的,或者交易者希望在一段时间内匀速买入/卖出。它不考虑成交量的变化,而是将总订单平均分配到指定的时间段内。
  • 执行方式:将大单切分成相等的小单,在固定的时间间隔(如每 5 分钟)进行下单。
  • 目标:在指定时间内均匀地执行交易,避免在某一时刻因下单过重导致价格剧烈波动。

2. 详细对比分析

维度 VWAP (成交量加权) TWAP (时间加权)
参考依据 历史及实时的成交量分布 时间间隔
拆单逻辑 量大时多做,量小时少做 匀速执行,不看成交量
适用场景 大盘股、流动性好的股票、日内波动与成交量正相关的品种 小盘股、流动性差的股票、成交量分布无明显规律的品种
市场冲击 较低(因为跟随了市场流动性) 中等(若在成交清淡时段执行固定量,可能造成冲击)
完成度风险 较高(如果当天成交量极度萎缩,可能导致订单无法全部完成) 较低(按时间强制执行,通常能保证完成)
主要优点 能有效降低滑点,成交均价贴合市场平均水平 逻辑简单,执行可控,适合平滑价格波动
主要缺点 算法复杂,依赖历史数据准确性,可能在极端行情下失效 容易被其他算法识别(因为规律性太强),可能在低流动性时段吃掉所有挂单

3. 我该用哪个?

选择哪种算法主要取决于你的交易标的属性交易目标

建议使用 VWAP 的情况:

  1. 大额订单:你的订单量占该股票日均成交量的比例较大(例如超过 1% - 5%)。
  2. 高流动性标的:交易的是沪深300、中证500等成分股,这些股票的日内成交量分布具有统计学规律。
  3. 目标是减少滑点:你希望你的成交均价不要偏离市场当天的平均成本太远。
  4. 避免激进交易:你不希望在市场没量的时候硬推价格。

建议使用 TWAP 的情况:

  1. 必须完成交易:无论市场成交量如何,你必须在收盘前买入或卖出指定数量(VWAP 可能会因为量小而剩下部分未成交)。
  2. 低流动性或小盘股:标的股票成交稀疏,历史成交量规律不明显,或者容易出现长时间无成交的情况。
  3. 平滑时间风险:你认为当前价格波动是随机的,希望通过拉长时间来平摊成本。
  4. 简单策略:不需要复杂的预测模型,只需简单地分批成交。

4. 在 QMT 中如何使用

在 QMT 的 Python API 中,这两种算法都可以通过 smart_algo_passorder 函数直接调用。

函数原型:

smart_algo_passorder(opType, orderType, accountid, orderCode, prType, modelprice, volume, smartAlgoType, limitOverRate, minAmountPerOrder, [targetPriceLevel], ContextInfo)

参数设置区别:

  • 使用 VWAP:
    • 设置 smartAlgoType = "VWAP"
    • 通常不需要设置 startTimeendTime(默认全天),或者根据需要设置。
  • 使用 TWAP:
    • 设置 smartAlgoType = "TWAP"
    • 通常需要明确指定 startTimeendTime 来定义匀速交易的时间窗口。

代码示例片段:

# -*- coding: gbk -*-

def handlebar(ContextInfo):
    # 示例:使用 VWAP 算法买入
    # smartAlgoType 设置为 "VWAP"
    # limitOverRate (量比) 设置为 10,表示下单量不超过市场成交量的 10%
    smart_algo_passorder(
        23,                 # opType: 股票买入
        1101,               # orderType: 单股单账号
        '600000001',        # accountid
        '600000.SH',        # orderCode
        5,                  # prType: 最新价
        -1,                 # modelprice: 随行就市
        10000,              # volume: 总买入量
        "VWAP",             # smartAlgoType: 算法类型
        10,                 # limitOverRate: 量比控制
        0,                  # minAmountPerOrder
        ContextInfo
    )

    # 示例:使用 TWAP 算法买入
    # smartAlgoType 设置为 "TWAP"
    # 必须保证在指定时间内匀速完成
    smart_algo_passorder(
        23, 
        1101, 
        '600000001', 
        '600000.SH', 
        5, 
        -1, 
        10000, 
        "TWAP",             # 算法类型
        0,                  # TWAP通常不强依赖量比,填0或默认
        0, 
        ContextInfo
    )

Q&A

Q: VWAP 算法一定能比 TWAP 获得更好的价格吗?
A: 不一定。VWAP 只是让你的成交价接近市场均价。如果当天股价单边下跌,且成交量主要集中在下跌后的低位,VWAP 表现会不错;但如果股价单边上涨且量增,VWAP 可能会让你在价格较高时买入更多。TWAP 则更加中性。

Q: 为什么小盘股不建议用 VWAP?
A: 小盘股的成交量往往是不连续的,可能上午没量,下午突然放量。VWAP 依赖的历史统计规律在小盘股上往往失效,导致算法无法准确分配下单比例,甚至可能因为长时间没量而导致订单无法完成。

Q: 可以在回测中使用这两个算法吗?
A: 在 QMT 的回测模式中,通常无法精确模拟逐笔撮合的算法交易细节。回测主要验证策略逻辑(如什么时候买卖),而算法交易属于执行层面的优化。一般回测时假设以收盘价或开盘价成交即可,实盘时再通过算法交易降低冲击成本。