第四章:智能路由算法:价格优先、流动性优先、成本最优、时间优先策略
各位同学,今天我们来聊聊智能路由的核心——四种路由策略。说实话,这四种策略就像交易系统的四个轮子,缺一个都跑不稳。我在搭建第一版路由引擎时,就吃过「只考虑价格」的亏,后来才慢慢补全了其他维度。
4.1 价格优先策略:最直观,也最危险
价格优先,说白了就是「谁便宜买谁」。这个逻辑最简单,也是大多数新手最先想到的。
核心逻辑:在所有可用的交易所中,选择报价最优的那个。
举个例子,你想买1000股某股票。A交易所卖10.01元,B交易所卖10.02元。价格优先策略会直接选A。
但这里有个坑——报价不等于成交价。我在项目中遇到过这样的情况:A交易所显示10.01元,但实际只有200股。你下了1000股的订单,结果只成交了200股,剩下的800股可能要以更高的价格成交。嗯,这就是所谓的「部分成交」问题。
避坑指南:我曾经在实盘环境中只用了价格优先,结果一个大单被拆成了十几笔,每笔价格都不一样。最后算下来,平均成交价比B交易所的10.02元还高。所以,价格优先必须配合「深度检查」一起用。
4.2 流动性优先策略:大单的救星
流动性优先,就是看哪个市场「水够深」。你想想看,如果你要买100万股,光看价格没用。A市场虽然便宜1分钱,但深度只有5万股;B市场贵2分钱,但深度有200万股。这时候选B才是明智的。
流动性优先的算法通常这样设计:
def liquidity_score(order_book, target_volume):
"""
计算流动性评分
:param order_book: 订单簿数据
:param target_volume: 目标成交量
:return: 评分(越高越好)
"""
# 计算前N档深度的累计成交量
cumulative_volume = 0
score = 0
for level in order_book.asks:
cumulative_volume += level.volume
if cumulative_volume >= target_volume:
# 能完全满足需求,给高分
score = 100 - (level.price / order_book.mid_price - 1) * 1000
break
# 如果深度不够,评分直接打折
if cumulative_volume < target_volume:
score = (cumulative_volume / target_volume) * 50
return max(0, min(100, score))
这段代码的逻辑很简单:先看能不能一次吃饱,能的话按价格给分;不能的话,按能吃到的比例给分。我个人习惯把评分控制在0-100之间,方便和其他策略加权组合。
4.3 成本最优策略:别被表面价格骗了
成本最优,考虑的是「到手总成本」。这包括:
- 手续费:有的交易所收0.1%,有的收0.05%
- 滑点成本:大单进场会推高价格
- 跨市场转账费:如果你需要从A市场调资金到B市场
- 汇率成本:跨市场交易时的货币兑换
我记得有一次,一个同事说「这个交易所手续费低,我们全走它」。结果一算,那个交易所的流动性极差,滑点成本是手续费的10倍。这就是典型的「捡了芝麻丢了西瓜」。
实战技巧:我建议把成本拆成「固定成本」和「可变成本」两部分。固定成本(如手续费)可以提前算好,可变成本(如滑点)需要根据当前市场状态动态估算。
成本最优的决策矩阵大概长这样:
| 交易所 | 报价 | 手续费率 | 预估滑点 | 总成本 | 排名 |
|---|---|---|---|---|---|
| 交易所A | 10.01 | 0.08% | 0.02 | 10.03 | 2 |
| 交易所B | 10.02 | 0.05% | 0.01 | 10.03 | 2 |
| 交易所C | 10.00 | 0.10% | 0.05 | 10.05 | 3 |
| 交易所D | 10.03 | 0.03% | 0.00 | 10.03 | 1 |
你看,交易所C报价最低,但总成本反而最高。交易所D报价最高,但总成本却和A、B一样。这就是成本最优策略的价值所在。
4.4 时间优先策略:快鱼吃慢鱼
时间优先,就是「谁先到谁成交」。这个策略在抢单场景下特别重要。比如某个消息出来后,所有交易所都在抢着成交,这时候速度就是一切。
时间优先策略通常用在两种场景:
- 市价单场景:不关心价格,只求快速成交
- 套利场景:价差窗口可能只存在几毫秒
但这里有个问题——你怎么知道哪个交易所处理最快?我建议用「历史延迟统计」来做预估:
class LatencyTracker:
def __init__(self, window_size=100):
self.window_size = window_size
self.latencies = {} # 交易所 -> 延迟列表
def record_latency(self, exchange, latency_ms):
if exchange not in self.latencies:
self.latencies[exchange] = []
self.latencies[exchange].append(latency_ms)
# 只保留最近N条记录
if len(self.latencies[exchange]) > self.window_size:
self.latencies[exchange].pop(0)
def get_expected_latency(self, exchange):
if exchange not in self.latencies:
return float('inf')
# 用中位数,避免异常值干扰
sorted_lat = sorted(self.latencies[exchange])
mid = len(sorted_lat) // 2
return sorted_lat[mid]
嗯,这里要注意:延迟数据要持续更新。交易所的网络状况是动态变化的,早上的快不代表下午也快。
4.5 多策略融合:智能路由的真正核心
单独用任何一种策略都有缺陷。真正的智能路由,是把这四种策略融合起来。我一般用「加权评分法」:
def smart_route_score(exchange, order_info):
# 各策略评分(0-100)
price_score = calc_price_score(exchange, order_info)
liquidity_score = calc_liquidity_score(exchange, order_info)
cost_score = calc_cost_score(exchange, order_info)
time_score = calc_time_score(exchange, order_info)
# 动态权重:根据订单类型调整
if order_info['type'] == 'market':
weights = {'price': 0.2, 'liquidity': 0.3, 'cost': 0.1, 'time': 0.4}
elif order_info['volume'] > 10000:
weights = {'price': 0.2, 'liquidity': 0.5, 'cost': 0.2, 'time': 0.1}
else:
weights = {'price': 0.4, 'liquidity': 0.2, 'cost': 0.3, 'time': 0.1}
total = (price_score * weights['price'] +
liquidity_score * weights['liquidity'] +
cost_score * weights['cost'] +
time_score * weights['time'])
return total
你看,不同场景下权重不一样。市价单更看重时间,大单更看重流动性,普通小单更看重价格和成本。这就是「智能」的体现。
核心要点:智能路由不是选一个策略,而是根据当前市场状态和订单特征,动态组合多种策略。我见过最好的路由系统,权重每秒钟都在调整。
4.6 本章知识体系
下面这张图展示了四种策略的关系和融合方式:
这张图把四种策略的关系讲得很清楚。中心是路由引擎,向外连接四种策略,每种策略都有其适用场景。最下面是融合层,通过动态权重把四种策略组合起来,输出最终的路由决策。
我的建议:刚开始做路由系统时,别急着搞复杂的融合算法。先把四种策略单独实现好,跑通后再慢慢加权重逻辑。我见过太多团队一上来就想搞「AI路由」,结果连基础策略都没跑对。
好了,这四种策略的核心逻辑就讲到这里。记住一句话:没有最好的策略,只有最合适的组合。下一章我们会聊如何把这些策略落地成代码,到时候我会分享一些具体的实现细节和性能优化技巧。
公众号:蓝海资料掘金营,微信deep3321