2. 核心数学原理:时间加权平均价格的计算公式、切片逻辑与权重分配、订单拆分模型
各位同学,咱们今天来啃硬骨头——TWAP的数学内核。说实话,很多做量化的人把TWAP想得太简单了,以为就是“把单子均匀拆开,每隔一段时间扔一笔”。嗯,如果你真这么干,实盘的时候大概率会被市场教育得鼻青脸肿。
我当年刚入行时也犯过这个错。记得有一次做ETF的TWAP,我天真地用了等量拆分,结果尾盘被流动性黑洞直接吞掉两个滑点。从那以后,我老老实实把数学原理重新捋了一遍。今天就把这些经验分享给你。
2.1 时间加权平均价格的计算公式
先搞清楚一个根本问题:TWAP到底在算什么?
TWAP的全称是Time-Weighted Average Price,时间加权平均价格。它的定义很简单——在某个时间段内,每个时间点的价格按照时间权重求平均。
数学公式长这样:
TWAP = (P₁ + P₂ + P₃ + ... + Pₙ) / N
其中Pᵢ是第i个时间点的价格,N是总时间点数量。
等等,你可能会问:这不就是简单算术平均吗?时间加权体现在哪?
好问题。其实这个公式隐含了一个假设——每个时间点的权重是相等的。也就是说,每个时间切片对最终价格的贡献是一样的。这就是“时间加权”的真正含义:权重由时间决定,而不是由成交量决定。
核心区别:
- VWAP(成交量加权):权重 = 成交量,大单成交时价格影响更大
- TWAP(时间加权):权重 = 时间,每个时刻平等对待
我个人习惯把TWAP理解成“时钟驱动”的算法。它不关心市场在某个时刻成交了多少,只关心时间到了没有。说白了,这是一种“时间至上”的哲学。
2.2 切片逻辑与权重分配
公式搞清楚了,接下来就是怎么把一个大单子切成小片。这里有两个关键问题:
- 切多少片?——切片数量
- 每片多大?——权重分配
2.2.1 切片数量怎么定?
切片数量取决于两个因素:执行时长和切片间隔。
切片数量 = 执行总时长 / 切片间隔
举个例子:你要在1小时内完成交易,每5分钟切一片,那就是12片。
但这里有个坑——切片间隔不是随便选的。我建议你考虑以下几点:
- 市场流动性:流动性差的品种,间隔拉长一点,别把盘口打穿
- 订单规模:单子越大,切片越多,但每片不能太小(否则手续费占比太高)
- 交易成本:每笔交易都有固定成本,切片太多不划算
实战经验:
我曾经做过一个回测,把1小时的执行窗口分别切成6片、12片、24片。结果发现12片的效果最好——6片太粗糙,容易被大单干扰;24片又太碎,手续费吃掉不少利润。这个平衡点需要你自己去试。
2.2.2 权重分配:均匀还是不均匀?
标准的TWAP用的是均匀权重——每片大小一样。但实盘中,我很少用纯均匀的。
为什么?因为市场不是均匀的。开盘和收盘时波动大,中间时段相对平稳。如果你在波动大的时段也按均匀权重下单,很容易吃到坏价格。
所以,我常用的权重分配策略有两种:
| 策略类型 | 权重分配方式 | 适用场景 |
|---|---|---|
| 均匀权重 | 每片权重 = 1/N | 市场平稳、流动性充足 |
| 非均匀权重 | 根据历史波动率调整 | 波动率不对称、有特殊事件 |
非均匀权重的核心思想是:波动大的时段少下点,波动小的时段多下点。这样能有效降低执行成本。
具体怎么算?我一般用历史波动率曲线来做权重映射:
权重_i = (1 / 波动率_i) / Σ(1 / 波动率_j)
这个公式的意思是:波动率越高的时段,权重越低。你想想看,这很符合直觉——市场乱的时候别瞎掺和。
注意:
非均匀权重虽然能优化执行效果,但有一个副作用——它会让你的执行时间偏离标准TWAP。如果你的考核标准是“严格跟踪TWAP”,那还是老老实实用均匀权重吧。
2.3 订单拆分模型
好了,权重分配好了,接下来就是怎么把单子拆出去。这里我介绍三种常见的拆分模型,也是我在项目中实际用过的。
2.3.1 固定时间间隔模型
这是最基础的模型。每到一个时间点,就发一笔固定大小的订单。
每片数量 = 总数量 / 切片数量
优点:简单、容易实现、回测效果好。
缺点:实盘容易被对手盘预判,而且遇到流动性枯竭时很被动。
2.3.2 随机时间间隔模型
为了规避被预判的问题,我建议在时间间隔上加点随机性。
实际间隔 = 基准间隔 + random(-δ, +δ)
其中δ是随机偏移量,一般取基准间隔的10%-20%。
这样做的好处是:对手盘很难摸清你的下单规律。坏处是:执行时间可能会超出预设窗口。
2.3.3 动态调整模型
这个模型是我最常用的。它根据市场实时状态动态调整每片的数量。
核心逻辑是:
- 设定一个目标执行曲线(比如线性曲线)
- 每片下单前,检查当前已成交量和目标成交量的偏差
- 如果落后了,就加大下一片的数量;如果超前了,就减少
代码实现大概是这样的:
def dynamic_twap_slice(total_qty, elapsed_time, total_time, filled_qty):
# 目标成交量
target_qty = total_qty * (elapsed_time / total_time)
# 偏差
deviation = target_qty - filled_qty
# 剩余时间
remaining_time = total_time - elapsed_time
# 下一片数量
next_slice = (total_qty - filled_qty) / remaining_time * slice_interval
# 加上偏差修正
next_slice += deviation * correction_factor
return max(min_slice, next_slice)
这个模型的好处是:能自动适应市场变化。如果前面成交慢了,后面会自动加速补回来。我曾经用这个模型在港股上跑过,效果比固定模型好不少。
三种模型对比:
| 模型 | 优点 | 缺点 | 推荐指数 |
|---|---|---|---|
| 固定时间间隔 | 简单、可预测 | 易被预判、不灵活 | ★★★ |
| 随机时间间隔 | 抗预判 | 可能超时 | ★★★★ |
| 动态调整 | 自适应、鲁棒性强 | 实现复杂 | ★★★★★ |
2.4 核心逻辑流程图
说了这么多,咱们用一张图把整个流程串起来。这是我画的核心逻辑图,你仔细看看:
这张图把整个流程串起来了。从输入开始,经过切片、权重分配、模型选择,最后输出订单。每一步都有讲究,每一步都影响最终的执行效果。
2.5 避坑指南
最后,我把自己踩过的坑总结一下,你遇到类似情况时能绕开:
- 坑1:切片间隔太短——我曾经在A股上设了10秒的间隔,结果每片只有几百股,手续费占比高得吓人。建议至少30秒以上。
- 坑2:忽略市场微观结构——TWAP在流动性好的品种上效果不错,但在小盘股上容易把价格打飞。记得根据品种特性调整参数。
- 坑3:回测过度优化——回测时参数调得再好,实盘也可能翻车。我建议留20%的数据做样本外测试,别全信回测结果。
我的建议:
刚开始做TWAP时,先用均匀权重+固定间隔跑一段时间,把基础逻辑跑通。等积累足够数据后,再逐步引入非均匀权重和动态调整模型。别一上来就搞复杂的,容易翻车。
好了,这一章的内容就到这。数学原理是TWAP的根基,搞懂了这些,后面的代码实现和实战优化才能站得住脚。你先把公式和模型消化一下,有问题随时问我。