多重分形 DFA:用多重分形谱刻画不同尺度下的记忆结构
单一 Hurst 指数假设市场只有一种记忆——大波动和小波动遵循同一个标度律。但真实收益序列的大涨大跌聚集成串、小波动却近似随机游走,一个 H 根本装不下。MF-DFA(多重分形去趋势波动分析)把波动函数升级成 q 阶矩:q>0 放大大波动的标度行为、q<0 放大小波动,得到广义 Hurst 曲线 h(q),再经 Legendre 变换画出多重分形谱 f(α),谱宽 Δα 一个数度量『记忆结构的丰富度』。本文用纯 numpy 从零实现 MF-DFA(profile 累积、双向切段、多项式去趋势、q 阶波动函数、谱变换),三类合成序列对照:白噪声 h(q) 水平线且 Δα≈0.006、长记忆 fGn(H=0.7) 整体抬高但仍是单分形(Δα=0.024)、二项级联序列 h(q) 从 0.76 弯到 0.43、Δα=0.61——多重分形性一眼可辨。滚动窗口应用:谱宽在白噪声段均值 0.11,切入波动级联段跳到 0.35,可做 regime 检测的补充仪表。诚实拆穿关键陷阱:打乱检验显示级联序列打乱后 Δα 仍有 0.55——谱宽大部分来自收益分布厚尾而非时序相关,不做打乱对照就把厚尾当记忆是 MF-DFA 文献里最泛滥的错误。另拆穿谱宽=可预测性/小样本负 q 发散/去趋势阶数选择三类坑(中高阶)。
先说结论:用单一 Hurst 指数描述市场记忆,等于用平均气温描述一个既有沙漠又有冰川的星球。真实收益序列的大波动聚集成串(危机连着危机),小波动却近似随机游走——两种尺度的记忆结构完全不同,一个 H 装不下。MF-DFA(Multifractal Detrended Fluctuation Analysis)把这件事做对了:用 q 阶矩分别透视大小波动的标度行为,得到一条广义 Hurst 曲线 h(q) 和一张多重分形谱 f(α)。本文纯 numpy 从零实现全流程,三类合成序列对照实验里,二项级联序列的谱宽 Δα=0.61,是白噪声(0.006)的百倍;但打乱检验同时泼了盆必要的冷水——谱宽的大头往往来自收益分布的厚尾,而不是时序记忆,不做这个对照的多重分形研究基本都在自欺。
一、单一 Hurst 的失职#
经典 DFA 流程:把收益序列累积成 profile,切成长度 s 的窗口,每窗去掉多项式趋势后算残差方差 ,如果 ,斜率 H 就是 Hurst 指数。H>0.5 长记忆、H<0.5 反持续、H=0.5 随机游走。
问题在于 是所有窗口方差的平均——大波动窗口和小波动窗口一锅烩。设想一个序列:95% 的时间是温和随机游走,5% 的时间是剧烈的波动聚集。平均之后你得到一个不痛不痒的 H≈0.5,两种截然不同的动力学互相抵消,全部信息丢失。
金融收益恰恰就是这种序列。波动率的长记忆(大波动跟着大波动)是最稳健的典型事实之一,但它只活在”大波动的尺度行为”里——你需要一个能按波动大小分层透视的工具。
二、MF-DFA:用 q 阶矩当变焦镜头#
MF-DFA 对 DFA 只改一处:把二阶平均升级成 q 阶矩:
q 是变焦旋钮:
- q > 0:大方差窗口在求和里权重大 → 反映大波动的标度行为
- q < 0:小方差窗口权重大 → 反映平静期的标度行为
- q = 2:退回经典 DFA, 就是普通 Hurst
如果 h(q) 是水平线——大小波动同一套标度律——序列是单分形;如果 h(q) 随 q 递减(大波动记忆结构与小波动不同),序列是多重分形。
再经 Legendre 变换 ,,,得到多重分形谱:一条开口向下的抛物线状曲线,谱宽 一个数概括多重分形的强度。
三、纯 numpy 实现#
核心 40 行,四步走:
def mfdfa(x, scales, qs, m=1):
y = np.cumsum(x - x.mean()) # 1. profile 累积
N = len(y); Fq = np.zeros((len(qs), len(scales)))
for si, s in enumerate(scales):
ns = N // s; F2 = []; t = np.arange(s)
for seg in range(ns): # 2. 双向切段(正向+反向,不浪费尾部)
for yy in (y[seg*s:(seg+1)*s], y[N-(seg+1)*s:N-seg*s]):
coef = np.polyfit(t, yy, m) # 3. 每窗多项式去趋势
res = yy - np.polyval(coef, t)
F2.append((res**2).mean())
F2 = np.array(F2)
for qi, q in enumerate(qs): # 4. q 阶波动函数
if abs(q) < 1e-9: # q=0 用对数平均(极限形式)
Fq[qi, si] = np.exp(0.5 * np.log(F2 + 1e-30).mean())
else:
Fq[qi, si] = (np.mean(F2 ** (q/2))) ** (1.0/q)
return Fqpython之后对每个 q 拟合 对 的斜率得 h(q),数值梯度做 Legendre 变换得谱。两个实现细节值得强调:双向切段(正反各切一遍)避免序列尾部被丢弃引入偏差;q=0 必须用对数平均的极限形式,直接代公式会除零。
四、三类序列对照:谱宽差两个数量级#
合成三条 16384 点的序列做对照:
- 白噪声——无记忆、单分形的基准
- 分数高斯噪声 fGn(H=0.7)——有长记忆,但仍是单分形(记忆结构在所有尺度一致)
- 二项级联多重分形——波动率由 14 层二项级联生成(每层随机把方差按 0.75/0.25 分给左右两半),刻意制造”不同尺度不同记忆”

肉眼看前两条几乎无法区分,第三条能看出波动聚集。MF-DFA 的结果把三者彻底分开:

| 序列 | h(2) | h(−4) | h(+4) | 谱宽 Δα |
|---|---|---|---|---|
| 白噪声 | 0.532 | 0.529 | 0.533 | 0.006 |
| fGn (H=0.7) | 0.700 | 0.683 | 0.700 | 0.024 |
| 二项级联 | 0.504 | 0.758 | 0.431 | 0.608 |
解读三个要点:
- 白噪声:h(q) 死平在 0.5,Δα≈0.006——这个数就是本实现的”噪声地板”,实际应用中 Δα 低于 ~0.05 都应视为”无多重分形证据”;
- fGn:整条线抬到 0.7 但依然水平——长记忆 ≠ 多重分形,它只是把同一种记忆复制到所有尺度。这两个概念在文献里被混用得触目惊心;
- 二项级联:h(q) 从负 q 端的 0.76 一路弯到正 q 端的 0.43——平静期强持续、剧烈期反持续,两种动力学共存,Δα=0.61 把它钉死在多重分形柱上。

谱图上三者的形状差异一目了然:白噪声和 fGn 缩成一个点,级联序列张开成一顶宽帽子。
五、滚动谱宽:一个 regime 仪表#
多重分形谱能不能上生产线?一个自然的用法是滚动窗口谱宽当 regime 指示器。构造一条前半段白噪声、后半段波动级联的拼接序列,用 2048 点窗口、256 点步长滚动计算 Δα:

平静段谱宽均值 0.11,切入级联段后跳到 0.35,切换点附近响应干脆。直觉上这捕捉的是”波动聚集结构的出现”——比单纯的波动率水平多一层信息(波动率高但均匀的市场,谱宽不会大)。
但要按住期待:窗口 2048 点对日频数据是八年,实用中只能上小时或分钟频;而且谱宽是描述性统计,从”谱变宽了”到”该降仓了”之间还隔着一整套需要独立验证的映射。把它当风险仪表盘上的一块补充仪表,而不是信号发生器。
六、打乱检验:多重分形的照妖镜#
这是全文最重要的一节。谱宽大有两个完全不同的来源:
- 时序相关:大波动在时间上聚集(真正的”记忆结构”)
- 分布厚尾:收益分布本身有极端值,哪怕时序完全独立
区分方法简单粗暴:把序列随机打乱再算一遍。打乱摧毁一切时序相关,只留下分布本身的贡献。

结果令人清醒:级联序列原始 Δα=0.61,打乱后仍有 0.55。也就是说这个看起来惊人的谱宽里,九成来自级联生成的厚尾分布,只有一成来自时序结构。级联过程同时制造了厚尾和聚集,MF-DFA 的谱宽把两者混在一起报账。
真实金融数据上这个问题更尖锐——收益厚尾是铁一般的典型事实,任何序列不做打乱对照就宣称”发现多重分形记忆”,大概率只是在重新发现”收益有厚尾”这个 1963 年 Mandelbrot 就写过的常识。打乱检验不是可选项,是 MF-DFA 结论成立的前提。
七、坑位备忘录#
坑一:谱宽 ≠ 可预测性。 Δα 度量标度结构的丰富度,不承诺任何方向信息。“多重分形性强的市场更低效所以更可预测”是文献里流传甚广的滑坡推理,中间每一步都需要独立证据。
坑二:负 q 在小样本上会爆炸。 q<0 时权重集中在方差最小的窗口,若某窗口去趋势后残差几乎为零, 直接发散。序列短于 ~4000 点时建议把 q 限制在 [−3, 3],并检查 log-log 图的线性度而不是盲目拟合。
坑三:去趋势阶数是超参数。 本文用一阶(线性去趋势,即 MF-DFA1)。若序列含慢周期或多项式趋势,低阶去趋势会把趋势残余误报为长记忆。稳健做法是 m=1,2,3 各跑一遍:结论随 m 剧变的部分不可信。
坑四:尺度范围决定一切。 拟合区间取 [16, N/8] 是惯例而非真理。太小的 s 受离散化噪声污染,太大的 s 窗口数不足统计失效。发表级的结论应报告谱宽对尺度区间选择的敏感性。
八、结论#
MF-DFA 值得进工具箱的理由:它是少数能按波动大小分层刻画记忆结构的工具,40 行 numpy 就能实现,谱宽 Δα 提供了一个紧凑的 regime 描述量——本文实验里它把白噪声(0.006)、单分形长记忆(0.024)、多重分形级联(0.61)干净利落地分成三档,滚动版本对波动聚集 regime 的切换响应清晰(0.11→0.35)。
但它的正确用法自带三条纪律:先跑打乱对照分离厚尾与记忆的贡献(本实验九成谱宽来自厚尾);把 Δα 当描述性仪表而非交易信号;报告结论对去趋势阶数和尺度区间的敏感性。守住这三条,多重分形分析是一台严肃的显微镜;丢掉任何一条,它就退化成量化玄学的又一个发生器。