第十七章:执行算法与市场冲击:TWAP、VWAP算法、冰山订单、减少市场冲击的技巧

做期权波动率曲面套利,策略再好,执行不到位也是白搭。我见过太多人,策略回测曲线漂亮得不行,一上实盘就亏钱。为什么?说白了,就是市场冲击吃掉了利润。

今天咱们聊聊执行算法。这不是什么高深理论,而是实打实的实战技巧。你想想看,当你拿着大单子冲进市场,就像一头大象跳进游泳池,水花四溅是必然的。我们的目标,就是让这头大象悄无声息地滑进水里。

市场冲击:你的隐形敌人

市场冲击是什么?简单说,就是你的订单本身影响了价格。你买,价格涨;你卖,价格跌。对于期权交易员来说,这个问题更严重——期权市场流动性本来就不如期货和股票。

核心概念:市场冲击成本 = 实际成交均价 - 订单下达时的市场价格

这个差值,就是你的利润被吃掉的部分。

我记得有一次做沪深300ETF期权套利,策略信号出来了,我直接甩了个500张的市价单进去。结果呢?买一价瞬间跳了3个tick,成交均价比我预期的高了整整2个点。那一单,理论利润是5个点,实际到手只有3个点。嗯,从那以后我再也不敢这么莽了。

TWAP算法:时间加权平均价格

TWAP,全称Time-Weighted Average Price。它的逻辑很简单:把大单拆成小单,在固定时间间隔内均匀执行。

举个例子:你要买1000张期权,执行时间设定为10分钟。TWAP会每分钟下100张的单子,不管市场怎么走。

# 简单的TWAP算法示例
def twap_executor(total_qty, total_seconds, interval_seconds=60):
    """
    total_qty: 总数量
    total_seconds: 总执行时间(秒)
    interval_seconds: 每次下单间隔(秒)
    """
    num_slices = total_seconds // interval_seconds
    qty_per_slice = total_qty // num_slices
    
    for i in range(num_slices):
        # 这里实际会调用下单接口
        place_order(qty=qty_per_slice, order_type='limit')
        time.sleep(interval_seconds)
    
    # 处理余数
    remaining = total_qty - qty_per_slice * num_slices
    if remaining > 0:
        place_order(qty=remaining, order_type='limit')

我的经验:TWAP适合流动性较好的平值期权。对于深度虚值或深度实值的期权,流动性差,TWAP反而容易暴露意图。我一般只在开盘后半小时和收盘前半小时用TWAP,这两个时段流动性最好。

VWAP算法:成交量加权平均价格

VWAP比TWAP聪明一点。它不按时间均匀分配,而是按历史成交量分布来分配订单。

为什么这样更好?因为市场在不同时间段的成交量是不一样的。开盘和收盘成交量最大,中午最冷清。VWAP会在成交量大的时段多下单,成交量小的时段少下单,这样更不容易被市场察觉。

特征 TWAP VWAP
分配依据 时间均匀 历史成交量分布
适合场景 流动性好、波动小 流动性一般、有规律
执行成本 中等 较低
实现难度 简单 中等
# VWAP算法核心逻辑
def vwap_executor(total_qty, historical_volume_profile):
    """
    historical_volume_profile: 历史成交量分布,例如每5分钟的成交量占比
    """
    for time_slot, volume_ratio in historical_volume_profile.items():
        qty = int(total_qty * volume_ratio)
        if qty > 0:
            place_order(qty=qty, order_type='limit')
            # 等待到下一个时间片
            wait_until_next_slot()

注意:VWAP依赖历史数据。如果当天市场结构发生重大变化(比如突发新闻),历史成交量分布就失效了。我曾经在财报公布日用VWAP,结果被市场打得鼻青脸肿。所以,用VWAP之前,先看看今天有没有什么大事。

冰山订单:隐藏你的真实意图

冰山订单,顾名思义,只露出水面的一小部分,大部分藏在下面。在期权交易中,这招特别管用。

比如你想买1000张,但不想让别人知道。你可以下个冰山订单:显示数量100张,隐藏数量900张。市场只看到100张的买单,以为需求不大,不会急着抬价。等这100张成交了,系统自动再挂出100张,直到全部成交。

冰山订单的关键参数:

  • 显示数量:每次暴露给市场的数量
  • 总数量:实际要成交的总量
  • 价格:限价,不能高于这个价格

我个人习惯把显示数量设为总量的10%-20%。太小了,成交太慢;太大了,暴露风险增加。对于深度虚值期权,流动性差,我会把显示数量设得更小,比如5%。

减少市场冲击的实战技巧

算法是工具,但真正决定成败的是你怎么用。下面这几个技巧,是我这些年真金白银换来的经验。

1. 选择合适的交易时段

期权市场有明确的活跃时段。沪深300ETF期权,上午9:30-10:30和下午2:00-3:00流动性最好。中午11:30-13:00,流动性差得离谱。我从来不在这个时段做大单。

2. 利用期权组合单

如果你要做期权套利,别一个一个下单。用组合单(比如价差单、跨式单),交易所会优先撮合。这样不仅成交快,市场冲击也小。

3. 逆向思维:在对手盘方向下单

市场在涨的时候,你想买,大家都在买,价格自然被推高。反过来,市场在跌的时候,你想买,大家都在卖,你反而能以更低的价格成交。我经常在急跌的时候挂买单,急涨的时候挂卖单,效果出奇的好。

4. 使用暗池和场外交易

对于超大单(比如上万张),直接在公开市场做就是找死。可以考虑场外交易(OTC)或者暗池。虽然成本高一点,但胜在隐蔽。

避坑指南:我曾经在期权到期日那天用TWAP执行一个大单。结果呢?市场波动剧烈,我的订单被来回扫,最后成交均价惨不忍睹。后来我学乖了:到期日当天,要么不做,要么用冰山订单慢慢磨。

知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以看到,从市场冲击这个源头出发,我们有哪些武器可以用。

执行算法与市场冲击知识体系 市场冲击 TWAP算法 VWAP算法 冰山订单 选择合适时段 利用组合单 逆向思维下单 目标:最小化市场冲击,最大化执行质量

执行算法不是万能的,但没有执行算法是万万不能的。TWAP、VWAP、冰山订单,这三样东西,你至少得熟练掌握一个。我个人建议,先从TWAP开始练手,等熟悉了再上VWAP。冰山订单嘛,任何时候都值得用。

记住一句话:在期权市场,谁隐藏得好,谁就能活得更久。

公众号:蓝海资料掘金营,微信deep3321