13、大单拆分算法:TWAP、VWAP、POV算法,算法单的识别,跟随算法单的策略

做量化交易的朋友,一定都遇到过这种情况:

你盯着一只股票,突然看到一笔几千手的买单砸进去。价格瞬间拉了两个点。你心里一紧——这是谁在买?是机构进场了,还是某个大户一时兴起?

其实,真正的大资金从来不会这么干。他们用的是算法单。说白了,就是把一个大单拆成无数个小单,一点一点喂给市场。我刚开始接触这个领域时,也觉得这不过是「分批下单」而已。后来自己跑过回测才发现,这里面的门道深着呢。

核心认知:算法单的本质,是在「交易成本」和「市场冲击」之间找平衡。你想想看,一笔1000万的买单,如果一次性砸进去,价格可能直接被你推高2%。这2%就是你的成本。但如果拆得太碎,拖的时间太长,价格又可能朝不利方向跑。算法要解决的,就是这个两难问题。

13.1 三大经典拆分算法

我个人习惯把算法单分成三类:TWAP、VWAP、POV。它们各有各的脾气,也各有各的适用场景。

13.1.1 TWAP(时间加权平均价格)

TWAP 是最朴素的算法。它的逻辑很简单:把时间切成等份,每份下同样数量的单子。

举个例子。你要在1小时内买入10万股。TWAP 会怎么做?它会切成60个1分钟窗口,每个窗口下大约1667股。不管市场怎么波动,它都按这个节奏走。

我在项目中遇到过一种情况:某只股票在下午2点到2点半之间流动性极差。TWAP 算法还在那机械地下单,结果每笔都打出了较大的滑点。嗯,这里要注意——TWAP 适合流动性好、波动小的品种。碰上流动性枯竭,它就是一把钝刀。

# 一个简单的TWAP实现
def twap(total_shares, total_seconds, interval=60):
    """
    total_shares: 总股数
    total_seconds: 总执行时间(秒)
    interval: 每个时间窗口(秒)
    """
    num_intervals = total_seconds // interval
    shares_per_interval = total_shares // num_intervals
    
    orders = []
    for i in range(num_intervals):
        timestamp = i * interval
        orders.append({
            'time': timestamp,
            'shares': shares_per_interval
        })
    return orders

13.1.2 VWAP(成交量加权平均价格)

VWAP 比 TWAP 聪明一点。它不按时间切,而是按成交量切。

它的逻辑是:市场成交量大的时候,我多下点;成交量小的时候,我少下点。这样能减少对市场的冲击。

我曾经用 VWAP 跑过一个回测,效果比 TWAP 好不少。尤其是在开盘和收盘这两个成交量高峰时段,VWAP 能自然地加大下单量,跟市场的节奏合拍。

实战技巧:VWAP 算法的核心是「成交量预测」。你预测得越准,执行效果越好。我一般会用过去20天的平均成交量分布来做预测,再结合当天的实时成交量做动态调整。

# VWAP算法核心逻辑
def vwap(total_shares, volume_profile):
    """
    volume_profile: 每个时间段的预测成交量占比
    """
    total_volume = sum(volume_profile.values())
    orders = []
    for time_slot, volume in volume_profile.items():
        ratio = volume / total_volume
        shares = int(total_shares * ratio)
        orders.append({
            'time': time_slot,
            'shares': shares
        })
    return orders

13.1.3 POV(成交量参与率)

POV 算法更激进一些。它不预设时间,也不预设成交量分布。它只盯一个指标:我的下单量占市场成交量的比例。

比如你设定参与率为10%。那么市场每成交1000股,你就下100股。市场成交快,你就下得快;市场成交慢,你就下得慢。

说白了,POV 是「跟市场走」的算法。它最大的好处是隐蔽性强。因为你的单子始终只占市场的一小部分,不容易被其他交易者察觉。

注意:POV 算法有个坑。如果市场突然缩量,你的单子可能拖很久都执行不完。我曾经遇到过一次,设定10%参与率,结果市场突然冷清,一笔单子挂了两个小时才成交完。所以用 POV 时,一定要设一个「最晚执行时间」的硬约束。

13.2 算法单的识别

识别算法单,说白了就是「抓鬼」。你要从海量的订单流数据里,找出那些机器下单的痕迹。

我总结了几个特征,你可以拿去用:

特征 描述 识别方法
时间均匀性 下单间隔非常规律,误差在毫秒级 计算相邻订单的时间差,看标准差
单量一致性 每笔单子的股数几乎相同 统计单量分布,看是否集中在某个值附近
价格不敏感 不管价格涨跌,都按固定节奏下单 对比下单时的价格变化和下单量
母子单结构 大单拆成小单,小单之间有关联 用聚类算法找出同一来源的订单序列

举个例子。你看到某只股票在10秒内连续出现了10笔买单,每笔都是500股,间隔都是1秒左右。这大概率是算法单。因为人手工下单,不可能这么精准。

13.3 跟随算法单的策略

识别出算法单之后,怎么跟着吃肉?这才是大家最关心的。

我常用的策略有三种:

  1. 提前埋伏法:识别出TWAP或VWAP算法后,估算出它的下单节奏。在它下一次下单前,提前挂单等它来吃。说白了,就是给它「抬轿子」。
  2. 趋势跟随法:如果识别出的是POV算法,说明有大资金在持续买入。这时候可以跟着它的方向做趋势交易。它买你也买,它卖你也卖。
  3. 套利法:有些算法单会引发短期的价格偏离。比如VWAP算法在收盘前大量买入,可能把价格推高。这时候你可以反向操作,等价格回归。

我的经验:跟随算法单最忌讳的是「贪」。你看到算法单在买,就想跟着吃一整段。但算法单的执行时间可能很长,中间会有各种波动。我一般只吃第一波,赚到就走。留点利润给别人,也给自己留条后路。

13.4 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以看到三大算法的定位、识别方法和跟随策略之间的关系。

大单拆分算法知识体系 TWAP 时间加权平均价格 VWAP 成交量加权平均价格 POV 成交量参与率 特征 时间均匀 单量一致 特征 成交量匹配 价格敏感 特征 参与率稳定 跟随市场节奏 算法单识别方法 提前埋伏法 趋势跟随法 套利法

一句话总结:TWAP 看时间,VWAP 看成交量,POV 看参与率。识别它们靠的是订单流的微观特征。跟随它们,靠的是对算法节奏的把握。