第22章 多资产做市:跨品种相关性分析、组合库存管理、资本配置优化

做市做到一定程度,你会发现一个尴尬的事实——单品种做市的天花板太低了。你想想看,一个BTC永续合约,就算你吃透订单簿,一天能赚的基差也就那么多。但如果你同时做BTC、ETH、SOL,甚至跨交易所、跨衍生品,那资金利用率就完全不一样了。

我入行第三年的时候,老板扔给我一个任务:同时做市5个币种、3个交易所。我当时第一反应是「这不就是多开几个窗口嘛」。结果第一周就亏了——因为ETH跌的时候,我BTC的库存没对冲,两边一起亏。嗯,从那以后我才真正开始研究多资产做市。

22.1 跨品种相关性分析:别被伪相关骗了

多资产做市的核心,是搞清楚资产之间到底怎么联动。很多人上来就画个相关系数矩阵,看到0.8就觉得稳了。但我在项目中踩过坑——相关系数在正常市场下是0.8,一到极端行情直接变-0.3。

为什么会这样?因为相关性是时变的。牛市里所有币一起涨,相关系数接近1;熊市里流动性枯竭,各走各的。所以我的习惯是:用滚动窗口计算动态相关性,窗口长度至少200个数据点。

核心指标: 我一般用60分钟级别的收益率数据,计算滚动24小时的Pearson相关系数。低于0.5的,就别强行做组合对冲了。

另外,要注意尾部相关性。两个资产平时相关性0.3,但一旦暴跌,相关性可能跳到0.9。这就是所谓的「危机时刻所有资产都是正相关」。我见过有人用Copula模型去建模尾部依赖,但说实话,对于做市商来说,更实用的方法是直接加一个极端行情熔断机制——当某个资产波动率超过3个标准差,自动降低该资产的风险敞口。

# 动态相关性计算示例(Python伪代码)
import numpy as np

def rolling_corr(price1, price2, window=24):
    ret1 = np.diff(np.log(price1))
    ret2 = np.diff(np.log(price2))
    corr = []
    for i in range(window, len(ret1)):
        c = np.corrcoef(ret1[i-window:i], ret2[i-window:i])[0,1]
        corr.append(c)
    return np.array(corr)

# 我习惯加一个阈值告警
if np.any(np.abs(corr[-5:]) < 0.3):
    print("⚠️ 相关性突变,检查对冲策略")

22.2 组合库存管理:别让一个品种拖垮你

单品种做市,库存管理相对简单——高了就降价卖,低了就提价买。但多资产组合下,问题就复杂了:你ETH库存高了,但BTC库存低了,要不要用ETH换BTC?

我的做法是:设定一个「组合库存目标向量」。比如你决定做市BTC、ETH、SOL,目标库存比例是5:3:2。然后实时监控偏离度,偏离超过阈值就触发再平衡。

品种 目标库存(USD) 当前库存(USD) 偏离度 操作
BTC 500,000 620,000 +24% 降价卖出
ETH 300,000 280,000 -6.7% 正常
SOL 200,000 150,000 -25% 提价买入

这里有个坑:再平衡本身会产生交易成本。我曾经设置了一个1%的偏离阈值,结果一天内来回交易了20次,手续费吃掉了一半利润。后来我改成阈值+时间衰减——偏离超过2%才动,而且每次只调整一半的偏离量。

我的经验: 再平衡频率不要超过每小时1次。除非极端行情,否则让库存「漂」一会儿,往往比频繁调整更赚钱。

22.3 资本配置优化:把钱放在最赚钱的地方

你手上有1000万美金,怎么分配到各个品种?最简单的做法是等权重,但显然不最优。我见过有人用夏普比率来配,但夏普比率对尾部风险不敏感。

我个人习惯用风险预算模型。核心思想是:每个品种对组合总风险的贡献度应该相等。比如你配置了BTC和ETH,BTC波动率是ETH的两倍,那BTC的仓位就应该只有ETH的一半。

# 风险预算优化示例
import numpy as np
from scipy.optimize import minimize

def risk_budget(cov_matrix, target_risk_contrib):
    n = len(cov_matrix)
    def risk_contrib(weights):
        portfolio_var = weights @ cov_matrix @ weights
        marginal_contrib = cov_matrix @ weights
        risk_contrib = weights * marginal_contrib / portfolio_var
        return risk_contrib
    
    def objective(weights):
        rc = risk_contrib(weights)
        return np.sum((rc - target_risk_contrib)**2)
    
    constraints = ({'type': 'eq', 'fun': lambda w: np.sum(w) - 1})
    bounds = [(0, 1) for _ in range(n)]
    result = minimize(objective, np.ones(n)/n, bounds=bounds, constraints=constraints)
    return result.x

# 假设3个品种的协方差矩阵
cov = np.array([[0.04, 0.02, 0.01],
                [0.02, 0.09, 0.03],
                [0.01, 0.03, 0.16]])
weights = risk_budget(cov, [1/3, 1/3, 1/3])
print("最优权重:", weights)

但这里要注意:风险预算模型假设协方差矩阵是稳定的。现实中,波动率会突变。所以我每周重新计算一次协方差矩阵,并且加上一个波动率上限——单个品种的波动率贡献不能超过组合总风险的40%。

避坑指南: 我曾经在2021年5月的大跌中,因为没及时更新协方差矩阵,导致BTC仓位过高。那一次回撤了15%。从那以后,我强制要求协方差矩阵至少每天更新一次。

22.4 整体框架图

下面这张图是我做多资产做市的核心逻辑。你可以看到,从相关性分析到库存管理,再到资本配置,是一个闭环。

多资产做市核心框架 跨品种相关性分析 动态相关系数 尾部相关性监测 组合库存管理 目标库存向量 阈值+时间衰减再平衡 资本配置优化 风险预算模型 波动率上限控制 反馈调整 输出:最优报价策略 + 动态对冲 基于组合风险调整每个品种的买卖价差和库存目标 核心原则:相关性决定对冲效率,库存决定风险暴露,资本配置决定收益上限 动态相关系数 滚动窗口≥200 库存偏离阈值 2% + 时间衰减 风险贡献上限 单品种≤40%

说白了,多资产做市就是一场动态平衡游戏。你既要利用相关性来对冲风险,又要防止相关性突变带来的黑天鹅。库存管理不是死板的,要结合市场状态灵活调整。资本配置更不是一劳永逸的,每周甚至每天都要重新审视。

我记得有一次,SOL突然暴涨,相关性矩阵瞬间乱掉。我手动暂停了所有再平衡,等了两个小时等市场冷静下来才重新启动。那一次虽然少赚了点,但避免了追涨杀跌的悲剧。嗯,有时候「不做」比「做」更重要。

本章核心: 多资产做市的本质不是「多开几个窗口」,而是「用一个大脑控制多个手脚」。相关性是神经,库存是肌肉,资本配置是骨架。三者缺一不可。

交易系统化学习资料 微信Strategy888888