一、拆单算法概述

什么是拆单算法?

拆单算法,说白了就是——把一个大订单切成很多小单子,然后分批扔到市场里去。

举个例子。你想买100万股某只股票。如果一次性下单,盘口那点挂单根本接不住。价格会被瞬间推高好几个点。你想想看,这得多亏?

拆单算法要解决的就是这个问题。它把100万股拆成1000笔,每笔1000股。每隔几秒扔一笔。这样市场根本感觉不到有人在大量买入。

我个人习惯把拆单算法比作「蚂蚁搬家」。大块头进不去门,那就拆成小块,一块一块搬进去。道理是一样的。

为什么需要拆单?

这个问题我问过不少刚入行的朋友。他们的第一反应往往是:「直接下单不行吗?」

行,当然行。但代价你可能承受不起。

我遇到过一个大客户,曾经一次性下了5000手茅台的多单。结果呢?成交均价直接比开盘价高了2.3%。那一单下来,光冲击成本就亏了上百万。嗯,从那以后他再也不敢这么干了。

拆单的必要性,主要体现在三个方面:

  • 市场深度有限:盘口的挂单就那么点,大单进去直接吃掉好几个价位
  • 冲击成本太高:价格被推高后,后面的单子全得在高位成交
  • 容易被盯上:大单暴露了你的交易意图,别人会抢跑

核心观点:拆单不是可选项,而是大额交易的必选项。不拆单的交易,就像开着坦克过独木桥——不是过不去,是代价太大。

拆单的核心目标

拆单算法有三个核心目标。我按重要程度排个序:

1. 降低冲击成本

这是最直接的目标。冲击成本怎么算?

冲击成本 = 实际成交均价 - 理想成交均价

理想成交均价,就是你下单那一刻的市场中间价。实际成交均价,是你所有小单成交后的平均价格。

我见过最夸张的一次,某机构一次性扫货,冲击成本高达1.8%。而用拆单算法,同样的订单量,冲击成本控制在0.15%以内。差距是10倍以上。

避坑指南:我曾经以为拆得越细越好。后来发现不是这样。拆得太细,交易时间拉长,市场波动风险反而增加了。这里有个平衡点,后面会详细讲。

2. 隐藏交易意图

这一点很多人容易忽略。你想想看,如果市场知道你要买100万股,会发生什么?

做市商会把价格拉高。其他交易者会抢在你前面买入。甚至有人会故意挂高价等你来接盘。

拆单算法通过随机化下单时间和数量,让每一笔小单看起来都像是独立的散户交易。市场很难把这些小单关联起来,也就猜不到你的真实意图。

我记得有一次做回测,对比了隐藏意图和不隐藏意图两种情况。结果发现,被识破意图的情况下,交易成本平均高出0.5%。对于大资金来说,这就是几百万的差距。

3. 控制执行风险

执行风险是什么?就是你下单的过程中,市场突然变了方向。

比如你正在买入,突然出了个利空消息,股价暴跌。这时候你还要不要继续买?

拆单算法允许你在执行过程中动态调整。发现情况不对,可以暂停、减速、甚至撤销剩余订单。这种灵活性,一次性下单是做不到的。

注意:拆单算法不是万能的。它解决的是执行层面的问题,而不是策略层面的问题。如果你的策略本身有问题,拆得再细也没用。

拆单算法的知识体系

下面这张图,是我自己总结的拆单算法核心知识框架。你可以把它当作整个课程的地图:

拆单算法核心知识体系 降低冲击成本 隐藏交易意图 控制执行风险 核心算法模型 TWAP VWAP Implementation Shortfall 自适应算法 订单切片策略 时间序列预测 市场冲击模型 风险控制模块 目标:以最低成本完成大额订单执行

这张图把拆单算法的核心要素串起来了。从上到下看:

  • 最顶层是三个核心目标,它们决定了算法的设计方向
  • 中间是几类主流算法模型,各有各的适用场景
  • 底层是支撑这些算法的关键技术

整个课程就是围绕这张图展开的。每一章都会深入讲解其中一个模块。

一个简单的拆单示例

光说理论太枯燥。我写个最简单的拆单逻辑,让你感受一下:

def simple_split(total_shares, num_slices):
    """
    最简单的拆单:平均分配
    total_shares: 总股数
    num_slices: 拆成多少笔
    """
    base = total_shares // num_slices
    remainder = total_shares % num_slices
    
    orders = []
    for i in range(num_slices):
        # 把余数均匀分配到前面的订单中
        size = base + (1 if i < remainder else 0)
        orders.append(size)
    
    return orders

# 示例:10万股拆成20笔
orders = simple_split(100000, 20)
print(f"每笔数量:{orders}")
print(f"总股数:{sum(orders)}")

这个例子虽然简单,但包含了拆单算法的核心思想:把大单拆小,分批执行。实际生产环境中的算法要复杂得多,要考虑市场流动性、波动率、时间成本等因素。但本质是一样的。

个人经验:我刚开始做拆单算法时,就是从这种最简单的平均分配开始的。后来发现市场不是均匀的,才慢慢加入了各种优化。建议你也从简单开始,逐步迭代。

小结

拆单算法不是什么神秘的东西。它的本质就是:用时间和空间换成本

把一个大订单分散到不同的时间点、不同的价位去执行。虽然执行时间拉长了,但冲击成本大幅降低,交易意图也被隐藏了。

嗯,这一章就到这里。后面的章节会逐一深入每个算法模型和关键技术。你先把基础概念吃透,后面学起来会轻松很多。


专注资料整理