一、TWAP核心原理:时间切片机制、均匀分配逻辑、订单执行时间表
各位同学好,我是老张。今天咱们来聊聊TWAP最核心的三个东西——时间切片、均匀分配、执行时间表。这三个概念,说白了就是TWAP的骨架。你把这套东西吃透了,后面写代码就是水到渠成的事。
1.1 时间切片机制——把大单子切成小份
先问大家一个问题:你手里有100万股茅台要卖,你会怎么卖?
一次性砸出去?那股价直接被你打穿几个点,你信不信?
我早年刚入行的时候,就干过这种蠢事。当时接了个大单,想着快进快出,结果一单下去,盘口直接空了,后面几笔全成交在低价。被风控叫去喝茶,那滋味……嗯,不提了。
TWAP的思路很简单:把时间切成等长的小段,每段只执行一小部分订单。
举个例子:
- 总订单:100万股
- 执行时间:10:00 - 11:00(60分钟)
- 切片长度:1分钟
- 切片数量:60片
这样每片只需要处理约1.67万股。市场压力瞬间就分散了。
核心公式:
切片数量 = 总执行时间 / 切片长度
每片成交量 = 总订单量 / 切片数量
你想想看,这就像吃蛋糕。一整块蛋糕你一口吞下去,噎得慌。切成60小块,慢慢吃,舒服多了。
1.2 均匀分配逻辑——不偏不倚,一碗水端平
切片切好了,接下来就是怎么分配的问题。
TWAP的核心思想就四个字:均匀分配。
什么意思?就是每个时间切片里,你执行的订单量是一样的。不因为某段时间流动性好就多买,也不因为某段时间波动大就少买。
我见过一些新手,觉得「既然10:30那会儿成交量最大,我就在那会儿多卖点」。听起来有道理,但你想过没有——如果所有人都这么想,那10:30的抛压会多大?你反而成了那个制造波动的人。
TWAP的逻辑是:我不管市场怎么变,我就按我的节奏来。
具体到代码里,均匀分配就是:
# 伪代码示例
total_volume = 1000000 # 总订单量
num_slices = 60 # 切片数
volume_per_slice = total_volume / num_slices # 每片约16667股
for i in range(num_slices):
execute(volume_per_slice)
sleep(60) # 等1分钟
你看,就这么简单。但实际项目中,这里有个坑——整除问题。
注意:总订单量不一定能被切片数整除。比如100万股分60片,每片16666.666...股。你总不能下0.666股的单子吧?
我通常的做法是:前59片每片16666股,最后一片补足余数。或者用随机分配,让每片在16666-16667之间浮动。
1.3 订单执行时间表——你的作战地图
有了切片,有了分配逻辑,接下来就是排时间表了。
订单执行时间表,说白了就是一张表,告诉你:什么时间,该干什么事。
我习惯用表格来管理这个时间表,清晰直观:
| 时间窗口 | 切片编号 | 计划成交量 | 累计成交量 | 完成比例 |
|---|---|---|---|---|
| 10:00 - 10:01 | 1 | 16,667 | 16,667 | 1.67% |
| 10:01 - 10:02 | 2 | 16,667 | 33,334 | 3.33% |
| 10:02 - 10:03 | 3 | 16,667 | 50,001 | 5.00% |
| ... | ... | ... | ... | ... |
| 10:59 - 11:00 | 60 | 16,655 | 1,000,000 | 100% |
这个表有什么用?
- 监控进度:实时对比「实际成交量」和「计划成交量」,偏差大了就报警
- 调整节奏:如果某个切片没成交完,后面要补回来
- 风控依据:超过某个偏差阈值,自动暂停或人工干预
我曾经遇到过一个情况:某只股票在10:15突然停牌了,我的TWAP还在傻乎乎地发单。幸好时间表里有个「连续N个切片未成交则暂停」的逻辑,帮我拦住了。不然等复牌时,我的订单全堆在那,价格直接飞了。
1.4 核心逻辑流程图
下面这张图,是我自己画的核心逻辑。你把它存下来,后面写代码的时候对照着看:
我的小建议:实际项目中,步骤4里一定要加个「偏差监控」的环节。每执行完一个切片,就对比一下实际成交量和计划成交量。偏差超过5%,就要考虑调整后续切片的速度了。
1.5 三个核心概念的关系
最后,我帮你捋一捋这三个概念的关系:
- 时间切片是「怎么切」——把时间切成小段
- 均匀分配是「怎么分」——每段分多少量
- 执行时间表是「怎么排」——什么时候做什么事
三者缺一不可。切片切不好,分配再均匀也没用;分配不均匀,时间表就是废纸;没有时间表,前面两个就是空中楼阁。
好了,这一章的核心内容就这些。下一章咱们会动手写代码,把今天讲的这些东西落地。到时候你会发现,原理懂了,代码就是翻译工作。