1. TWAP策略基础与市场微观结构
大家好,我是你们的老朋友。今天咱们聊聊TWAP策略的底层逻辑。
TWAP,全称Time-Weighted Average Price,时间加权平均价格算法。说白了,就是把一个大单子拆成很多小单子,按时间均匀地喂给市场。我刚开始做量化那会儿,觉得这玩意儿太简单了——不就是定时定点下单吗?后来在实盘里吃了不少亏,才明白这里面的门道有多深。
1.1 TWAP的核心原理
TWAP的目标很简单:让成交均价尽可能接近这段时间的市场均价。怎么做到呢?
- 时间切片:把总执行时间切成N个等长的时间片
- 均匀分配:每个时间片分配等量的订单
- 被动执行:通常用限价单,挂在买一或卖一位置
举个例子。你要在10分钟内买入10万股的某只股票。TWAP会怎么做?
# 一个极简的TWAP示意
total_shares = 100000
total_seconds = 600 # 10分钟
slice_seconds = 10 # 每10秒下一单
slices = total_seconds // slice_seconds # 60个时间片
per_slice = total_shares // slices # 每片约1667股
print(f"每10秒下单 {per_slice} 股,共 {slices} 次")
嗯,代码看着简单。但实际跑起来,你会发现市场根本不吃这一套。
1.2 订单簿动态——你看到的只是冰山一角
订单簿,就是交易所里所有挂单的集合。买盘和卖盘,一层一层排着队。
我习惯把订单簿想象成一个多层停车场。买一就是第一层,买二是第二层,越往下价格越低。卖盘那边反过来,越往上价格越高。
但这里有个坑:你看到的订单簿,只是冰山一角。很多大单子藏在看不见的地方,比如冰山订单(Iceberg Order)。
关键点:订单簿的深度是动态变化的。你下一笔单子,可能瞬间改变整个订单簿的形态。
为什么会这样?因为高频做市商和套利者的算法比你快得多。你的单子刚挂上去,他们就能感知到,然后迅速调整自己的挂单。
1.3 流动性分层——不是所有流动性都一样
流动性,说白了就是你想买的时候有人卖,想卖的时候有人买。但流动性是有层级的。
| 层级 | 特征 | 典型参与者 |
|---|---|---|
| 第一层(表层) | 买卖价差小,挂单量少 | 高频做市商、散户 |
| 第二层(中层) | 价差适中,挂单量中等 | 机构算法、日内交易者 |
| 第三层(深层) | 价差大,挂单量大 | 长期投资者、套保盘 |
我遇到过最头疼的情况是什么?就是你以为表层流动性够用,结果一单下去,直接把表层吃穿了,然后价格瞬间滑到中层甚至深层。这就是冲击成本的来源。
1.4 冲击成本——TWAP最大的敌人
冲击成本,就是你的订单对市场价格造成的影响。你买得越多,价格被你推得越高。你卖得越多,价格被你砸得越低。
冲击成本主要来自三个方面:
- 即时冲击:你的订单直接吃掉了对手盘的挂单,导致价格变动
- 延迟冲击:其他交易者看到你的订单后,预期价格会继续朝这个方向走,于是提前行动
- 信息泄露:你的大单子被市场嗅到,引发跟风盘
注意:很多新手以为TWAP能完美规避冲击成本。错了。TWAP只是把冲击分散到各个时间点,但总冲击成本并没有消失。我曾经在流动性差的股票上跑TWAP,结果每下一单,价格就跳一下,最后成交均价远高于预期。
1.5 知识体系总览
下面这张图,是我自己梳理的TWAP策略与市场微观结构的关系图。你看一眼,就能明白各个模块是怎么串联的。
我的建议:刚开始学TWAP,别急着优化代码。先把订单簿的微观结构搞清楚。我见过太多人,代码写得飞起,结果连买卖价差都没搞明白。你想想看,连敌人长什么样都不知道,怎么打仗?
1.6 避坑指南
最后,分享几个我踩过的坑:
- 别在流动性差的时间段跑TWAP:比如开盘前15分钟、午休前后、收盘前10分钟。这些时间段,冲击成本会翻倍。
- 别死板地按时间均匀分配:市场波动大的时候,你应该放慢节奏。波动小的时候,可以适当加快。这就是后面要讲的动态TWAP。
- 别忽视订单簿的深度变化:我建议你实时监控买一卖一的挂单量。如果突然变薄,赶紧暂停或者调整策略。
嗯,今天就先聊到这儿。记住一句话:TWAP不是简单的定时下单,而是与市场微观结构的一场博弈。你理解得越深,策略就越抗冲击。