问题描述
解决方案
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% - 5%)。
- 高流动性标的:交易的是沪深300、中证500等成分股,这些股票的日内成交量分布具有统计学规律。
- 目标是减少滑点:你希望你的成交均价不要偏离市场当天的平均成本太远。
- 避免激进交易:你不希望在市场没量的时候硬推价格。
建议使用 TWAP 的情况:
- 必须完成交易:无论市场成交量如何,你必须在收盘前买入或卖出指定数量(VWAP 可能会因为量小而剩下部分未成交)。
- 低流动性或小盘股:标的股票成交稀疏,历史成交量规律不明显,或者容易出现长时间无成交的情况。
- 平滑时间风险:你认为当前价格波动是随机的,希望通过拉长时间来平摊成本。
- 简单策略:不需要复杂的预测模型,只需简单地分批成交。
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 的回测模式中,通常无法精确模拟逐笔撮合的算法交易细节。回测主要验证策略逻辑(如什么时候买卖),而算法交易属于执行层面的优化。一般回测时假设以收盘价或开盘价成交即可,实盘时再通过算法交易降低冲击成本。