1. VWAP与TWAP基础概念:定义、计算公式、核心区别与适用场景

各位同学,今天我们来聊聊量化交易里两个最基础、也最常用的策略——VWAP和TWAP。说实话,我刚入行那会儿,也分不清这两个到底有啥本质区别。直到有一次在实盘里用错了策略,被市场狠狠教育了一顿……嗯,从那以后,我对这两个家伙的理解就深刻多了。

1.1 什么是VWAP?

VWAP,全称Volume-Weighted Average Price,翻译过来就是「成交量加权平均价格」。说白了,它不是一个交易策略,而是一个价格基准。你想想看,我们平时看K线图,收盘价、开盘价都是等权重的,但VWAP不一样——它把成交量也考虑进去了。

计算公式其实很简单:

VWAP = Σ(价格 × 成交量) / Σ(成交量)

举个例子:假设某只股票在一天内发生了三笔交易:

  • 第一笔:10元,成交100股
  • 第二笔:11元,成交200股
  • 第三笔:12元,成交300股

那么VWAP = (10×100 + 11×200 + 12×300) / (100+200+300) = 11.33元。

核心要点:VWAP反映的是「真实成交的平均成本」。如果你买入的价格低于VWAP,说明你买得比市场平均价便宜。

我在项目中遇到过不少新手,以为VWAP只是一个指标,看看就完了。其实不然,很多机构交易员把VWAP当作「锚点」——价格低于VWAP时倾向于买入,高于VWAP时倾向于卖出。说白了,这就是一个动态的支撑/阻力位。

1.2 什么是TWAP?

TWAP,全称Time-Weighted Average Price,时间加权平均价格。这个就更简单了——它只关心时间,不关心成交量。

计算公式:

TWAP = Σ(价格) / 样本数量

还是刚才那个例子,三笔交易的价格分别是10、11、12元,那么TWAP = (10+11+12)/3 = 11元。

你发现没有?TWAP完全忽略了成交量的大小。哪怕最后一笔成交了100万股,前面两笔只有100股,TWAP还是按三个价格等权计算。这就是它和VWAP最本质的区别。

我的习惯:在流动性好的市场,我更喜欢用VWAP;在流动性差或者需要隐藏意图的时候,TWAP更合适。这个后面会细说。

1.3 核心区别:一张表说清楚

对比维度 VWAP TWAP
权重依据 成交量 时间
对市场冲击 敏感,大单会拉高VWAP 不敏感,均匀分布
适用流动性 高流动性市场 低流动性市场
执行目标 跟踪市场平均成本 均匀分散时间风险
计算复杂度 需要实时成交量数据 只需要价格数据

这张表我建议你记下来。为什么?因为很多面试官就喜欢问这个。我曾经在一次面试里被问到「你什么时候用VWAP,什么时候用TWAP」,当时我答得不够好,后来专门整理了这个对比表。

1.4 适用场景分析

VWAP适合的场景:

  • 大单拆单执行,比如你要买100万股,不想被市场发现
  • 被动型策略,跟踪指数或基准
  • 流动性好的股票,比如茅台、腾讯这种

TWAP适合的场景:

  • 流动性差的品种,比如一些小盘股、债券
  • 需要隐藏交易意图,避免被「盯上」
  • 市场波动剧烈时,均匀分散风险

避坑指南:我曾经在流动性极差的股票上用了VWAP策略,结果因为成交量稀疏,VWAP计算出来的值严重滞后,导致执行成本比预期高了0.5%。后来我学乖了——流动性差的时候,老老实实用TWAP。

1.5 知识体系结构图

下面这张图是我自己画的,把VWAP和TWAP的核心逻辑串起来了。你看一眼就能明白它们在整个交易体系中的位置。

VWAP与TWAP知识体系 VWAP 成交量加权平均价格 TWAP 时间加权平均价格 核心区别 计算公式 VWAP = Σ(P×V) / Σ(V) 权重:成交量 计算公式 TWAP = Σ(P) / N 权重:时间 适用场景 • 高流动性市场 • 大单拆单执行 • 被动跟踪基准 适用场景 • 低流动性市场 • 隐藏交易意图 • 波动剧烈时分散风险 选择策略前,先问自己:流动性够吗?意图要隐藏吗?

嗯,这张图我花了不少心思。你看,左边是VWAP,右边是TWAP,从计算公式到适用场景,一目了然。我个人习惯在写策略文档时,先画这样一张图,再开始写代码——思路会清晰很多。

1.6 一个简单的代码示例

最后,给你看一段Python代码,计算VWAP和TWAP。代码不长,但很实用。

import pandas as pd
import numpy as np

# 模拟交易数据
data = {
    'price': [10, 11, 12, 11.5, 10.8],
    'volume': [100, 200, 300, 150, 250],
    'time': pd.date_range('09:30', periods=5, freq='5min')
}
df = pd.DataFrame(data)

# 计算VWAP
df['vwap'] = (df['price'] * df['volume']).cumsum() / df['volume'].cumsum()

# 计算TWAP
df['twap'] = df['price'].expanding().mean()

print(df[['time', 'price', 'volume', 'vwap', 'twap']])

这段代码我经常在回测里用。你注意看,VWAP用的是cumsum(累计求和),因为它是动态更新的;TWAP直接用expanding mean,简单粗暴。实际生产中,VWAP的计算会更复杂一些,要考虑盘口数据,但原理就是这个。

一个小技巧:如果你用的是高频数据,建议把VWAP的计算窗口设成「当天」,因为跨天的VWAP没有意义。TWAP则可以根据需要设置时间窗口,比如过去1小时、过去4小时等。

好了,这一章的内容就到这里。VWAP和TWAP的概念其实不难,难的是在实际交易中灵活运用。下一章我们会深入讲VWAP策略的具体实现,包括如何拆单、如何控制滑点——嗯,到时候见。


专注资料整理