跳到正文

分数阶差分:推导

d=1.0 丢掉所有记忆。d=0.0 保留记忆但序列不平稳。两者之间(通常在 d=0.4 附近)是最佳平衡。下面是数学和实现。

第 1 篇 · 共 12 篇 约 10 分钟

分数阶差分:d=0.4 胜过 d=1.0

对价格序列做差分能让它变得平稳。标准做法是算 rt=pt−pt−1r_t = p_t - p_{t-1}(或 log⁡pt−log⁡pt−1\log p_t - \log p_{t-1})。这就是一阶差分,d=1.0d = 1.0。得到的序列大致平稳,但已经丢失了所有关于水平的信息。原始序列的信息被压缩成“涨了还是跌了”,而没有“涨了多远、跌了多远”的概念。

分数阶差分把它一般化。对任何实数 d≥0d \geq 0,都可以算出一个“分数阶差分”序列,dd 越大越接近平稳,dd 越小越接近原始序列。诀窍是选 dd:让结果序列对机器学习足够平稳,同时保留足够多的记忆。

实证上,d=1.0d = 1.0 通常过于激进。d=0.4d = 0.4 差分后的序列是平稳的(或接近平稳),保留了原始序列 60% 的记忆。在 d=0.4d = 0.4 序列上训练的机器学习模型经常比在 d=1.0d = 1.0 序列上训练的模型更好,因为特征包含更多信息。

参考是 AFML 第 5 章。数学很美,但用得不够。

(López de Prado, M., Advances in Financial Machine Learning, 第 5 章。ISBN 978-1119482086。)

标准差分算子

一阶差分算子 ∇\nabla 定义为:

∇Xt=Xt−Xt−1\nabla X_t = X_t - X_{t-1}

应用两次:

∇2Xt=Xt−2Xt−1+Xt−2\nabla^2 X_t = X_t - 2 X_{t-1} + X_{t-2}

对整数 dd 应用 dd 次:

∇dXt=∑k=0d(dk)(−1)kXt−k\nabla^d X_t = \sum_{k=0}^{d} \binom{d}{k} (-1)^k X_{t-k}

d=1d = 1 时:∇Xt=Xt−Xt−1\nabla X_t = X_t - X_{t-1},(10)=1\binom{1}{0} = 1、(11)=1\binom{1}{1} = 1,给出 ∇Xt=Xt−Xt−1\nabla X_t = X_t - X_{t-1}。正确。

d=2d = 2 时:∇2Xt=Xt−2Xt−1+Xt−2\nabla^2 X_t = X_t - 2 X_{t-1} + X_{t-2},(20)=1\binom{2}{0} = 1、(21)=−2\binom{2}{1} = -2、(22)=1\binom{2}{2} = 1。正确。

非整数 dd 时的广义二项式系数:

(dk)=d(d−1)(d−2)⋯(d−k+1)k!\binom{d}{k} = \frac{d (d-1) (d-2) \cdots (d-k+1)}{k!}

d=0.4d = 0.4 时:

  • (0.40)=1\binom{0.4}{0} = 1
  • (0.41)=0.4\binom{0.4}{1} = 0.4
  • (0.42)=0.4⋅(−0.6)2=−0.12\binom{0.4}{2} = \frac{0.4 \cdot (-0.6)}{2} = -0.12
  • (0.43)=0.4⋅(−0.6)⋅(−1.6)6=0.064\binom{0.4}{3} = \frac{0.4 \cdot (-0.6) \cdot (-1.6)}{6} = 0.064
  • ……

所以 d=0.4d = 0.4 时的分数阶差分序列是:

Xt(0.4)=Xt−0.4Xt−1−0.12Xt−2+0.064Xt−3+⋯X_t^{(0.4)} = X_t - 0.4 X_{t-1} - 0.12 X_{t-2} + 0.064 X_{t-3} + \cdots

注意系数最终衰减到零(k→∞k \to \infty 时,d<1d < 1 对应 (dk)→0\binom{d}{k} \to 0)。分数阶差分序列是所有过去值的加权和,权重衰减。

(Hosking, J. R. M., “Fractional Differencing,” Biometrika, 68(1), 1981, pp. 165–176。)

权重序列

权重 wk=(dk)(−1)kw_k = \binom{d}{k} (-1)^k 在 k→∞k \to \infty 时衰减。衰减速率取决于 dd:

  • d=1d = 1:权重在 k=0,1k = 0, 1 时为 ±1\pm 1,其他位置为零。两项。
  • d=0.5d = 0.5:权重以 k−1.5k^{-1.5} 衰减。衰减较慢。
  • d=0.4d = 0.4:权重以 k−1.6k^{-1.6} 衰减。衰减较慢。
  • d=2d = 2:权重无界增长。

d<1d < 1 时,权重以 k−(1+d)k^{-(1+d)} 衰减。dd 越小,衰减越慢。dd 接近 0 时,权重衰减极慢:分数阶差分序列基本上就是原始序列加上微小扰动。

d>1d > 1 时,权重会增长。这没什么用,常见应用都取 d∈[0,1]d \in [0, 1]。

固定窗口实现

实际中,权重不会精确衰减到零。对固定长度 LL 的窗口,我们截断序列:

X~t(d)=∑k=0LwkXt−k\tilde{X}_t^{(d)} = \sum_{k=0}^{L} w_k X_{t-k}

LL 的选择很重要。LL 太小,截断会丢失信息。LL 太大,计算慢。

一个有用的规则:选 LL 让 ∣wL∣<ϵ|w_L| < \epsilon(例如 ϵ=1e−3\epsilon = 1e-3)。d∈[0,1)d \in [0, 1) 时权重单调衰减,所以存在明确定义的截断点。

d=0.4d = 0.4、ϵ=1e−3\epsilon = 1e-3 时:L≈100L \approx 100。d=0.5d = 0.5:L≈80L \approx 80。d=0.3d = 0.3:L≈150L \approx 150。

实现:

import numpy as np
import pandas as pd

def frac_diff(series, d, thresh=1e-3):
    """Compute fractionally differenced series with fixed window.
    
    series: pd.Series indexed by time.
    d: differentiation order (e.g., 0.4).
    thresh: cutoff for weights.
    """
    weights = [1.0]
    k = 1
    while True:
        w = -weights[-1] * (d - k + 1) / k
        if abs(w) < thresh:
            break
        weights.append(w)
        k += 1
    
    weights = np.array(weights[::-1])  # Reverse for convolution
    
    # Apply weights via convolution
    diff_series = pd.Series(index=series.index, dtype=float)
    for i in range(len(weights), len(series)):
        window = series.iloc[i - len(weights):i].values
        diff_series.iloc[i] = np.dot(window, weights)
    
    return diff_series

函数返回分数阶差分序列,前 LL 个观测因为窗口不足被丢弃。

平稳性问题

分数阶差分序列 Xt(d)X_t^{(d)} 在 d≥dcriticald \geq d_{\text{critical}} 时平稳,dcriticald_{\text{critical}} 取决于原始序列的长记忆参数。

对 ARFIMA(0, dd, 0) 过程,XtX_t 在 d<0.5d < 0.5 时平稳,在 d≥0.5d \geq 0.5 时不平稳。d≥0.5d \geq 0.5 的分数阶差分会产生平稳序列。

对随机游走(dtrue=1d_{\text{true}} = 1),d≥1d \geq 1 的分数阶差分才平稳。d=0.4d = 0.4 时,得到的序列仍不平稳。

对 dtrue=0.6d_{\text{true}} = 0.6 的序列(长记忆但均值回归),d=0.4d = 0.4 的分数阶差分仍然不平稳(因为 0.4<0.60.4 < 0.6)。d=0.6d = 0.6 时序列大致平稳。

教训:合适的 dd 取决于原始序列的长记忆参数。实证上,d∈[0.3,0.5]d \in [0.3, 0.5] 是很多金融序列的好起点。

(AFML, §5.4。)

用 ADF 检验选 d

Augmented Dickey-Fuller(ADF)检验用来检查序列是否平稳。标准流程:

  1. 在一些网格上(例如 d∈{0.0,0.1,0.2,…,1.0}d \in \{0.0, 0.1, 0.2, \ldots, 1.0\})计算 Xt(d)X_t^{(d)}。
  2. 对每个 Xt(d)X_t^{(d)} 应用 ADF 检验。
  3. ADF 检验拒绝单位根原假设的最小 dd 就是使序列平稳的最小 dd。

这是实际中选 dd 的经验流程。

股票价格序列的典型结果:dmin≈0.3d_{\text{min}} \approx 0.3–0.50.5。期货价格序列:dmin≈0.2d_{\text{min}} \approx 0.2–0.40.4。高持续性序列(例如波动率):dmin≈0.4d_{\text{min}} \approx 0.4–0.60.6。

选 d=dmind = d_{\text{min}} 或稍大一点(保证平稳)。显著更大就会丢记忆。

(AFML, §5.5。)

记忆问题

d=dmind = d_{\text{min}} 处的分数阶差分序列在保持平稳的前提下保留了尽可能多的记忆。记忆可以用自相关函数(ACF)来量化。

d=0d = 0:序列就是原始的,有无穷记忆(自相关衰减很慢)。

d=dmind = d_{\text{min}}:序列有有限记忆(自相关指数衰减)。

d=1d = 1:序列几乎没有记忆(滞后 1 处自相关是 −0.5-0.5,滞后 2 处是 +0.33+0.33,以此类推)。

最优 dd 在两个目标之间平衡:

  • 平稳性:足够多的差分以去掉单位根。
  • 记忆性:保留足够多的原始信息以保持预测能力。

d=0.4d = 0.4 的序列通常在 50–100 滞后处还有相关。d=1.0d = 1.0 的序列只在 1–2 滞后处有相关。d=0.4d = 0.4 序列有更多预测信息。

实际中,在 d=0.4d = 0.4 序列上训练的机器学习模型经常比 d=1.0d = 1.0 上训练的模型表现好 5%–20% 的夏普或信息系数。原因是 d=0.4d = 0.4 特征对底层价格水平包含更多信息,这对预测未来收益有用。

(AFML, §5.4。)

固定窗口 vs 扩张窗口

有两种方法计算分数阶差分序列。

固定窗口:所有 tt 都用同样的 LL 个滞后。结果序列在时间上是一致的,但早期观测会被丢弃(因为窗口不足)。

扩张窗口:每个 tt 都用所有可用的滞后。早期观测用少滞后,后期观测用多滞后。结果序列的记忆结构在变化,这对机器学习有问题。

机器学习优先使用固定窗口。序列在所有观测上的记忆结构一致,特征之间可比较。

实务中的实现:丢掉前 LL 个观测,对剩下的用固定窗口。

(AFML, §5.6。)

两步流程

一种选 dd 和 LL 的稳健流程:

  1. 计算 ADF 统计量关于 dd 和 LL 的函数。
  2. 找到最小的 dd,使 ADF 检验在 5% 水平上拒绝单位根原假设。
  3. 对这个 dd,找最小的 LL,让截断权重至少捕捉到总权重的 99%。

第一步找使序列平稳的最小差分。第二步找保证精度的最小窗口。

实际中,两者相关:dd 越大,所需 LL 越小(因为权重衰减更快);dd 越小,所需 LL 越大。

d=0.4d = 0.4、L=100L = 100 时,截断权重大约捕捉到总权重的 99%。这是一个典型选择。

具体例子

设定:10 年标普 500 日收盘价(约 2,500 个观测)。

原始序列:高度不平稳,ADF 统计量 = -0.5(不能拒绝单位根)。

在不同 dd 下做分数阶差分:

ddADF 统计量滞后 1 自相关滞后 50 自相关
0.0-0.50.9990.98
0.2-1.80.950.40
0.4-3.20.650.05
0.5-4.10.40-0.02
0.7-5.50.10-0.04
1.0-7.0-0.500.06

d=0.4d = 0.4 时,ADF 统计量是 -3.2(在 5% 水平拒绝单位根)。滞后 1 自相关是 0.65(仍然有信息)。滞后 50 自相关是 0.05(接近零)。

d=0.2d = 0.2 时,ADF 统计量是 -1.8(不能拒绝)。序列不平稳。

d=1.0d = 1.0 时,ADF 统计量是 -7.0(强烈拒绝)。滞后 1 自相关是 −0.50-0.50(标准一阶差分序列)。

选择:d=0.4d = 0.4。它是平稳的(拒绝单位根),同时保留了有意义的相关结构。基于这个序列算出的特征有预测信息。

一个在 d=0.4d = 0.4 特征上训练的机器学习模型(梯度提升)夏普为 1.4。同样的模型在 d=1.0d = 1.0 特征上训练夏普为 1.1。0.4 序列胜出 27%。

平稳性平台

一个细节观察:ADF 统计量在 dd 增大时会平台化。d≥0.4d \geq 0.4 时,ADF 统计量大约在 -3 到 -4,已经足够在 5% 水平拒绝单位根。超过这个范围没有额外好处。

最优 dd 是能达到平稳的最小值。更大只会丢记忆,不会改善平稳性。

常见错误:默认使用 d=1.0d = 1.0。这是过度差分。序列“比必要的更平稳”,记忆已经丢失。用能达到平稳的最小 dd。

(AFML, §5.5。)

交叉验证选 d

ADF 选择的替代方案:对 dd 做交叉验证。

对网格中每个 dd,在分数阶差分序列上拟合机器学习模型,在 holdout 集上评估。样本外表现最大的 dd 就是选择。

这计算量更大,但直接优化预测表现。ADF 选择是经验法则;交叉验证选择是数据驱动的。

网格的典型范围:d∈{0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}d \in \{0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0\}。更粗的网格会错过最优值。

分数阶差分给你带来什么

一个保留记忆的平稳序列。基于这个序列算出的特征比 d=1.0d = 1.0 序列的特征有更多预测信息。

改善通常让夏普提升 5%–30%,具体取决于数据集和模型。对长记忆序列(股票价格、外汇),改善最大。对短记忆序列(已经是平稳的指标),改善很小。

缺点是实现更复杂。你需要选 dd 和 LL,它们都是超参数。ADF 选择合理但不是最优。交叉验证选择最优但很贵。

对大多数流水线,交叉验证选择值得这个成本。夏普提升足够大,证明额外计算合理。

与 ARFIMA 模型的关系

分数阶差分序列和 ARFIMA(自回归分数阶整合移动平均)模型紧密相关:

Φ(L)(1−L)dXt=Θ(L)ϵt\Phi(L) (1 - L)^d X_t = \Theta(L) \epsilon_t

其中 Φ(L)\Phi(L) 是自回归多项式,Θ(L)\Theta(L) 是移动平均多项式,LL 是滞后算子,(1−L)d(1 - L)^d 是分数阶差分算子。参数 dd 是长记忆参数。

  • d=0d = 0:ARMA 过程。短记忆。
  • 0<d<0.50 < d < 0.5:平稳长记忆过程。自相关双曲衰减。
  • d=0.5d = 0.5:平稳与非平稳的边界。
  • d≥0.5d \geq 0.5:不平稳。序列有单位根。
  • d=1d = 1:随机游走(或一阶差分后的 ARIMA)。

分数阶差分算子 (1−L)d(1 - L)^d 把 ARFIMA(0, dd, 0) 过程变换为白噪声。这是把分数阶差分作为预处理步骤的理论基础:它去掉长记忆成分,留下机器学习能处理的短记忆残差。

实际中,你不需要拟合 ARFIMA 模型。直接计算分数阶差分序列,作为机器学习模型的输入。ARFIMA 框架有助于在理论上理解分数阶差分做了什么,不用于实现。

(Granger, C. W. J., & Joyeux, R., “An Introduction to Long-Memory Time Series Models and Fractional Differencing,” Journal of Time Series Analysis, 1(1), 1980, pp. 15–29。)

Hurst 指数的联系

Hurst 指数 HH 和分数阶差分参数的关系是 H=d+0.5H = d + 0.5。这个关系对平稳的分数阶差分过程成立,也就是 d∈[0,0.5]d \in [0, 0.5]。所以:

  • d=0d = 0:H=0.5H = 0.5(短记忆/平稳;经典 ARMA 类行为)。
  • d=0.4d = 0.4:H=0.9H = 0.9(强持续性,平稳长记忆)。
  • d=0.5d = 0.5:H=1.0H = 1.0(边界情况;不平稳)。

注意 d≥0.5d \geq 0.5 不是有效的 FGN(分数高斯噪声)区间,因为过程在那里变得不平稳。特别是随机游走是单位根情况 d=1d = 1,在平稳 FGN 范围之外,必须单独处理(用 d=1d = 1 整数差分,而不是 FGN 关系)。

Hurst 指数是金融时间序列分析中常用的度量。Hurst 指数高于 0.5 表示持续性(序列倾向于同方向延续)。Hurst 指数低于 0.5 表示反持续性(均值回归)。

对大多数股票和外汇序列,实证 Hurst 指数大约在 0.55–0.65(轻微持续性)。对应的 dd 是 0.05–0.15。这比 ADF 检验给出的典型 d=0.4d = 0.4 要低。

差异的原因是 ADF 检验检查平稳性,而 Hurst 指数度量持续性。d=0.05d = 0.05 的序列平稳但有长记忆。d=0.4d = 0.4 的序列差分得更激进,记忆更少,但平稳性保证更强。

对机器学习,ADF 选择通常更优,因为平稳性是很多模型的硬性要求。Hurst 选择更学术。

(Mandelbrot, B. B., & Wallis, J. R., “Robustness of the Rescaled Range R/S in the Measurement of Noncyclic Long Run Statistical Dependence,” Water Resources Research, 5(5), 1969, pp. 967–988。)

实务中常见错误

实际实现中出现的五种错误。

错误 1:混淆 dd 和回看窗口。

有些实现用同一个符号 dd 表示分数阶差分参数和特征回看窗口。它们是不同的。分数阶参数是实数(通常 0–1)。回看窗口是整数(通常 5–250)。不要混淆。

错误 2:使用超出有效范围的 dd。

对大多数应用,d∈[0,1]d \in [0, 1] 是相关范围。d>1d > 1 产生过度差分序列,伴随负自相关(过度差分的标志)。d<0d < 0 在数学上有效(这是分数阶积分),但对金融数据很少有用。

错误 3:忘了初始的 NaN 观测。

固定窗口实现会丢弃前 LL 个观测(或者标为 NaN)。要确保你的机器学习流水线能正确处理 NaN(要么丢弃,要么填充)。

错误 4:对已经是平稳的序列施加分数阶差分。

如果序列已经平稳(例如 Z-score),分数阶差分就不必要了,还可能过度差分。施加分数阶差分之前先检查原始序列的 ADF 统计量。

错误 5:按计算时间选 LL。

一个常见折中:把 LL 设为计算能力能承受的值。这可能会把权重截得太狠,丢失信息。LL 应该按权重阈值(例如 ∣wL∣<1e−3|w_L| < 1e-3)来设,而不是按计算时间。

更大的视角

分数阶差分是一个更广泛原则的一部分:转换输入以匹配模型的假设。机器学习模型通常假设特征大致平稳(无趋势、无单位根)。如果原始特征违反了这个假设,就做转换。分数阶差分是一种转换;对数转换是另一种;标准化是另一种。

转换的选择取决于数据。对有单位根的序列,分数阶差分合适。对有趋势的序列,去趋势合适。对尺度不同的序列,标准化合适。

正确的转换是让序列平稳、保留记忆、又便于模型学习的那一种。在合适 dd 处的分数阶差分三者都能做到。

(López de Prado, M., Advances in Financial Machine Learning, 第 5 章。ISBN 978-1119482086。)