"""ex06dcca.py — 第 6 章 DCCA 双序列交叉相关分析 目标: 用 DCCA 计算两条序列的交叉 Hurst 指数 用 computeRho 得到不同尺度上的去趋势交叉相关系数 ρ(n) 用 rhoThresholds 构造「独立零假设」置信带,判断 ρ 是否显著 对应教程:tutorials/06-dcca-mfdcca.md。 运行: python ex06dcca.py """ import numpy as np import fathon from fathon import fathonUtils as fu import matplotlib.
"""ex06_dcca.py — 第 6 章 DCCA 双序列交叉相关分析
目标:
对应教程:tutorials/06-dcca-mfdcca.md。
运行:
python ex06_dcca.py
"""
import numpy as np
import fathon
from fathon import fathonUtils as fu
import matplotlib.pyplot as plt
def make_coupled_pair(L, seed=42):
"""构造一对共享因子的序列:交叉相关显著。"""
rng = np.random.default_rng(seed)
common = np.cumsum(rng.standard_normal(L))
noise1 = rng.standard_normal(L) * 0.3
noise2 = rng.standard_normal(L) * 0.3
x1 = np.diff(common) + noise1
x2 = np.diff(common) + noise2
return x1, x2
def main():
np.random.seed(42)
L = 10000
x1, x2 = make_coupled_pair(L)
p1, p2 = fu.toAggregated(x1), fu.toAggregated(x2)
wins = fu.linRangeByStep(20, L // 4, step=10) # ── DCCA 交叉标度 ── dcca = fathon.DCCA(p1, p2) n, F = dcca.computeFlucVec(wins, polOrd=1, absVals=True, revSeg=True) H, _ = dcca.fitFlucVec() print(f"交叉 Hurst H = {H:.4f}") # ── ρ_DCCA:交叉相关系数 vs 尺度 ── wins_rho = fu.linRangeByStep(20, 200, step=20) n_rho, rho = dcca.computeRho(wins_rho, polOrd=1) # ── 置信带:对独立随机序列蒙特卡洛模拟 ── # 注意:空构造(无数据),用模拟的独立序列估算零假设分布 dcca_ref = fathon.DCCA() n_ci, lo, hi = dcca_ref.rhoThresholds(300, wins_rho, nSim=100, confLvl=0.95) # ── 可视化 ── fig, axes = plt.subplots(1, 2, figsize=(12, 4.5)) axes[0].loglog(n, np.abs(F), 'o-', ms=3) axes[0].set_xlabel('n'); axes[0].set_ylabel('|F_DCCA(n)|') axes[0].set_title(f'交叉波动标度 H={H:.3f}') axes[0].grid(True, which='both', alpha=0.3) axes[1].plot(n_rho, rho, 'b-o', ms=5, label='ρ_DCCA (实测)') axes[1].fill_between(n_ci, lo, hi, alpha=0.25, color='gray', label='95% 独立零假设置信带') axes[1].axhline(0, color='k', lw=0.5) axes[1].set_xlabel('n'); axes[1].set_ylabel('ρ') axes[1].set_title('交叉相关系数 vs 尺度') axes[1].legend() axes[1].grid(True, alpha=0.3) plt.tight_layout() plt.show() # ── 显著性判断 ── significant = (rho < lo) | (rho > hi) print(f"显著相关尺度占比:{significant.mean():.0%}") print("(ρ 超出置信带的尺度上,两序列的去趋势交叉相关显著。)")
if name == "main":
main()