2. TWAP核心原理:时间切片机制、订单拆分逻辑、执行价格计算
好,咱们直接进入正题。
TWAP,全称是Time-Weighted Average Price,时间加权平均价格。名字听着挺唬人,但说白了,它的核心思想就一句话:把一个大订单,切成很多小份,然后均匀地撒在时间轴上。
为什么要这么做?你想想看,如果你在市场上一次性砸进去100个比特币,那价格瞬间就被你打穿了。但如果你分成1000份,每份0.1个BTC,每隔几秒发一个,市场根本感觉不到你的存在。这就是TWAP的价值所在——降低市场冲击,隐藏交易意图。
2.1 时间切片机制:把时间切成豆腐块
时间切片,是TWAP最底层的逻辑。我习惯把它叫做“时间轴上的均匀采样”。
假设你的交易周期是1小时,总共要买100个ETH。你不能一上来就猛干,也不能到最后才突击。你需要把1小时切成N个等长的时间片,比如每30秒一片,一共120片。
这里有个关键点:切片粒度怎么定?
我在项目中遇到过一个问题:切片太细,比如每1秒一片,会导致订单太多,交易所的API限频直接把你封了。切片太粗,比如每10分钟一片,那跟直接下单没啥区别,冲击成本照样高。
我个人建议,切片粒度通常取30秒到2分钟之间。具体取决于你的总交易时长和交易所的限频规则。比如币安的现货交易,限频是1200次/分钟,那你切片就不能超过这个数。
核心公式:
切片数量 N = 总交易时间 / 时间片长度
每片交易量 = 总交易量 / N
嗯,这里要注意:时间片长度必须是固定的。你不能因为市场波动大就临时改切片长度,那样TWAP就失去了“时间加权”的意义。固定切片,是TWAP的纪律性所在。
2.2 订单拆分逻辑:把大象装进冰箱分几步
时间切片只是第一步。真正考验功力的,是订单拆分逻辑。
说白了,就是怎么把每片里的交易量,再拆成更小的订单发出去。这里我总结了几种常见的拆分策略:
- 均匀拆分法:每片内的订单大小完全一样。最简单,也最容易被对手盘识别。
- 随机拆分法:每片内的订单大小在一定范围内随机波动。比如基准是1个ETH,实际发0.8~1.2个ETH。这样可以增加对手盘识别的难度。
- 泊松分布拆分法:按照泊松分布来生成订单间隔和大小。更接近真实的人类交易行为,隐蔽性最好。
我曾经踩过一个坑:用均匀拆分法做TWAP,结果被做市商的算法识别出来了。他们在我每次下单前提前挂单,导致我每次都买在最高点。后来我改成随机拆分,情况立刻好转。
下面是一个简单的Python代码示例,展示随机拆分逻辑:
import random
def split_order(total_qty, num_slices, base_qty_per_order):
"""
随机拆分订单
:param total_qty: 总交易量
:param num_slices: 切片数量
:param base_qty_per_order: 每笔订单基准量
"""
orders = []
remaining = total_qty
for i in range(num_slices):
# 随机波动 ±20%
qty = base_qty_per_order * random.uniform(0.8, 1.2)
qty = min(qty, remaining) # 不能超过剩余量
orders.append(round(qty, 6))
remaining -= qty
return orders
# 示例:总100 ETH,分120片,每片基准0.83 ETH
order_list = split_order(100, 120, 0.83)
print(f"共生成 {len(order_list)} 笔订单,总交易量: {sum(order_list):.2f} ETH")
小技巧: 我建议在拆分时加入一个“余量处理”逻辑。因为随机拆分最后可能会有少量剩余,我习惯把剩余量加到最后一笔订单里,或者直接丢弃(如果剩余量小于最小交易单位)。
2.3 执行价格计算:你到底买了什么价
TWAP的最终目标,是让成交均价接近这段时间的市场平均价。那怎么算这个均价呢?
这里有两种计算口径:
| 计算方式 | 公式 | 适用场景 |
|---|---|---|
| 理论TWAP价格 | Σ(每片时间中点价格) / N | 回测、策略评估 |
| 实际成交均价 | 总成交金额 / 总成交数量 | 实盘结算、绩效分析 |
理论TWAP价格,是你理想中应该买到的价格。它假设你在每个时间片的中点,以当时的市场价格成交。这个价格通常用来做回测,看看你的策略在历史数据上表现如何。
实际成交均价,才是你真正付出的成本。因为市场有滑点、有延迟,实际成交价往往比理论价要差一些。这个差值,就是你的执行成本。
我个人的习惯是,用实际成交均价与理论TWAP价格的偏离度,来衡量算法执行的好坏。偏离度越小,说明你的TWAP执行得越完美。
避坑指南: 我曾经犯过一个错误——直接用盘口中间价作为理论价格。结果发现,在流动性差的时候,中间价根本成交不了。后来我改用“最近一笔成交价”作为基准,才更贴近实际情况。
2.4 核心逻辑流程图
为了让你更直观地理解TWAP的完整流程,我画了一张图:
这张图把TWAP的五个核心环节串起来了。从输入参数开始,到时间切片、订单拆分、执行下单,最后计算成交均价。注意右侧那条虚线,它代表一个反馈循环——如果实际成交均价偏离理论值太多,我会回头调整切片粒度或拆分策略。
2.5 几个关键参数的经验值
最后,分享几个我在实战中总结的参数经验:
- 切片数量:建议在50~200片之间。太少起不到平滑效果,太多容易被限频。
- 单笔订单金额:不要超过该交易对24小时平均交易量的0.1%。否则容易被盯上。
- 时间片长度:至少30秒。太短的话,订单还没成交就被撤单了,浪费手续费。
- 随机波动范围:±15%~±25%比较合适。波动太小没效果,波动太大容易导致某一片交易量过大。
我的习惯: 每次启动TWAP之前,我会先跑一次模拟。用历史数据回放一遍,看看理论均价和模拟成交均价的差距。如果差距超过0.05%,我就会调整参数。这个习惯帮我避免了好几次大亏。
好了,TWAP的核心原理就这些。时间切片是骨架,订单拆分是血肉,执行价格计算是灵魂。三者缺一不可。下一节我们会聊到更进阶的内容——如何应对极端行情下的TWAP执行。不过那是后话了,先把今天这些消化掉。
公众号:蓝海资料掘金营,微信deep3321