第二章:多资产做市组合的构建:资产选择、相关性矩阵与组合分散化

做市交易做到一定阶段,你会发现一个残酷的事实:单一品种的做市,赚的是辛苦钱。你盯着盘口,吃着点差,偶尔被大单捅一下,一天白干。真正能让资金曲线平滑、让夏普比率好看的,是多资产组合。

这一章,我们就来聊聊怎么搭这个组合。说白了,就是选哪些资产、它们之间怎么联动、以及如何通过分散化来降低整体风险。我个人的经验是,这一步如果没做好,后面再精妙的对冲策略都是空中楼阁。

2.1 资产选择:别什么垃圾都往里装

很多新手做市商有个误区:觉得资产越多越分散,风险就越低。其实不然。你想想看,如果你选了10个相关性极高的资产,比如全是纳斯达克100的成份股,那跟只做一个品种有什么区别?

我个人习惯把资产分为三类:

  • 核心流动性资产:比如BTC/ETH、EUR/USD、TSLA。这些品种流动性极好,点差小,是做市的基本盘。我建议这类资产占比不低于60%。
  • 低相关性卫星资产:比如黄金、国债期货、某些商品。它们与核心资产的相关性低,能在核心资产暴跌时提供缓冲。
  • 波动性套利资产:比如某些小币种、深度较差的期权。这类资产风险高,但收益也高。我只用不超过10%的资金去博。

避坑指南:我曾经在2021年把大量资金配置在几个DeFi代币上,以为它们相关性低。结果5.19事件一来,所有币种齐刷刷暴跌,相关性瞬间趋近于1。嗯,那次教训让我明白:低相关性只在正常市场下成立,极端行情下所有风险资产都是同涨同跌的。

2.2 相关性矩阵:你的组合体检报告

选好了资产,下一步就是算相关性。这里我用的不是简单的皮尔逊相关系数,而是滚动相关性矩阵。为什么?因为相关性是时变的。今天两个资产的相关性是0.2,明天可能就变成0.8。

来看一段我实际在用的代码:

import numpy as np
import pandas as pd

def rolling_correlation_matrix(price_df, window=60):
    """
    计算滚动相关性矩阵
    price_df: DataFrame, 列名为资产名称,行为时间序列价格
    window: 滚动窗口期数(日)
    """
    returns = price_df.pct_change().dropna()
    corr_dict = {}
    
    for date in returns.index[window:]:
        # 取过去window天的收益率数据
        window_data = returns.loc[:date].tail(window)
        corr_matrix = window_data.corr()
        corr_dict[date] = corr_matrix
    
    return corr_dict

# 使用示例
# 假设我们有 BTC, ETH, GOLD, SPY 四个资产的价格数据
# corr_dict = rolling_correlation_matrix(price_data, window=60)
# 查看最新一天的相关性矩阵
# latest_corr = list(corr_dict.values())[-1]
# print(latest_corr)

这段代码的核心逻辑是:每来一个新数据点,就重新算一次过去60天的相关性。这样你就能看到相关性的动态变化。我建议至少用60个交易日的数据,太短了噪声大,太长了反应迟钝。

下面是一个典型的滚动相关性矩阵示例(假设数据):

资产 BTC ETH GOLD SPY
BTC 1.00 0.85 -0.12 0.45
ETH 0.85 1.00 -0.08 0.38
GOLD -0.12 -0.08 1.00 0.15
SPY 0.45 0.38 0.15 1.00

看到没?BTC和ETH相关性高达0.85,说明它们基本是一家人。而GOLD与BTC是负相关,这就是我们想要的分散化效果。

小技巧:我一般会设置一个相关性阈值,比如0.7。如果两个资产的相关性持续高于0.7,我就会考虑只保留其中一个,或者用它们的价差来做配对交易。

2.3 组合分散化:别把鸡蛋放在一个篮子里

有了相关性矩阵,我们就可以量化组合的分散化程度了。这里我常用的是有效资产数量(Effective Number of Assets, ENA)。这个指标告诉你,你的组合实际上相当于多少个等权重的独立资产。

计算公式很简单:

def effective_number_of_assets(corr_matrix, weights):
    """
    计算有效资产数量
    corr_matrix: 相关性矩阵
    weights: 资产权重向量
    """
    # 计算组合方差
    portfolio_variance = np.dot(weights.T, np.dot(corr_matrix, weights))
    # 计算等权重下的方差
    n = len(weights)
    equal_weights = np.ones(n) / n
    equal_variance = np.dot(equal_weights.T, np.dot(corr_matrix, equal_weights))
    # ENA = 等权重方差 / 组合方差
    ena = equal_variance / portfolio_variance
    return ena

# 假设我们有4个资产,权重分别为 [0.4, 0.3, 0.2, 0.1]
weights = np.array([0.4, 0.3, 0.2, 0.1])
ena = effective_number_of_assets(latest_corr.values, weights)
print(f"有效资产数量: {ena:.2f}")

如果ENA接近你的实际资产数量,说明分散化效果很好。如果ENA远小于实际数量,说明你的组合其实很集中,风险并没有分散开。

举个例子:你有10个资产,但ENA只有3.5。这意味着你的组合风险特征只相当于3.5个独立资产。那剩下的6.5个资产基本是摆设。

2.4 知识体系总览

为了让你更直观地理解这一章的核心逻辑,我画了一张图:

多资产做市组合构建核心逻辑 资产选择 核心流动性资产 低相关性卫星资产 相关性矩阵 滚动窗口计算 时变相关性 组合分散化 有效资产数量 风险预算分配 动态调整权重 关键监控指标 1. 滚动相关性均值: 衡量组合整体联动性,目标 < 0.5 2. 有效资产数量(ENA): 衡量分散化效果,目标 > 实际资产数的60% 3. 最大相关性暴露: 任意两个资产的相关性上限,目标 < 0.8 4. 极端行情相关性测试: 压力测试下相关性是否趋近于1

这张图把整个流程串起来了:先选资产,再算相关性,最后做分散化。而且这是一个闭环——你得根据市场变化动态调整权重。

2.5 实战中的几个坑

最后,分享几个我在实战中踩过的坑:

  • 别迷信历史相关性:历史数据只能告诉你过去,不能预测未来。我见过太多人拿着过去三年的相关性矩阵做组合,结果市场风格一变,直接崩盘。
  • 注意流动性分层:有些资产平时流动性很好,但一到危机时刻就枯竭。比如某些小盘股,平时点差很小,但暴跌时根本卖不出去。这类资产在组合中要控制比例。
  • 权重再平衡的频率:我个人的习惯是每周做一次再平衡。太频繁了交易成本高,太慢了风险暴露会失控。

重要提醒:多资产组合不是万能药。它只能分散非系统性风险,无法规避系统性风险。当整个市场崩盘时,所有资产都会跌,只是跌幅不同而已。所以,永远不要因为做了分散化就放松对杠杆的控制。

好了,这一章的内容就到这里。记住:资产选择是骨架,相关性矩阵是体检报告,分散化是健康管理。三者缺一不可。

专注资料整理