第19章 订单执行优化:订单路由策略、最优执行算法、冰山订单执行、暗池交易

订单执行优化,说白了就是解决一个问题:怎么把单子下得又快又好,还不被市场吃掉

我做了这么多年量化交易系统,见过太多人只盯着策略信号,却忽略了执行环节。结果呢?策略回测年化50%,实盘一跑只剩10%。为什么?滑点、冲击成本、信息泄露,这些才是真正的利润杀手。

这一章,我就把订单执行优化的核心模块拆开来讲。包括路由策略、执行算法、冰山订单,还有暗池交易。嗯,每个点我都会结合项目里的实际案例来说。

核心观点:订单执行不是简单的“把单发出去”,而是一场与市场参与者的博弈。你的执行策略,决定了你的策略收益能兑现多少。

19.1 订单路由策略:把单子送到最合适的地方

订单路由,就是决定你的订单该发到哪个交易所、哪个流动性池子。

你想想看,现在一个股票可能在十几个交易所同时交易。每个交易所的深度、费率、延迟都不一样。选错了路由,要么成交慢,要么成本高,要么被对手盘盯上。

我个人习惯把路由策略分成三类:

  • 价格优先路由:哪个交易所的报价最优,就往哪发。适合小单,追求最优价格。
  • 成本优先路由:考虑交易费率、返佣等因素。适合高频、低利润的策略。
  • 流动性路由:哪个池子深度大,就往哪发。适合大单,减少冲击成本。

我在项目中遇到过一个问题:某个策略在回测里表现很好,但实盘时发现,订单总是被路由到一个延迟较高的交易所。结果呢?等订单到了,最优价格已经没了。后来我加了个延迟感知路由模块,才把问题解决。

小技巧:路由策略不要写死。我建议做成可配置的规则引擎,根据市场状态动态切换。比如盘口价差小的时候用价格优先,价差大的时候用流动性优先。

19.2 最优执行算法:把大单拆成小单的艺术

最优执行算法,说白了就是怎么把一个大单拆成若干小单,分批执行,减少对市场的冲击。

常见的算法有几种:

算法名称 核心逻辑 适用场景
TWAP(时间加权平均价格) 按时间均匀拆分 流动性好、波动小的品种
VWAP(成交量加权平均价格) 按历史成交量分布拆分 日内交易、追求市场均价
Implementation Shortfall 最小化执行成本与机会成本之和 大单、紧急交易
Adaptive算法 根据实时市场状态动态调整 波动剧烈、流动性变化大的场景

我记得有一次,一个客户要执行一笔5000手的订单。如果用TWAP,市场波动一大,执行成本就失控了。后来我改用Implementation Shortfall算法,实时监控市场冲击,动态调整下单节奏。最终执行成本比TWAP低了30%。

这里给个简单的VWAP算法伪代码:

class VWAPExecutor:
    def __init__(self, total_qty, start_time, end_time):
        self.total_qty = total_qty
        self.start_time = start_time
        self.end_time = end_time
        # 加载历史成交量分布
        self.volume_profile = load_volume_profile()
    
    def get_order_qty(self, current_time):
        # 根据历史成交量分布,计算当前时间应下单的量
        expected_ratio = self.volume_profile.get_ratio(current_time)
        remaining_qty = self.total_qty - self.executed_qty
        target_qty = self.total_qty * expected_ratio
        return min(target_qty - self.executed_qty, remaining_qty)
    
    def execute(self):
        while not self.is_complete():
            qty = self.get_order_qty(now())
            send_order(qty)
            sleep(interval)

注意:VWAP算法依赖历史数据。如果市场结构发生重大变化(比如突然放量),历史分布就失效了。我建议加一个实时修正模块,根据最近N分钟的成交量动态调整。

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

冰山订单,顾名思义,只露出水面的一小部分,大部分订单藏在下面。

为什么要用冰山订单?

你想想看,如果你在盘口挂一个1000手的买单,所有人都能看到。做市商一看,哦,有人要吃货,立马把价格拉上去。你的成本就高了。

冰山订单的做法是:只显示100手,成交后自动再补100手,直到1000手全部成交。这样别人看到的始终只有100手,不知道你的真实意图。

我在项目中实现冰山订单时,踩过一个坑:冰山订单的补单时机。如果补单太快,容易被算法识别出规律。我后来加了个随机延迟,补单间隔在100ms到500ms之间随机波动,效果好了很多。

实现要点:

  • 显示量设置:一般设为总量的5%-20%。太小了成交慢,太大了暴露风险。
  • 补单策略:成交后立即补单,或者等一段时间再补。我建议用随机延迟。
  • 价格保护:如果市场价格快速变动,暂停补单,重新评估。

经验之谈:冰山订单不是万能的。在流动性极差的市场,冰山订单反而会暴露你的交易模式。我曾经在某个小市值股票上用过冰山订单,结果被对手盘反向推导出了我的总订单量。嗯,从那以后,我对流动性差的市场就改用暗池了。

19.4 暗池交易:在看不见的地方成交

暗池,就是非公开的流动性池子。在这里,订单不会显示在公开的订单簿上,只有成交后才会公布。

暗池的好处很明显:

  • 减少信息泄露:你的大单不会被别人看到。
  • 降低冲击成本:不会因为你的订单而推动市场价格。
  • 提高成交率:有些暗池有专门的流动性提供者。

但暗池也有风险:

  • 信息不对称:暗池的运营方可能利用你的订单信息。
  • 成交质量不确定:你不知道对手方是谁,可能是高频交易者,也可能是做市商。
  • 监管风险:不同国家对暗池的监管要求不同。

我建议的策略是:大单优先走暗池,小单走公开市场。具体来说,超过市场深度20%的订单,先尝试暗池成交,剩下的再通过算法拆单执行。

下面是我画的一张暗池交易流程图,展示了订单在暗池和公开市场之间的路由逻辑:

暗池交易路由流程图 大单进入 超过深度阈值? 暗池交易 完全成交? 成交完成 剩余部分 算法执行 成交完成 图例: 开始/结束 判断节点 暗池交易 算法执行 核心逻辑:大单先尝试暗池,未成交部分通过算法拆单执行

实战建议:接入暗池时,一定要做成交质量分析。我见过有些暗池,表面上是帮你隐藏订单,实际上把你的订单信息卖给了高频交易者。定期分析暗池的成交价格、成交时间分布,能帮你识别出哪些暗池是“干净”的。

19.5 综合执行框架:把一切串起来

好了,路由策略、执行算法、冰山订单、暗池交易,这些模块单独都能用。但真正高效的执行系统,需要把它们组合成一个整体。

我个人习惯的做法是:

  1. 订单分类:根据订单大小、紧急程度、品种流动性,给订单打标签。
  2. 路由决策:小单直接走公开市场,大单先走暗池。
  3. 算法选择:根据市场状态选择TWAP、VWAP还是Adaptive算法。
  4. 执行监控:实时监控执行成本、成交率、市场冲击。
  5. 动态调整:如果市场出现异常,立即切换策略。

我曾经帮一个团队优化过执行系统。他们原来的系统是固定的:所有订单都走VWAP。结果遇到一次闪崩,VWAP算法还在按历史分布下单,导致成交价格极差。后来我加了个市场异常检测模块,一旦检测到波动率超过阈值,自动切换到TWAP或者暂停交易。嗯,从那以后,他们的执行成本稳定多了。

最后提醒:订单执行优化没有银弹。每个策略、每个品种、每个市场环境,都需要定制化的执行方案。我的建议是:先跑模拟,再上小资金,最后才放大规模。别一上来就全仓干,那是在给市场送钱。


交易系统化学习资料 微信Strategy888888