halo 的技术博客

返回

问题:一条价格序列,到底该追还是该抄?#

做趋势策略的人相信”强者恒强”,做均值回归的人相信”涨多了会跌”。同一根 K 线摆在面前,两派会下完全相反的注。谁对?

答案是:取决于这段价格有没有”长记忆”。 如果今天的涨跌和过去很多天的涨跌正相关,趋势会自我延续,追涨对;如果负相关,价格总想回到某个中枢,抄底对;如果完全无关(随机游走),两派都是在赌硬币。

Hurst 指数 HH 就是把这件事量化成一个数:

  • H>0.5H > 0.5长记忆正相关,趋势持续(persistent)
  • H=0.5H = 0.5无记忆,随机游走
  • H<0.5H < 0.5反持续(anti-persistent),均值回归

这个数最早不是金融家发明的。英国水文学家 Harold Edwin Hurst 在 1950 年代研究尼罗河水库容量时,发现洪水年和枯水年会成簇出现——洪水年后面更可能跟着洪水年。他用一个叫”重标极差”(Rescaled Range,R/S)的统计量刻画这种持续性,指数后来以他命名。

听起来很美:算一个 HH,大于 0.5 就上趋势策略,小于 0.5 就上均值回归。但这篇文章要用真值完全已知的受控模拟回答三个更硬的问题:

  1. 主流估计量(R/S 与 DFA)到底能不能准确还原已知的 HH
  2. 它们各自的偏差和噪声长什么样,短样本下能信吗?
  3. HH 拿去做实时 regime 判别,赚到的是真 alpha,还是估计噪声的自我实现?

本文用固定随机种子(20260801)生成 Hurst 指数精确已知的分数布朗运动,逐一验证。

理论:从”重标极差”到标度指数#

R/S 分析:Hurst 的原始武器#

给定一段收益序列 {x1,,xn}\{x_1, \dots, x_n\},R/S 分析的做法是:

  1. 算均值 xˉ\bar x,构造去均值的累积偏离 Yk=i=1k(xixˉ)Y_k = \sum_{i=1}^{k}(x_i - \bar x)
  2. 极差 R=maxkYkminkYkR = \max_k Y_k - \min_k Y_k(累积偏离走了多远)
  3. 标准差 SS
  4. 重标极差 R/SR/S

关键洞见是:R/SR/S 随窗口长度 nn 的增长速度,编码了长记忆:

E[R/S]ncnH\mathbb{E}[R/S]_n \sim c \cdot n^{H}

两边取对数,log(R/S)\log(R/S)logn\log n 做线性回归,斜率就是 HH。对独立随机游走,H=0.5H=0.5(极差随 n\sqrt n 增长,这就是有名的”随机游走走 t\sqrt t”);正相关会让极差涨得更快(H>0.5H>0.5),负相关涨得更慢(H<0.5H<0.5)。

DFA:去趋势波动分析#

R/S 有个众所周知的毛病:对非平稳趋势敏感。真实价格常带缓慢漂移,会污染极差。1994 年 Peng 等人提出去趋势波动分析(Detrended Fluctuation Analysis, DFA),专门解决这个问题:

  1. 构造累积廓线 Y(k)=i=1k(xixˉ)Y(k) = \sum_{i=1}^{k}(x_i - \bar x)
  2. 把廓线切成长度 ss 的块,每块内用多项式(DFA-1 用一次)拟合并去掉局部趋势
  3. 算去趋势后的均方根波动 F(s)F(s)
  4. F(s)sHF(s) \sim s^{H}logF(s)\log F(s)logs\log s 回归的斜率即 HH

DFA 的第 2 步是精髓——它在每个尺度上先减掉局部线性趋势,所以缓慢漂移不会被误判成长记忆。代价是它比 R/S 更”吃”数据。

这篇的模拟会同时跑两种估计量,让你看到它们在同一批已知 HH 的数据上,准确度和噪声完全不同

验证一:已知 H 的世界,估计量准不准?#

要检验估计量,先得有一个 HH 精确已知的数据生成器。我用分数布朗运动(fractional Brownian motion, fBm)——它的增量(分数高斯噪声)自协方差有解析形式:

γ(k)=12(k12H2k2H+k+12H)\gamma(k) = \tfrac{1}{2}\left(|k-1|^{2H} - 2|k|^{2H} + |k+1|^{2H}\right)

我用 Davies-Harte(circulant embedding)方法精确采样,生成理论 Hurst 严格等于设定值的序列。核心代码:

def fbm_increments(H, n, rng):
    """Davies-Harte 法生成分数高斯噪声,累加即 fBm,理论 Hurst = H"""
    k = np.arange(0, n)
    g = 0.5 * (np.abs(k - 1) ** (2*H) - 2*np.abs(k) ** (2*H)
               + np.abs(k + 1) ** (2*H))
    r = np.concatenate([g, g[-2:0:-1]])   # circulant embedding
    lam = np.fft.fft(r).real
    lam[lam < 0] = 0.0                      # 数值截断
    m = len(r)
    w = rng.standard_normal(m) + 1j * rng.standard_normal(m)
    y = np.fft.fft(np.sqrt(lam / m) * w)
    return y[:n].real
python

R/S 与 DFA 的实现(核心逻辑):

我从 H=0.2H=0.2 扫到 0.80.8,每个真值用 N=4096N=4096 的长样本重复 60 次。结果:

已知 H 的 fBm 上两种估计量的准确度

两条曲线都基本贴着对角线,说明两种估计量都能定性区分三种世界——这是好消息。但看细节,两者性格完全不同:

  • DFA 几乎无偏:真值 0.5 估成 0.496,0.3 估成 0.394(略偏),整体贴着对角线。
  • R/S 系统性上偏,尤其在低 H 端:真值 0.2 估成 0.302,0.3 估成 0.384,0.5 估成 0.545。也就是说,R/S 会把均值回归的序列高估得”不那么均值回归”,甚至把随机游走高估成”有点趋势”。

这个上偏不是 bug,是 R/S 的老毛病。Anis-Lloyd(1976)和 Peters(1994)早就指出:小到中等样本下,E[R/S]\mathbb{E}[R/S] 的理论值本身就高于 cn0.5c\cdot n^{0.5},直接回归会系统性高估 HH。用未修正的 R/S,你会看到满市场都是”弱趋势”——那多半是估计假象。

单条序列上,这个差异更直观:

R/S 与 DFA 的 log-log 回归

三条代表性序列的 log-log 拟合斜率就是估计出的 HHH=0.3H=0.3 的均值回归序列:DFA 估 0.285(很准),R/S 估 0.364(明显偏高)。H=0.7H=0.7 的趋势序列两者都准(0.71/0.70)。规律是:真值越低,R/S 越不可信。

验证二:有限样本才是真正的敌人#

上面用的是 N=4096N=4096 的奢侈样本。真实交易里你可能只有 60 天、120 天的窗口。样本越短,估计越不准——但两种估计量”不准”的方式不一样。

我在真随机游走H=0.5H=0.5,最干净的基准)上,把样本长度从 64 扫到 4096,每个长度重复 120 次,分别看偏差和噪声:

随机游走上的有限样本偏差与噪声

左图(偏差) 是这篇最该记住的一张图:

  • R/S 全程上偏N=64N=64 时偏 +0.13(把 0.5 估成 0.63!),N=512N=512 还有 +0.074,即使到 N=4096N=4096 仍有 +0.046。这意味着用短窗口 R/S,随机游走会被系统性误判成”趋势”。
  • DFA 几乎无偏:所有样本量的偏差都在 ±0.017 以内,N=128N=128 往后基本贴零。

右图(噪声) 给出代价:

  • DFA 方差更大N=64N=64 时标准差 0.18,是 R/S(0.11)的 1.6 倍。
  • 两者都随样本量收敛,N=4096N=4096 时 R/S 0.026、DFA 0.029,接近。

把两张图合起来读,结论很硬:短样本下,R/S 偏但稳,DFA 准但抖。 N=64N=64 的 R/S 会稳定地告诉你”这是趋势”(哪怕真相是随机游走),N=64N=64 的 DFA 平均无偏但单次估计能在 0.32~0.68 之间乱跳。

这就是为什么”算个 HH 看看大于还是小于 0.5”在实盘里这么危险:你测到的 H=0.55H=0.55,可能是真趋势,可能是 R/S 的偏差,也可能是 DFA 的一次噪声。 短窗口下这三者分不开。

验证三:拿 H 做 regime 判别,是真 alpha 还是自我实现?#

估计量能还原静态 HH 是一回事,把它拿去做实时 regime 切换又是另一回事。最诱人的用法是:用滚动窗口算 HHH<0.5H<0.5 时开均值回归策略,H>0.5H>0.5 时关掉——所谓”只在该均值回归的时候均值回归”。

我构造了一个”混合世界”来测它:价格由 16 段交替拼成,奇数段是强均值回归的 Ornstein-Uhlenbeck 过程(θ=0.45\theta=0.45),偶数段是纯随机游走,每段 250 个 bar。真实 regime 标签完全已知。然后用 120 窗口的滚动 DFA-HH 判别,只在 H<0.5H<0.5 段做均值回归(对偏离 20 日均线的 z 分数反向下注 tanh(z)-\tanh(z)):

滚动 H 判别 regime 的均值回归策略与对抗式检验

图4a(滚动 H vs 真实 regime):滚动 DFA-HH 在红色阴影(真实均值回归段)里确实倾向压低,识别准确率 61.4%——比抛硬币好,但远非完美。原因在图4c:均值回归段的滚动 HH 中位 0.32、随机游走段 0.46,两个分布可分但重叠严重。窗口边界跨 regime、有限样本噪声,都让判别模糊。

图4b(权益曲线)HH 门控均值回归 Sharpe 3.63,略高于无条件版本的 3.20。看起来门控有用——它在随机游走段关掉了策略,避免了那里的无效交易。

图4d(对抗式检验)才是判决书。我把同一套”滚动 H<0.5H<0.5 则均值回归”的逻辑,搬到一个真实 HH 恒等于 0.5、根本不存在任何 regime 切换的纯随机世界里,重跑 100 次:

  • 随机世界 Sharpe 均值锚在 0.01(无偏,引擎没造假)
  • 但 95 分位 0.64最高能刷到 1.12

也就是说,在一个没有任何长记忆、没有任何均值回归可赚的世界里,仅靠滚动 HH 的估计噪声,你就能”筛”出一段看起来 H<0.5H<0.5 的窗口、恰好在那里下反向注、然后蒙对——单次实验刷出 Sharpe 1.12 完全可能。

真实策略的 3.63 确实超过了随机世界的最高 1.12(对抗式检验通过,说明混合世界里的均值回归段是真的可赚),但这张图的警示是永久的:当你用滚动 HH 在自己的数据上挑时点、挑窗口、挑参数,你有很大概率在挑中噪声。 如果你的策略 Sharpe 只有 1 出头,它和”随机世界里 HH 门控的运气上限”完全无法区分。

三段式总结#

A. 实现细节#

  • 数据生成:分数布朗运动,Davies-Harte(circulant embedding)精确采样,理论 Hurst 严格等于设定值,固定种子 20260801。这是唯一能让”真值已知”的方式——真实价格的 HH 永远不可观测。
  • 两种估计量:R/S 分析(经典重标极差,log(R/S)\log(R/S)logn\log n 回归取斜率)与 DFA-1(累积廓线分块、块内一次多项式去趋势、logF(s)\log F(s)logs\log s 回归)。尺度取 8 到 N/2N/2(R/S)/ N/4N/4(DFA)之间对数均匀的 10~14 个点。
  • regime 实验:OU(θ=0.45\theta=0.45)与随机游走各 8 段交替、每段 250 bar 拼成混合世界;滚动窗口 120、每 3 bar 更新一次 HH(前向填充降计算量);均值回归信号为 20 日 z 分数的 tanh(z)-\tanh(z)H<0.5H<0.5 时启用;次日结算(execute on tt, earn rt+1r_{t+1})无 look-ahead。
  • 对抗式检验:在真实 H=0.5H=0.5 的纯随机游走上跑 100 次同一套滚动 HH 门控策略,比较真实策略 Sharpe 与随机世界的分布上限。

B. 已知偏差#

  • fBm ≠ 真实价格:分数布朗运动是自相似高斯过程,真实收益有肥尾、波动聚集、regime 突变,HH 的定义在真实市场里本身就是近似。这篇能保证的是”估计量在理想数据上的行为”,不是”真实市场一定有稳定的 HH”。
  • R/S 未做 Anis-Lloyd 修正:我用的是教科书原始 R/S,所以能直接展示它的系统性上偏。生产环境应上修正版(Peters 1994 的期望 R/S),能把低 H 端的偏差压下去——但那会让本文”R/S 上偏”的教学点消失,故此处保留原始版本。
  • OU 混合世界是理想化 regime:真实 regime 切换没有整齐的 250-bar 分段,也没有清晰的 θ\theta。真实市场的 regime 判别只会比这更难,识别准确率 61.4% 是乐观上界
  • 策略未建模成本:z 分数反向下注每天调仓,换手极高,本文 Sharpe 是零成本口径。加上买卖价差和冲击后,滚动 HH 门控省下的那点边际优势很可能被交易成本吃光。

C. 结果解读#

  1. 两种估计量都能定性分三类,但精度不对称:DFA 几乎无偏(真值 0.5→0.496)但短样本方差大(N=64N=64 标准差 0.18);R/S 方差小但系统性上偏(N=64N=64 把 0.5 估成 0.63,N=4096N=4096 仍偏 +0.046)。要判别均值回归(低 H),DFA 明显更可信;R/S 会把均值回归洗白成随机游走、把随机游走洗成弱趋势。

  2. 有限样本是命门:短窗口下 R/S 偏但稳、DFA 准但抖,H=0.55H=0.55 这个读数在 N=64N=64 时根本分不清是真趋势、R/S 偏差还是 DFA 噪声。任何”当前 H=0.5XH=0.5X 所以是趋势/回归”的实时判断,先问一句:这个小数点后第二位,扛得住估计噪声吗?

  3. regime 可分但重叠严重:混合世界里均值回归段滚动 HH 中位 0.32、随机段 0.46,两分布可分(识别准确率 61.4%)但尾部大幅重叠。HH 门控策略 Sharpe 3.63 略高于无条件 3.20——门控的价值主要是在随机段”少做错”,而非在回归段”多赚”。

  4. 对抗式检验揭穿最大陷阱:真实 H=0.5H=0.5 的纯随机世界里,滚动 HH 门控策略均值 Sharpe 锚在 0(无偏),但单次能刷到 1.12。这意味着 Sharpe 1 出头的 HH 择时策略,和”随机世界里的运气上限”无法区分——用滚动 HH 挑时点,你有很大概率在挑估计噪声。本文真实策略 3.63 显著超过随机上限,说明混合世界的均值回归是真的;但这个安全边际,在真实市场里通常没这么宽。

  5. Hurst 指数的正确定位:它是一个诊断工具,不是交易信号。用它在长历史上判断”这个品种/这个市场整体上更像趋势还是回归”是合理的(长样本、静态估计、DFA 优先);用它做逐日 regime 切换则要极度警惕——你测的 HH 波动,一大半是估计器自己的噪声,而不是市场记忆的真实变化。

Hurst 指数与均值回归:用长记忆判别趋势还是反转
https://blog.halo26812.eu.org/blog/hurst-exponent-mean-reversion
Author halo
Published at 2026年8月1日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨