第四章:多资产套利网络
说实话,做套利做到一定程度,你会发现一个尴尬的事实:
两两资产之间的套利机会,早就被高频玩家吃干净了。
真正有价值的东西,藏在资产与资产之间的网络结构里。你想想看,外汇市场有几十种货币对,加密货币有上千个交易对,股票市场更是成千上万。这些资产之间不是孤立的,它们构成了一个巨大的、动态的关联网络。
我2018年在做跨币种套利时,就踩过这个坑。当时盯着BTC/USDT和ETH/USDT两个交易对,觉得价差稳定,手动撸得挺开心。结果有一天,两个交易对同时闪崩,我账户直接穿了。后来复盘才发现——这两个资产背后连接着同一个做市商节点,风险根本没分散。
所以这一章,我们来聊聊怎么用图论的方法,把多资产套利这件事系统化。
4.1 从相关性矩阵到网络图
构建套利网络的第一步,是把资产之间的相关性转化成图结构。
我习惯用Pearson相关系数作为边的权重。但这里有个坑:直接拿原始价格序列算相关性,你会得到一堆0.9以上的数字——因为所有资产都在跟着大盘走。你需要的是残差相关性,或者叫偏相关性。
具体做法是这样的:
- 对每个资产收益率做市场因子回归,得到残差序列
- 计算残差序列之间的相关系数矩阵
- 设定一个阈值(比如0.3),高于阈值的才保留为边
- 这样就得到一个无向加权图
嗯,这里要注意:阈值设得太低,图会变成一团乱麻;设得太高,又可能漏掉弱关联但重要的套利路径。我个人经验是,先用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月,科技和能源的价差一度拉大到历史极值,那就是一个绝佳的套利窗口。
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
4.4 动态网络:时间维度上的演化
套利网络不是静态的。它会随着市场情绪、流动性、政策变化而演化。
我2019年做过一个实验:每天重新构建一次套利网络,观察社区结构的变化。结果发现:
- 正常市场:社区结构稳定,变化缓慢
- 波动率飙升时:社区边界模糊,资产开始跨社区联动
- 危机时刻:所有资产变成一个社区,套利机会消失
这个发现对我影响很大。从那以后,我设计套利策略时都会加入一个网络稳定性指标。当网络结构剧烈变化时,我会暂停策略,等市场稳定再说。
具体做法是:
- 每天计算当前网络与前一天网络的模块度差异
- 如果差异超过阈值(比如0.1),标记为不稳定状态
- 不稳定状态下,只做最小仓位的试探性交易
4.5 实战案例:加密货币套利网络
最后,我分享一个实战案例。
2021年,我帮一个朋友搭建加密货币套利系统。当时有20多个主流币种,100多个交易对。如果用传统方法两两分析,根本搞不定。
我们用图论方法做了以下几步:
| 步骤 | 操作 | 工具 |
|---|---|---|
| 1 | 构建相关性网络 | Python + NetworkX |
| 2 | 社区发现 | Louvain算法 |
| 3 | 套利路径搜索 | Bellman-Ford |
| 4 | 动态监控 | 滚动窗口 + 模块度变化 |
结果呢?系统上线后,平均每天捕捉到3-5个套利机会,单笔收益在5-20个基点之间。虽然单笔不大,但胜在频率高、风险分散。
不过也有翻车的时候。有一次,系统检测到一个三角套利机会(BTC→ETH→LTC→BTC),理论收益15个基点。结果因为三个交易对都在同一个交易所,流动性不足,滑点直接吃掉了所有收益。那次之后,我加了一个流动性过滤器——只有深度足够的交易对才进入套利池。
好了,这一章的内容就到这里。记住,图论方法不是万能的,但它能帮你从混沌中看到结构。剩下的,就看你怎么用了。