DCCA 去趋势互相关分析:在非平稳序列里量化跨市场的标度联动
两条价格序列同涨同跌,是真的存在联动,还是只因为它们共享了同一条慢趋势?皮尔逊相关在非平稳数据上会被共同趋势系统性夸大,把伪相关当成真信号。DCCA(去趋势互相关分析)通过分段去趋势 + 多尺度累加,把趋势剥掉之后再看两条序列的协同波动,并且天然给出「相关性随时间尺度如何变化」这一维度。本文从零推导 DCCA 系数,用可复现 Python 演示它相对皮尔逊的鲁棒性、如何读懂标度依赖、以及滚动 DCCA 如何捕捉危机期的联动跃升。并诚实拆解它的估计误差、参数敏感性与在实盘中的定位(中阶)。

你手上有两条价格序列,肉眼看上去同涨同跌。你算了个皮尔逊相关系数,0.85,于是写进报告:这两个市场高度联动。
这个结论很可能是错的。 不是数字算错了,而是这个数字根本回答不了你想问的问题。皮尔逊相关衡量的是”围绕各自均值的线性同步”,但金融价格是非平稳的——它没有稳定的均值。当两条序列都带着向上(或向下)的慢趋势时,光是”都在往上走”这一件事,就足以把皮尔逊相关顶到 0.8 以上,哪怕它们的短期波动完全相互独立。
文首图就是这个陷阱的可视化:两条序列共享了一条相同的慢趋势(common trend),但各自的短期扰动是完全独立生成的。皮尔逊会告诉你它们高度相关,而真相是——它们之间唯一的联系只有那条谁都甩不掉的大趋势。
DCCA(Detrended Cross-Correlation Analysis,去趋势互相关分析,Podobnik & Stanley 2008)就是为了解决这个问题而生的。它做两件皮尔逊做不到的事:在非平稳数据上把趋势剥掉再看相关,以及把”相关性”拆成随时间尺度变化的一条曲线。
一、为什么皮尔逊在非平稳数据上会骗人#
先把问题说透。皮尔逊相关的定义是:
它隐含一个前提: 和 是(弱)平稳的,有确定的均值和方差。可价格序列 是典型的 过程——差分之后(收益率)才平稳。如果你直接对价格算相关,均值本身在漂移,“偏离均值”这个概念就失去了意义,共同趋势会被计入”协同”,制造出伪相关(spurious correlation)。
标准教科书答案是:先差分,对收益率算相关。这在很多时候够用,但差分有代价——它是一个高通滤波器,会放大高频噪声、抹掉长期结构。如果两个市场的联动主要发生在低频(比如它们在几个月的尺度上同向,但在日度上各走各的),差分后的相关会把这个真实的长期联动一并洗掉。
于是我们陷入两难:不去趋势 → 伪相关;简单差分 → 洗掉长期结构。 DCCA 提供的是第三条路:分尺度地去趋势,在每个时间尺度上单独衡量协同波动。
二、DCCA 的四步构造#
DCCA 脱胎于 DFA(去趋势波动分析),把单序列的自相关推广到两条序列的互相关。四步:
第一步:累积求和(profile)。 对两条已经去均值的序列 (通常是收益率)做累加,把它们变回”类价格”的积分序列:
第二步:分段。 选定一个时间尺度 ,把长度为 的序列切成 个不重叠的窗口。 就是我们要考察的”这个尺度上的联动”。
第三步:局部去趋势。 在每个窗口内,对 和 各自拟合一条局部多项式趋势(最常用一阶线性),然后取残差 。这一步是 DCCA 的灵魂——它把每个窗口里的局部趋势(无论是共享的还是各自的)都扣掉,只留下围绕局部趋势的波动。
第四步:计算去趋势协方差与方差,合成 DCCA 系数。 对每个窗口算残差的协方差与方差,跨窗口平均得到 ,最后:
这个系数和皮尔逊一样落在 ,但它有一个皮尔逊没有的自变量:尺度 。DCCA 不给你一个数,给你一条 曲线——两条序列在不同时间跨度上的联动强度。
核心计算用几十行就能写清楚:
import numpy as np
def integrate(x):
return np.cumsum(x - x.mean())
def dcca(x, y, scales):
"""返回每个尺度 s 下的 DCCA 系数 rho(s)。x, y 通常是收益率序列。"""
X, Y = integrate(x), integrate(y)
N = len(X)
rho = []
for s in scales:
nseg = N // s
t = np.arange(s)
A = np.vstack([t, np.ones(s)]).T # 一阶线性去趋势的设计矩阵
cov, vx, vy = [], [], []
for v in range(nseg):
xs, ys = X[v*s:(v+1)*s], Y[v*s:(v+1)*s]
rx = xs - A @ np.linalg.lstsq(A, xs, rcond=None)[0] # 去趋势残差
ry = ys - A @ np.linalg.lstsq(A, ys, rcond=None)[0]
cov.append(np.mean(rx * ry))
vx.append(np.mean(rx * rx))
vy.append(np.mean(ry * ry))
Fxy, Fxx, Fyy = np.mean(cov), np.mean(vx), np.mean(vy)
rho.append(Fxy / np.sqrt(Fxx * Fyy))
return np.array(rho)python三、读懂标度依赖:相关性不是一个数#
DCCA 最有价值的输出,是那条随尺度变化的曲线。下图对三种依赖场景各画一条:

- 共享趋势(蓝线):全尺度都是高正相关,且尺度越大越接近 1。这是”两个市场被同一宏观因子驱动”的典型指纹——短期和长期都同向。
- 仅大尺度耦合(绿线):小尺度上相关很弱(短期各走各的、噪声主导),但随着尺度增大,相关系数单调爬升。这对应”日度上看不出关系,但在季度尺度上高度同向”的资产对——这种结构是皮尔逊和简单差分都会漏掉的,只有分尺度看才浮现。
- 独立序列(灰线):所有尺度都在 0 附近抖动,没有系统性偏离。这是”无联动”的正确样子。
这张图传递一个反直觉但重要的观念:“相关性”不是一个标量,而是一个尺度的函数。 两个资产可以在日内高度联动、在月度尺度上毫无关系(比如高频做市带来的机械同步 vs 基本面各自独立),也可以反过来。用单一皮尔逊系数描述这种关系,等于把一条曲线压成一个点,丢掉了最有交易价值的那部分信息。
四、DCCA vs 皮尔逊:鲁棒性对比#
把陷阱做成可控实验:固定两条序列的特质波动完全独立,只逐步增强它们共享的趋势强度,看两种度量如何反应。

结果泾渭分明:
- 皮尔逊(红线):随着共同趋势增强,它从接近 0 一路飙到 0.95 以上。但记住——这两条序列的真实联动始终为零,它们的短期扰动自始至终相互独立。皮尔逊报告的高相关,百分之百是共同趋势制造的幻觉。
- DCCA(蓝线):无论共同趋势多强,它都稳稳趴在 0 附近。因为分段去趋势那一步已经把每个窗口里的趋势成分扣掉了,剩下的残差之间确实没有相关。
这就是 DCCA 存在的全部理由:它能区分”因为一起被大趋势推着走”和”真的在协同波动”。在配对交易选标的、构建相关性矩阵、做风险传染分析时,这个区分是生死攸关的——你不想因为两只股票都在牛市里涨,就误以为它们能对冲彼此。
五、滚动 DCCA:捕捉危机期的联动跃升#
真实市场的联动不是恒定的。平静期各资产各走各的,危机期”correlation goes to one”——所有东西一起跌。把 DCCA 放进滚动窗口,就能追踪这种时变联动。

上图构造了一个明确的情景:中间一段(红色阴影)是人为设定的”危机期”,两个市场的真实联动从平静期的 ≈0.15 跳到 ≈0.85。下图的滚动 DCCA 系数(固定尺度 s=40、窗口 250)忠实地捕捉到了这个跃升——它在危机段整体抬到 0.85 附近,危机结束后回落到基线。
这对风险管理是直接可用的:分散化最需要生效的时候(危机),恰恰是相关性最高、分散化最失效的时候。 滚动 DCCA 提供了一个能剥离趋势干扰的联动监测器,比滚动皮尔逊更不容易被各资产共同的下跌趋势污染。当它开始系统性抬升,就是”分散化红利正在蒸发”的预警。
需要提醒的是滚动窗口的老问题:窗口越短反应越快但噪声越大,越长越平滑但滞后越重。上图的跃升检测能这么干净,一部分是合成数据信噪比高的功劳,真实数据上边缘会毛糙得多。
六、诚实的部分#
第一,DCCA 系数有不可忽视的估计误差。 在大尺度 上,窗口数 急剧减少——序列总长 4000、尺度取 500 时,只有 8 个窗口参与平均。这意味着大尺度端的 方差很大,曲线尾部的抖动大多是采样噪声而非真实结构。实践中大尺度不要超过 ,并对尾部的解读保持克制。已有改进版 DMCA(去趋势移动平均互相关)用滑动窗口缓解这个问题,代价是引入平滑偏差。
第二,去趋势阶数是个需要交代的选择。 本文用一阶线性去趋势(DCCA-1),它假设每个窗口内趋势近似为直线。如果你的数据在窗口尺度上有明显的曲率(二次趋势),线性去趋势会留下残余趋势污染相关估计,应该升到二阶(DCCA-2)。阶数越高去趋势越彻底,但也越容易把真实的低频信号一并当趋势扣掉——这和 FFF、HP 滤波里的老矛盾一模一样,没有免费的午餐。
第三,显著性判断需要额外工具。 DCCA 系数偏离 0 多少才算”真的相关”?这需要在零假设(两序列独立)下 bootstrap 出置信带,或用 Podobnik 等人给出的解析近似。裸看一条曲线偏离 0 就下结论,和裸看皮尔逊系数一样危险。
第四,它是诊断工具,不是策略本身。 DCCA 回答的是”这两条序列在哪些尺度上真的联动”,这个信息可以喂给配对交易的标的筛选、协整关系的尺度定位、相关性矩阵的去伪。但它不直接产生买卖信号——它是你构建策略之前用来看清结构的显微镜,不是显微镜下那只要抓的虫子。
第五,本文所有图表基于合成数据。 共同趋势强度、危机期联动跳变、各场景的曲线形状都是按机制逻辑构造的演示,用来把 DCCA 的性质讲清楚。真实市场数据的信噪比远低于此,标度曲线会更毛糙、危机跃升会更含混,直接套用本文的数值预期会失望。
七、总结#
皮尔逊相关在非平稳金融序列上有一个致命盲区:它分不清”一起被趋势推着走”和”真的在协同波动”。DCCA 用分段去趋势把这两者切开,并额外给出一个皮尔逊没有的维度——联动强度如何随时间尺度变化。
它的三个核心价值:在非平稳数据上抗伪相关、揭示尺度依赖的联动结构、放进滚动窗口后监测时变的危机联动。它的三个软肋:大尺度估计误差大、去趋势阶数需要谨慎选择、显著性要额外做。
对量化研究者,DCCA 的正确定位是相关性分析的显微镜而非替代品:当你要判断两个资产的联动到底真不真、发生在什么时间跨度上、在危机中会不会突然抱团时,先用它把结构看清楚,再决定用皮尔逊、协整还是别的工具去落地。先分清真伪,再谈利用——这个顺序,在相关性这件事上尤其要紧。
参考文献:
- Podobnik, B., & Stanley, H. E. (2008). Detrended Cross-Correlation Analysis: A New Method for Analyzing Two Nonstationary Time Series. Physical Review Letters, 100(8), 084102.
- Zebende, G. F. (2011). DCCA cross-correlation coefficient: Quantifying level of cross-correlation. Physica A, 390(4), 614-618.
- Kristoufek, L. (2014). Measuring correlations between non-stationary series with DCCA coefficient. Physica A, 402, 291-298.