第四章:多资产套利网络

说实话,做套利做到一定程度,你会发现一个尴尬的事实:

两两资产之间的套利机会,早就被高频玩家吃干净了。

真正有价值的东西,藏在资产与资产之间的网络结构里。你想想看,外汇市场有几十种货币对,加密货币有上千个交易对,股票市场更是成千上万。这些资产之间不是孤立的,它们构成了一个巨大的、动态的关联网络。

我2018年在做跨币种套利时,就踩过这个坑。当时盯着BTC/USDT和ETH/USDT两个交易对,觉得价差稳定,手动撸得挺开心。结果有一天,两个交易对同时闪崩,我账户直接穿了。后来复盘才发现——这两个资产背后连接着同一个做市商节点,风险根本没分散。

所以这一章,我们来聊聊怎么用图论的方法,把多资产套利这件事系统化。

4.1 从相关性矩阵到网络图

构建套利网络的第一步,是把资产之间的相关性转化成图结构。

我习惯用Pearson相关系数作为边的权重。但这里有个坑:直接拿原始价格序列算相关性,你会得到一堆0.9以上的数字——因为所有资产都在跟着大盘走。你需要的是残差相关性,或者叫偏相关性。

核心思路:先剔除市场共同因子(比如大盘指数),再计算资产间的特异性关联。

具体做法是这样的:

  1. 对每个资产收益率做市场因子回归,得到残差序列
  2. 计算残差序列之间的相关系数矩阵
  3. 设定一个阈值(比如0.3),高于阈值的才保留为边
  4. 这样就得到一个无向加权图

嗯,这里要注意:阈值设得太低,图会变成一团乱麻;设得太高,又可能漏掉弱关联但重要的套利路径。我个人经验是,先用0.5试跑一遍,然后根据网络密度调整。

4.2 社区发现:找到资产派系

有了图之后,下一步是找社区结构

什么叫社区?就是一组内部连接紧密、外部连接稀疏的资产。说白了,它们是一伙的。

为什么要找社区?因为套利机会往往出现在社区之间,而不是社区内部。社区内部的资产高度同步,价差很难拉开;而不同社区的资产,由于基本面不同、资金流不同,更容易出现定价偏差。

我常用的算法是Louvain社区发现。它基于模块度优化,速度快,效果也不错。

import networkx as nx
import community as community_louvain

# 假设G已经构建好
partition = community_louvain.best_partition(G)

# 打印每个社区的资产
for com, nodes in partition.items():
    print(f"社区 {com}: {nodes}")

有一次我在做美股ETF套利时,用这个方法发现了一个有意思的现象:

  • 社区A:科技股ETF(QQQ、VGT、XLK)
  • 社区B:能源股ETF(XLE、VDE)
  • 社区C:国债ETF(TLT、IEF)

这三个社区之间的相关性很低,但偶尔会出现短暂的偏离。比如2020年3月,科技和能源的价差一度拉大到历史极值,那就是一个绝佳的套利窗口。

避坑指南:我曾经犯过一个错误——直接用日频数据做社区发现。结果发现社区结构每天都在变,根本没法用。后来改用周频数据,并做滚动窗口(比如60个交易日),才得到稳定的社区划分。

4.3 套利路径搜索:图论算法登场

找到社区之后,我们要回答一个具体问题:

给定一组资产,怎么找到最优的套利组合?

这个问题可以转化为图论中的最短路径问题最大流问题

我举一个具体的例子:

假设我们有三个资产:A、B、C。它们之间的价差关系如下:

  • A-B价差:2个基点
  • B-C价差:3个基点
  • A-C价差:6个基点

如果你直接做A-C套利,能赚6个基点。但如果你走A→B→C的路径,总价差是2+3=5个基点,反而更少。所以直接做A-C是最优的。

但现实情况要复杂得多。因为每个交易对都有交易成本(手续费、滑点、延迟等)。你需要找到一条净收益最大的路径。

我一般用Bellman-Ford算法来做这件事。它可以处理负权边(也就是套利收益),并且能检测负环——负环意味着存在无风险套利机会。

import numpy as np

def find_arbitrage(prices, costs):
    """
    prices: 价格矩阵,prices[i][j] 表示用资产i换资产j的汇率
    costs: 交易成本矩阵
    """
    n = len(prices)
    # 构建对数收益率矩阵
    log_returns = np.log(prices) - costs
    
    # Bellman-Ford检测负环
    dist = [float('inf')] * n
    dist[0] = 0
    
    for _ in range(n-1):
        for i in range(n):
            for j in range(n):
                if dist[i] + log_returns[i][j] < dist[j]:
                    dist[j] = dist[i] + log_returns[i][j]
    
    # 检测负环
    for i in range(n):
        for j in range(n):
            if dist[i] + log_returns[i][j] < dist[j]:
                return True  # 存在套利机会
    return False
注意:这个算法假设市场是有效的,且交易成本固定。现实中,你的交易本身会影响价格,所以实际收益要打折扣。我一般会在算法输出的收益上再乘以一个0.7的折扣因子,作为安全边际。

4.4 动态网络:时间维度上的演化

套利网络不是静态的。它会随着市场情绪、流动性、政策变化而演化。

我2019年做过一个实验:每天重新构建一次套利网络,观察社区结构的变化。结果发现:

  • 正常市场:社区结构稳定,变化缓慢
  • 波动率飙升时:社区边界模糊,资产开始跨社区联动
  • 危机时刻:所有资产变成一个社区,套利机会消失

这个发现对我影响很大。从那以后,我设计套利策略时都会加入一个网络稳定性指标。当网络结构剧烈变化时,我会暂停策略,等市场稳定再说。

具体做法是:

  1. 每天计算当前网络与前一天网络的模块度差异
  2. 如果差异超过阈值(比如0.1),标记为不稳定状态
  3. 不稳定状态下,只做最小仓位的试探性交易

4.5 实战案例:加密货币套利网络

最后,我分享一个实战案例。

2021年,我帮一个朋友搭建加密货币套利系统。当时有20多个主流币种,100多个交易对。如果用传统方法两两分析,根本搞不定。

我们用图论方法做了以下几步:

步骤 操作 工具
1 构建相关性网络 Python + NetworkX
2 社区发现 Louvain算法
3 套利路径搜索 Bellman-Ford
4 动态监控 滚动窗口 + 模块度变化

结果呢?系统上线后,平均每天捕捉到3-5个套利机会,单笔收益在5-20个基点之间。虽然单笔不大,但胜在频率高、风险分散。

不过也有翻车的时候。有一次,系统检测到一个三角套利机会(BTC→ETH→LTC→BTC),理论收益15个基点。结果因为三个交易对都在同一个交易所,流动性不足,滑点直接吃掉了所有收益。那次之后,我加了一个流动性过滤器——只有深度足够的交易对才进入套利池。

总结一下:多资产套利网络的核心,是把复杂的市场关系抽象成图结构,然后用图论算法找到最优路径。社区发现帮你找到资产派系,最短路径算法帮你找到套利机会,动态监控帮你避开风险。这三者缺一不可。

好了,这一章的内容就到这里。记住,图论方法不是万能的,但它能帮你从混沌中看到结构。剩下的,就看你怎么用了。


专注资料整理