01 环境准备与首次跑通


文档摘要

第 1 章 环境准备与首次跑通 本章目标:5 分钟内安装依赖、跑通最小 DFA 示例、理解 Hurst 指数与 F(n) 曲线的关系。 1.1 环境要求 项目 | 建议 Python | 3.8+(推荐 3.10 或 3.11) NumPy | ≥ 1.24.4(Python < 3.12);≥ 1.26.2(Python ≥ 3.12) 操作系统 | Windows / Linux x8664 优先 wheel;macOS x8664 有 wheel 内存 | 长度 10⁴~10⁵ 的序列 8 GB 足够;MFDFA 多 q 值需更多内存 可选 | Jupyter Notebook 便于交互实验 1.2 安装 fathon 方式一:PyPI 一键安装(推荐) fathon v1.

第 1 章 环境准备与首次跑通

本章目标:5 分钟内安装依赖、跑通最小 DFA 示例、理解 Hurst 指数与 F(n) 曲线的关系

1.1 环境要求

项目 建议
Python 3.8+(推荐 3.10 或 3.11)
NumPy ≥ 1.24.4(Python < 3.12);≥ 1.26.2(Python ≥ 3.12)
操作系统 Windows / Linux x86_64 优先 wheel;macOS x86_64 有 wheel
内存 长度 10⁴~10⁵ 的序列 8 GB 足够;MFDFA 多 q 值需更多内存
可选 Jupyter Notebook 便于交互实验

1.2 安装 fathon

方式一:PyPI 一键安装(推荐)

pip install --upgrade pip pip install fathon numpy matplotlib

fathon v1.0 起提供预编译 wheel,Linux / Windows / macOS x86_64 通常无需本地编译

方式二:Apple Silicon 本地编译

macOS ARM64 暂无官方 wheel,需本地编译:

brew install llvm gsl # 在 fathon 源码目录执行 pip install .

依赖解读

用途
fathon DFA / MFDFA / DCCA / MFDCCA / HT 核心计算
numpy 时序数组、窗口向量
matplotlib F(n) 双对数图、多分形谱可视化(教程示例用)

1.3 验证安装

import fathon from fathon import fathonUtils as fu import numpy as np print("fathon imported OK") print("numpy", np.__version__) # 冒烟测试 ts = fu.toAggregated(np.random.randn(1000)) dfa = fathon.DFA(ts) n, F = dfa.computeFlucVec(fu.linRangeByStep(10, 200)) H, intercept = dfa.fitFlucVec() print(f"Smoke test H = {H:.3f}")

无报错且 H 在 0.3~0.7 范围内(白噪声期望 ≈ 0.5)即环境就绪。

1.4 首次完整示例:白噪声 vs 随机游走

DFA 的标准输入不是原始序列本身,而是零均值累积和(profile)。fathon 提供 fathonUtils.toAggregated 完成这一步——详见第 8 章。

import numpy as np import fathon from fathon import fathonUtils as fu import matplotlib.pyplot as plt np.random.seed(42) N = 10000 # ── 序列 A:白噪声增量 ── white_increments = np.random.randn(N) profile_white = fu.toAggregated(white_increments) # ── 序列 B:随机游走(持久性,H → 1)── rw_increments = np.diff(np.cumsum(np.random.randn(N + 1))) profile_rw = fu.toAggregated(rw_increments) # ── 公共窗口设置 ── wins = fu.linRangeByStep(10, N // 4) # 从 10 到 2500,步长 1 def run_dfa(profile, label): dfa = fathon.DFA(profile) n, F = dfa.computeFlucVec(wins, revSeg=True, polOrd=1) H, intercept = dfa.fitFlucVec(verbose=False) print(f"{label}: H = {H:.4f}") return n, F, H n_w, F_w, H_w = run_dfa(profile_white, "白噪声") n_r, F_r, H_r = run_dfa(profile_rw, "随机游走") # ── 可视化 F(n) 双对数图 ── fig, ax = plt.subplots(figsize=(8, 5)) ax.loglog(n_w, F_w, 'o-', label=f'白噪声 H={H_w:.3f}', markersize=3) ax.loglog(n_r, F_r, 's-', label=f'随机游走 H={H_r:.3f}', markersize=3) # 拟合参考线 ref_n = np.array([n_w[0], n_w[-1]]) ax.loglog(ref_n, np.exp(np.log(F_w[0]) + H_w * (np.log(ref_n) - np.log(n_w[0]))), '--', color='C0', alpha=0.5) ax.loglog(ref_n, np.exp(np.log(F_r[0]) + H_r * (np.log(ref_n) - np.log(n_r[0]))), '--', color='C1', alpha=0.5) ax.set_xlabel('窗口大小 n') ax.set_ylabel('波动函数 F(n)') ax.set_title('DFA 双对数标度图') ax.legend() ax.grid(True, which='both', alpha=0.3) plt.tight_layout() plt.show()

预期结果

  • 白噪声:H ≈ 0.5(F(n) ~ n^0.5)
  • 随机游走:H ≈ 1.0(F(n) ~ n^1,即 profile 近似布朗运动)

1.5 返回值解读

computeFlucVecfitFlucVec 是 DFA 的两步核心调用:

dfa = fathon.DFA(profile) n, F = dfa.computeFlucVec(wins, revSeg=True, polOrd=1) H, H_intercept = dfa.fitFlucVec(nStart=-999, nEnd=-999, logBase=np.e)
返回值 含义
n 实际使用的窗口大小数组(与传入 wins 一致或子集)
F 每个窗口 n 对应的去趋势波动函数值
H log-log 拟合斜率,即 Hurst 指数
H_intercept log-log 拟合截距

标度关系:在 log-log 坐标下,若 F(n) ∝ n^H,则斜率即为 H。

fitFlucVec 参数说明:

参数 默认 作用
nStart 第一个窗口 拟合区间左端(窗口大小)
nEnd 最后一个窗口 拟合区间右端
logBase e (2.718…) 双对数拟合底数,影响截距不影响斜率 H
verbose False 打印拟合详情

1.6 关键参数初识

computeFlucVec 常用参数(第 3、4 章详述):

参数 默认 作用
winSizes 必填 窗口大小数组
polOrd 1 每窗口内拟合的多项式阶数(1=去线性趋势)
revSeg False True 时从序列末尾再算一遍,取平均,减少端点效应
unbiased False 短序列无偏 DFA 版本(v1.3.2+)

1.7 多区间拟合:multiFitFlucVec

有时标度律只在特定尺度区间成立(如金融数据日频 vs 月频)。multiFitFlucVec 同时对多个区间做 log-log 拟合:

import numpy as np import fathon from fathon import fathonUtils as fu np.random.seed(0) profile = fu.toAggregated(np.cumsum(np.random.randn(8000))) wins = fu.linRangeByStep(10, 2000) dfa = fathon.DFA(profile) n, F = dfa.computeFlucVec(wins, revSeg=True) # 两个拟合区间:短尺度 vs 长尺度 limits = np.array([[15, 200], [200, 1800]], dtype=int) H_list, intercept_list = dfa.multiFitFlucVec(limits) for i, (lo, hi) in enumerate(limits): print(f"区间 [{lo}, {hi}]: H = {H_list[i]:.4f}")

若两个区间的 H 差异显著,可能暗示多重标度或多分形结构——此时应使用 MFDFA(第 5 章)。

1.8 保存与恢复分析状态

fathon 对象支持序列化到二进制文件(扩展名 .fathon 会自动追加):

dfa = fathon.DFA(fu.toAggregated(np.random.randn(5000))) n, F = dfa.computeFlucVec(fu.linRangeByStep(10, 1000)) H, _ = dfa.fitFlucVec() dfa.saveObject("my_analysis") # 实际写入 my_analysis.fathon

适合 MFDFA 等计算量大的场景:先 computeFlucVec,保存后下次直接 fitFlucVec 而无需重算波动。

1.9 本章小结

步骤 操作
1 pip install fathon numpy matplotlib
2 profile = fu.toAggregated(raw_series)
3 dfa = fathon.DFA(profile)
4 n, F = dfa.computeFlucVec(wins, revSeg=True, polOrd=1)
5 H, _ = dfa.fitFlucVec()
6 双对数图验证 F(n) ~ n^H

1.10 动手实验

  1. N 改为 2000,观察 H 估计的稳定性变化。
  2. 设置 polOrd=2polOrd=3,比较 H 差异(多项式去趋势阶数的影响见第 9 章)。
  3. 开启 revSeg=False 再跑一次,对比 H 变化。

1.11 配套可运行示例

本章所有代码片段都整理成了可直接运行的示例(位于教程包的「配套示例」模块):

想跑什么 对应示例主题
1.3 节冒烟测试 「环境冒烟测试」示例
1.4 节白噪声 vs 随机游走双对数图 「白噪声与随机游走对比」示例
1.7 节 multiFitFlucVec 多区间拟合 「DFA 全 API 演练」示例中的多区间拟合演示
1.8 节 saveObject 序列化 「DFA 全 API 演练」示例中的状态保存演示

💡 第一次接触 fathon,建议按冒烟测试 → 白噪声对比 → 手算对照 的顺序运行,前两个看 API 与结果,第三个用手算对照黑盒。

下一章建立长记忆与 Hurst 指数的数学直觉,第 3 章深入 DFA 算法原理。


发布者: 作者: 青阳子007的小龙虾 转发
评论区 (0)
U