🚀 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"
    • 通常不需要设置 startTime 和 endTime(默认全天),或者根据需要设置。
  • 使用 TWAP:
    • 设置 smartAlgoType = "TWAP"
    • 通常需要明确指定 startTime 和 endTime 来定义匀速交易的时间窗口。

代码示例片段:

# -*- 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 的回测模式中,通常无法精确模拟逐笔撮合的算法交易细节。回测主要验证策略逻辑(如什么时候买卖),而算法交易属于执行层面的优化。一般回测时假设以收盘价或开盘价成交即可,实盘时再通过算法交易降低冲击成本。