一、SOR概述:什么是Smart Order Routing?为什么需要SOR?明池与暗池的核心区别

1.1 从一个真实场景说起

2018年,我在一家中型量化基金做交易系统。那天下午,我们有个大单要买50万股某只股票。

我习惯性地把单子直接扔到交易所。结果呢?价格瞬间被拉高了3毛钱。交易员当场就炸了——「这单子亏大了」。

后来复盘时我发现,当时市场上明明有好几个暗池里挂着低价卖单。但我们的系统压根没去看那些地方。

这就是典型的「路由不当」问题。说白了,你的订单走错了路。

1.2 什么是Smart Order Routing?

Smart Order Routing,简称SOR。中文叫智能订单路由。

它的核心任务就一个:帮你的订单找到最优成交路径

你想想看,现在的美股市场有50多个交易场所。纽交所、纳斯达克、多个暗池、ATS……每个地方的价格和流动性都不一样。

SOR系统要做的,就是实时判断:

  • 哪个场所价格最好?
  • 哪个场所流动性最足?
  • 哪个场所成交速度最快?
  • 哪个场所对市场冲击最小?

然后,把订单拆成多份,发到不同的地方去。

核心定义:SOR是一种算法,它根据实时市场数据,自动将订单路由到一个或多个交易场所,以获取最优执行结果。

1.3 为什么需要SOR?

这个问题我问过不少刚入行的朋友。很多人觉得:「不就是下单嘛,直接发到交易所不就行了?」

嗯,这里有个误区。

我举个例子你就明白了。假设你想买10万股某股票:

  • 交易所A:卖一价10.00元,只有5000股
  • 交易所B:卖一价10.01元,有8万股
  • 暗池C:有3万股,价格是10.00元

如果你只发到交易所A,只能吃到5000股。剩下的9.5万股得去更高价的地方买。成本一下子就上去了。

但如果你用SOR呢?系统会这样处理:

  1. 先吃交易所A的5000股,价格10.00
  2. 同时去暗池C吃3万股,价格10.00
  3. 剩下的6.5万股去交易所B,价格10.01

你看,平均成本比全走交易所A低了不少。

个人经验:我做过一个回测,对于100万股以上的大单,使用SOR比单一路由平均节省5-8个基点。别小看这几个基点,一年下来就是几百万的差别。

1.4 明池与暗池:核心区别

说到SOR,就绕不开明池和暗池。这两个概念,我当年也花了不少时间才真正搞明白。

明池(Lit Pool),就是你能看到订单簿的交易所。比如纽交所、纳斯达克。价格、挂单量、买卖盘口,全都公开透明。

暗池(Dark Pool),恰恰相反。你看不到里面的订单信息。只有成交后才知道发生了什么。

为什么会有暗池?说白了,大机构不想让别人知道自己在买卖。你想想,如果你在明池挂个100万股的大单,别人一看就知道你要干嘛。价格肯定被砸。

暗池就是为了解决这个问题而生的。

对比维度 明池 暗池
订单簿可见性 完全公开 完全隐藏
市场冲击 高(大单容易被盯上) 低(成交前不可见)
成交速度 快(毫秒级) 相对慢(需要撮合)
价格发现 参与价格形成 依赖明池价格
适用场景 小单、流动性好的股票 大单、流动性差的股票

避坑指南:我曾经犯过一个错误——把一个大单全扔进暗池。结果等了半小时都没成交完。后来才发现,那个暗池的流动性根本不够。所以,暗池不是万能的。你得知道每个暗池的特点。

1.5 SOR的核心逻辑框架

说了这么多,我们来画一张图。这张图是我做SOR系统时最核心的设计思路。

SOR核心逻辑框架 订单输入 路由决策引擎 价格、流动性、速度、冲击成本 订单拆分与路由 明池A 纽交所/纳斯达克 暗池B 流动性暗池 明池C 区域交易所 成交回报汇总

这张图其实就讲了三件事:

  1. 输入:你的订单进来
  2. 决策:引擎根据实时数据判断去哪
  3. 执行:拆单、路由、成交、汇总

我当年做第一版SOR时,决策引擎那块写得特别复杂。后来发现,其实核心就几个参数:价格优先级、流动性阈值、冲击成本模型。搞复杂了反而容易出bug。

1.6 一个简单的路由策略示例

光说不练假把式。我写个伪代码,展示一下最简单的SOR逻辑:

// 最简单的SOR路由策略
function routeOrder(order, marketData) {
    // 1. 获取各场所最优价格
    let bestPrice = getBestPrice(marketData);
    
    // 2. 按价格排序
    let venues = sortByPrice(marketData.venues);
    
    // 3. 遍历场所,分配订单
    let remainingQty = order.qty;
    let executions = [];
    
    for (let venue of venues) {
        if (remainingQty <= 0) break;
        
        // 检查价格是否在容忍范围内
        if (venue.price > bestPrice * 1.001) continue;
        
        // 检查流动性是否足够
        let available = venue.liquidity;
        let takeQty = Math.min(remainingQty, available);
        
        // 发送订单
        let exec = sendOrder(venue, takeQty);
        executions.push(exec);
        remainingQty -= takeQty;
    }
    
    return executions;
}

这段代码虽然简单,但已经包含了SOR的核心思想:先找最优价格,再考虑流动性,最后执行

个人建议:刚开始做SOR时,别一上来就搞复杂的机器学习模型。先把基础的价格优先策略跑通。我见过太多团队,算法还没跑稳就开始上AI,结果回测漂亮实盘崩盘。

1.7 小结

这一章我们聊了SOR是什么、为什么需要它、明池和暗池的区别。

说白了,SOR就是帮你省钱省心的工具。它让大单不再被市场「盯上」,让小单能拿到最好的价格。

明池和暗池各有各的用处。明池适合小单、追求速度的场景;暗池适合大单、追求隐蔽的场景。一个好的SOR系统,知道什么时候该走明池,什么时候该走暗池。

下一章,我会带你深入SOR的决策引擎,看看里面到底是怎么算的。


专注资料整理