第 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.
本章目标:5 分钟内安装依赖、跑通最小 DFA 示例、理解 Hurst 指数与 F(n) 曲线的关系。
| 项目 | 建议 |
|---|---|
| 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 便于交互实验 |
pip install --upgrade pip pip install fathon numpy matplotlib
fathon v1.0 起提供预编译 wheel,Linux / Windows / macOS x86_64 通常无需本地编译。
macOS ARM64 暂无官方 wheel,需本地编译:
brew install llvm gsl # 在 fathon 源码目录执行 pip install .
| 包 | 用途 |
|---|---|
| fathon | DFA / MFDFA / DCCA / MFDCCA / HT 核心计算 |
| numpy | 时序数组、窗口向量 |
| matplotlib | F(n) 双对数图、多分形谱可视化(教程示例用) |
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)即环境就绪。
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()
预期结果:
computeFlucVec 与 fitFlucVec 是 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 | 打印拟合详情 |
computeFlucVec 常用参数(第 3、4 章详述):
| 参数 | 默认 | 作用 |
|---|---|---|
winSizes |
必填 | 窗口大小数组 |
polOrd |
1 | 每窗口内拟合的多项式阶数(1=去线性趋势) |
revSeg |
False | True 时从序列末尾再算一遍,取平均,减少端点效应 |
unbiased |
False | 短序列无偏 DFA 版本(v1.3.2+) |
有时标度律只在特定尺度区间成立(如金融数据日频 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 章)。
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 | 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 |
N 改为 2000,观察 H 估计的稳定性变化。polOrd=2 与 polOrd=3,比较 H 差异(多项式去趋势阶数的影响见第 9 章)。revSeg=False 再跑一次,对比 H 变化。本章所有代码片段都整理成了可直接运行的示例(位于教程包的「配套示例」模块):
| 想跑什么 | 对应示例主题 |
|---|---|
| 1.3 节冒烟测试 | 「环境冒烟测试」示例 |
| 1.4 节白噪声 vs 随机游走双对数图 | 「白噪声与随机游走对比」示例 |
| 1.7 节 multiFitFlucVec 多区间拟合 | 「DFA 全 API 演练」示例中的多区间拟合演示 |
| 1.8 节 saveObject 序列化 | 「DFA 全 API 演练」示例中的状态保存演示 |
💡 第一次接触 fathon,建议按冒烟测试 → 白噪声对比 → 手算对照 的顺序运行,前两个看 API 与结果,第三个用手算对照黑盒。
下一章建立长记忆与 Hurst 指数的数学直觉,第 3 章深入 DFA 算法原理。