一、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呢?系统会这样处理:
- 先吃交易所A的5000股,价格10.00
- 同时去暗池C吃3万股,价格10.00
- 剩下的6.5万股去交易所B,价格10.01
你看,平均成本比全走交易所A低了不少。
个人经验:我做过一个回测,对于100万股以上的大单,使用SOR比单一路由平均节省5-8个基点。别小看这几个基点,一年下来就是几百万的差别。
1.4 明池与暗池:核心区别
说到SOR,就绕不开明池和暗池。这两个概念,我当年也花了不少时间才真正搞明白。
明池(Lit Pool),就是你能看到订单簿的交易所。比如纽交所、纳斯达克。价格、挂单量、买卖盘口,全都公开透明。
暗池(Dark Pool),恰恰相反。你看不到里面的订单信息。只有成交后才知道发生了什么。
为什么会有暗池?说白了,大机构不想让别人知道自己在买卖。你想想,如果你在明池挂个100万股的大单,别人一看就知道你要干嘛。价格肯定被砸。
暗池就是为了解决这个问题而生的。
| 对比维度 | 明池 | 暗池 |
|---|---|---|
| 订单簿可见性 | 完全公开 | 完全隐藏 |
| 市场冲击 | 高(大单容易被盯上) | 低(成交前不可见) |
| 成交速度 | 快(毫秒级) | 相对慢(需要撮合) |
| 价格发现 | 参与价格形成 | 依赖明池价格 |
| 适用场景 | 小单、流动性好的股票 | 大单、流动性差的股票 |
避坑指南:我曾经犯过一个错误——把一个大单全扔进暗池。结果等了半小时都没成交完。后来才发现,那个暗池的流动性根本不够。所以,暗池不是万能的。你得知道每个暗池的特点。
1.5 SOR的核心逻辑框架
说了这么多,我们来画一张图。这张图是我做SOR系统时最核心的设计思路。
这张图其实就讲了三件事:
- 输入:你的订单进来
- 决策:引擎根据实时数据判断去哪
- 执行:拆单、路由、成交、汇总
我当年做第一版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的决策引擎,看看里面到底是怎么算的。