第四章:智能路由算法:价格优先、流动性优先、成本最优、时间优先策略

各位同学,今天我们来聊聊智能路由的核心——四种路由策略。说实话,这四种策略就像交易系统的四个轮子,缺一个都跑不稳。我在搭建第一版路由引擎时,就吃过「只考虑价格」的亏,后来才慢慢补全了其他维度。

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 时间优先策略:快鱼吃慢鱼

时间优先,就是「谁先到谁成交」。这个策略在抢单场景下特别重要。比如某个消息出来后,所有交易所都在抢着成交,这时候速度就是一切。

时间优先策略通常用在两种场景:

  1. 市价单场景:不关心价格,只求快速成交
  2. 套利场景:价差窗口可能只存在几毫秒

但这里有个问题——你怎么知道哪个交易所处理最快?我建议用「历史延迟统计」来做预估:

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