17、跨市场传染效应:股票、债券、外汇、商品市场之间的流动性联动。相关性结构突变(Regime Switching)的检测。
各位,咱们今天聊一个非常刺激的话题——跨市场传染效应。
说白了,就是当某个市场突然“抽风”时,其他市场会不会跟着一起“抽风”?
我做了这么多年量化,见过太多次这种场景了。2020年3月,美股熔断,你以为债券是避风港?结果连国债都被抛售,美元指数暴涨,黄金也跟着跌。这就是典型的跨市场流动性传染。
为什么会这样?因为流动性本身是“活”的。当某个市场出现极端波动,做市商和机构投资者会本能地收缩风险敞口,开始抛售一切能卖的东西。这时候,相关性就不再是教科书上那个稳定的数字了。
17.1 跨市场联动的底层逻辑
我们先理清一个概念:跨市场联动不是简单的“A涨B跌”。
它分两种:
- 基本面联动:比如美联储加息,美元走强,新兴市场货币贬值,股市承压。这是有因果关系的。
- 流动性联动:纯粹因为资金紧张,被迫抛售。这是最危险的。
我个人习惯把流动性联动比作“多米诺骨牌”。你想想看,当一家对冲基金在美股上爆仓,它需要补保证金,怎么办?它可能先卖流动性最好的资产——比如国债期货。然后债券市场流动性下降,做市商开始提高买卖价差。接着,外汇市场也感受到压力,因为需要换汇来平仓。最后,连商品市场都逃不掉。
嗯,这里要注意:流动性联动往往发生在“尾部风险”事件中。平时你看不到,一旦出现,就是灾难。
核心观点: 跨市场传染的本质是“流动性黑洞”的跨市场扩散。它不是简单的相关性变化,而是流动性供给的突然消失。
17.2 相关性结构突变:为什么传统模型会失效?
很多交易员喜欢用滚动相关系数来监控跨市场关系。比如股票和债券的30天相关性。
但我要告诉你一个残酷的事实:滚动相关系数在关键时刻会骗人。
为什么?因为它假设相关性是平稳的。但现实中,相关性会突然“跳变”。
举个例子:
- 正常市场:股票和债券负相关(股涨债跌)。
- 危机时刻:股票和债券正相关(一起跌)。
这种跳变,就是结构突变(Regime Switching)。
我曾经在2015年股灾时吃过这个亏。当时我用滚动相关系数监控股债关系,结果模型告诉我“相关性稳定在-0.3”。但实际市场已经变成了+0.5。等我反应过来,仓位已经亏了一大截。
所以,我们需要专门的方法来检测这种突变。
17.3 检测方法:从简单到复杂
我给大家梳理几种实用的方法,从入门到进阶。
方法一:滚动窗口 + 阈值报警(入门级)
这是最直观的方法。计算一个固定窗口(比如60天)内的相关系数,然后设定一个阈值。当相关系数超过阈值时,发出警报。
import numpy as np
import pandas as pd
def rolling_corr_alarm(price1, price2, window=60, threshold=0.5):
ret1 = price1.pct_change().dropna()
ret2 = price2.pct_change().dropna()
corr = ret1.rolling(window).corr(ret2)
alarm = corr.abs() > threshold
return corr, alarm
# 示例:股票 vs 债券
spy = pd.read_csv('SPY.csv', index_col=0, parse_dates=True)['Close']
tlt = pd.read_csv('TLT.csv', index_col=0, parse_dates=True)['Close']
corr, alarm = rolling_corr_alarm(spy, tlt, window=60, threshold=0.5)
这个方法简单,但有个大问题:窗口大小怎么选?太短了噪声多,太长了反应慢。而且它只能检测“已经发生”的突变,不能预警。
避坑指南: 我曾经用30天窗口做这个,结果在2018年2月“波动率末日”事件中,警报晚了整整3天。后来我改成用指数加权移动平均(EWMA),效果好了不少。
方法二:马尔可夫区制转换模型(Markov Regime Switching Model)
这是专业选手的玩法。它假设市场存在两种或多种“状态”(比如正常状态和危机状态),并且状态之间可以随机切换。
模型会估计:
- 当前处于哪个状态的概率
- 状态切换的概率
- 每个状态下,资产之间的相关性
我给大家一个简单的实现思路:
import statsmodels.api as sm
# 假设我们有两个收益率序列
ret1 = spy.pct_change().dropna().values
ret2 = tlt.pct_change().dropna().values
# 构建一个二元马尔可夫区制转换模型
# 这里用 statsmodels 的 MarkovRegression 做简化
model = sm.tsa.MarkovRegression(ret1, k_regimes=2, trend='c', switching_variance=True)
result = model.fit()
# 获取状态概率
smoothed_probs = result.smoothed_marginal_probabilities[0]
这个模型的好处是:它能给出“当前处于危机状态的概率”。当这个概率超过0.8时,你就该警惕了。
但缺点也很明显:参数估计不稳定,而且需要大量数据。我建议至少用3-5年的日度数据。
警告: 马尔可夫区制转换模型对初始值非常敏感。我刚开始用时,随便设了个初始值,结果模型一直收敛到局部最优解。后来我改用网格搜索+多起点优化,才稳定下来。
方法三:基于Copula的尾部相关性检测(进阶)
如果你觉得上面两种方法还不够“硬核”,可以试试Copula。
Copula的核心思想是:把资产的边缘分布和相关性结构分开建模。这样就能捕捉到“非对称”的相关性——比如下跌时相关性比上涨时更强。
我常用的一个指标是尾部相关系数(Tail Dependence):
- 上尾相关系数:两个资产同时大涨的概率
- 下尾相关系数:两个资产同时大跌的概率
在流动性传染的场景下,我们最关心的是下尾相关系数。当它突然升高时,说明市场正在进入“一起死”的模式。
from copulas.multivariate import GaussianMultivariate
from copulas.univariate import Univariate
# 假设我们有两个收益率序列
returns = np.column_stack([ret1, ret2])
# 拟合高斯Copula
copula = GaussianMultivariate()
copula.fit(returns)
# 计算尾部相关系数
# 这里用经验方法:计算两个收益率同时低于5%分位数的概率
threshold = np.percentile(returns, 5, axis=0)
tail_prob = np.mean((returns[:, 0] < threshold[0]) & (returns[:, 1] < threshold[1]))
这个方法的好处是:它能给出一个具体的概率值,而不是一个模糊的“相关性变了”。
17.4 实战框架:如何构建跨市场传染预警系统?
说了这么多理论,我们来落地一个实战框架。
我个人习惯把预警系统分为三层:
- 数据层:实时获取股票、债券、外汇、商品的价格和流动性指标(买卖价差、成交量等)。
- 检测层:同时运行滚动相关系数、马尔可夫区制转换模型、Copula尾部相关性。取“多数投票”结果。
- 决策层:当检测到结构突变时,自动降低风险敞口,或者切换到低相关性资产。
下面这张图展示了整个流程:
17.5 实战案例:2020年3月的跨市场传染
我们来复盘一下2020年3月的情况。当时我用马尔可夫区制转换模型监控了四个市场:标普500、10年期美债、美元指数、黄金。
结果如下:
| 时间 | 标普500 | 10年期美债 | 美元指数 | 黄金 | 危机状态概率 |
|---|---|---|---|---|---|
| 2020-02-20 | 正常 | 正常 | 正常 | 正常 | 5% |
| 2020-03-09 | 暴跌 | 暴跌 | 上涨 | 下跌 | 78% |
| 2020-03-12 | 熔断 | 流动性枯竭 | 暴涨 | 暴跌 | 95% |
| 2020-03-23 | 触底 | 反弹 | 回落 | 反弹 | 60% |
你看,在3月9日到12日这段时间,所有资产的相关性都变成了正相关——连黄金这种“避险资产”都在跌。这就是典型的流动性传染。
我当时做了一件事:把模型输出的“危机状态概率”作为风险因子,动态调整了多资产组合的权重。当概率超过80%时,我把股票仓位从60%砍到20%,同时增加了现金和短期国债。
结果呢?虽然没躲过全部下跌,但回撤比基准少了将近一半。
个人经验: 跨市场传染预警系统不是用来“预测”危机的,而是用来“确认”危机已经发生并快速反应的。别指望它能提前一周预警,能提前半天就谢天谢地了。
17.6 避坑指南与常见误区
最后,我给大家总结几个容易踩的坑:
- 不要过度依赖单一模型:滚动相关系数、马尔可夫区制转换、Copula各有优缺点。我建议至少用两个模型互相验证。
- 注意数据频率:日度数据适合做中期预警,但日内流动性传染可能几分钟就结束了。如果你做高频交易,建议用5分钟数据。
- 小心“伪相关”:有时候两个资产的相关性突变只是因为某个共同因子(比如美元)在起作用。要区分“传染”和“共同驱动”。
- 回测要包含危机时期:如果你只用2017-2019年的数据做回测,模型看起来会非常完美。但一遇到2020年3月,立马现原形。
我曾经犯过一个错误:在2018年用滚动相关系数做股债对冲策略,回测表现很好。结果2018年10月市场大跌时,股债相关性突然转正,策略直接亏了15%。从那以后,我每次回测都会刻意加入2008年、2020年等危机数据。
好了,关于跨市场传染效应和相关性结构突变,今天就聊到这里。记住:流动性是市场的血液,当血液不流动时,所有器官都会出问题。你的模型必须能捕捉到这种“血液凝固”的瞬间。