第十七章:冲击成本优化策略
冲击成本这东西,说白了就是你的交易指令对市场价格的「推背感」。你买得越急,价格就被推得越高;你卖得越狠,价格就被砸得越深。我做了这么多年量化,见过太多人策略回测跑得漂亮,一上实盘就亏钱——十有八九是没处理好冲击成本。
今天咱们聊聊怎么优化这个冲击成本。核心就三招:最优执行算法、自适应拆分策略、动态调整下单节奏。
17.1 最优执行算法:找到那个「甜点」
最优执行算法,本质上是在回答一个问题:我到底该多快把单子吃完?
太快了,冲击成本高。太慢了,市场波动可能吃掉你的利润。这里有个经典的模型叫 Almgren-Chriss,我当年第一次看的时候觉得挺绕,后来自己手推了一遍才明白——它其实就是在时间成本和冲击成本之间找平衡。
核心公式长这样:
总成本 = 冲击成本 + 时间风险成本
= α * 成交量比例 + β * 持仓时间 * 波动率
其中 α 和 β 是你要调的参数。α 越大,说明市场对你的单子越敏感,你就得拆得更碎。β 越大,说明波动风险高,你就得跑快点。
我个人习惯的做法:
先用历史数据跑一遍参数网格搜索,找到 α 和 β 的合理范围。然后上实盘用小资金试,观察实际成交的滑点。我一般会留一个「安全边际」——把理论算出来的最优速度再放慢 10%。
17.2 自适应拆分策略:让市场猜不透你
固定拆单策略有个致命问题:容易被别人「盯上」。你想想看,如果每次都是 100 手拆成 10 笔,每笔 10 手,有心人观察几轮就能摸清你的规律。
自适应拆分,就是让拆单的节奏和大小跟着市场状态走。我常用的方法有几种:
- 成交量加权拆分:根据过去 N 分钟的成交量分布来分配每笔单子的大小。成交量大的时段多拆,成交量小的时段少拆。
- 波动率自适应拆分:波动率高了,单笔拆小一点,避免被「闪崩」吃掉。波动率低了,可以适当放大单笔。
- 随机化拆分:在合理范围内加入随机因子,让对手盘无法预测你的下一笔在哪。
避坑指南:
我曾经在某个品种上用了纯随机拆分,结果因为随机性太大,导致最后一笔没成交完,收盘时被迫用市价单扫货,反而亏了更多。后来我加了一个「进度监控」——如果到时间窗口的 80% 还没完成 70% 的成交量,就自动切换到更激进的拆单模式。
17.3 动态调整下单节奏:看菜下饭
下单节奏,说白了就是「什么时候该快,什么时候该慢」。这个判断依据,我一般看三个信号:
| 信号类型 | 判断标准 | 应对策略 |
|---|---|---|
| 订单簿深度 | 买一卖一价差 > 阈值 | 放慢节奏,等流动性恢复 |
| 成交速度 | 最近 10 笔成交间隔 < 100ms | 说明有人在抢单,可以适当加快 |
| 价格趋势 | 最近 1 分钟涨跌幅 > 0.5% | 暂停下单,等趋势稳定 |
嗯,这里要注意:这三个信号不是独立的。比如订单簿深度变差的同时,成交速度可能也在加快——这时候就要综合判断。我自己的做法是给每个信号打个分,总分超过某个阈值就触发节奏调整。
17.4 整体框架:一张图说清楚
下面这张图是我自己画的一个执行框架,你可以把它当成一个「决策流水线」:
这个框架的好处是:每个模块都可以独立调优。比如你觉得自适应拆分效果不好,可以只改模块2,不影响其他部分。我自己的系统里,这三个模块是跑在三个不同的线程里,通过共享内存交换中间结果,效率还不错。
17.5 实战中的几个坑
最后分享几个我踩过的坑,希望能帮你省点学费:
- 别迷信理论模型。Almgren-Chriss 模型假设市场是连续的,但实际中经常有跳空。我建议在模型输出上加一个「熔断机制」——如果理论建议的下单速度超过某个阈值,就强制降速。
- 回测和实盘是两回事。回测里冲击成本是算出来的,实盘里是亏出来的。我一般会留 20% 的仓位做「试单」,用真实成交数据来校准模型参数。
- 别忽略交易所的规则。有些交易所对撤单率有限制,拆得太碎反而会被罚。我记得有一次在某个小交易所,因为撤单率太高被限制了交易权限,折腾了两天才恢复。
重要提醒:
冲击成本优化不是越复杂越好。我见过有人搞了十几个参数、三层神经网络,结果跑起来还不如简单的 VWAP 拆分。记住一个原则:先跑通,再优化,最后才上复杂度。
好了,这一章的内容就这些。冲击成本优化是个实践性很强的话题,建议你拿自己的历史数据跑一遍,看看不同参数下的效果差异。你会发现,有时候一个小小的参数调整,就能省下不少钱。