曼德博分形第三章:长期记忆与赫斯特指数

Read in English

测量长期记忆的重标极差(R/S)方法、均值回归与趋势持续性的区分,以及用 Python 计算赫斯特指数。

🔊 聆听文章 (Listen to Article)

曼德博分形第三章:长期记忆与赫斯特指数

"尼罗河的洪水记录告诉了我一个关于金融市场的秘密:自然与市场系统都拥有记忆,过去发生的事件会持续影响未来,而不是像随机游走假设的那样瞬间遗忘。" —— 本华·曼德博

尼罗河水文学家的意外发现

赫斯特指数(Hurst Exponent)的起源与金融毫无关系。1950 年代,英国水文学家哈罗德·埃德温·赫斯特(Harold Edwin Hurst)在研究尼罗河数千年的洪水记录时发现了一个奇怪的现象:丰水年之后往往紧跟着更多的丰水年,枯水年之后往往紧跟着更多的枯水年——洪水序列表现出明显的"长期记忆",而非独立随机事件。

曼德博敏锐地意识到,赫斯特用于水文学的统计方法,恰好是检验有效市场假说(Efficient Market Hypothesis)中"价格变化相互独立、不可预测"这一核心假设的完美工具。

重标极差分析法(R/S Analysis)的数学构造

赫斯特指数的估算基于重标极差统计量。对于一个长度为 $n$ 的时间序列 ${X_t}$:

第一步: 计算均值离差累积和序列

$$Y_k = \sum_{t=1}^{k} (X_t - \bar{X}), \quad k = 1, 2, \dots, n$$

第二步: 计算极差 $R(n)$,即累积离差序列的最大值与最小值之差

$$R(n) = \max_{1 \le k \le n} Y_k - \min_{1 \le k \le n} Y_k$$

第三步: 用标准差 $S(n)$ 对极差重标准化

$$\frac{R(n)}{S(n)} \sim c \cdot n^H$$

第四步: 对上式两边取对数,通过线性回归求斜率即得赫斯特指数 $H$

$$\log\left(\frac{R(n)}{S(n)}\right) = \log(c) + H \cdot \log(n)$$

赫斯特指数的三种市场状态判读

赫斯特指数区间 市场行为特征 交易含义
$H = 0.5$ 标准随机游走,无记忆 价格变化独立,技术分析理论上无效
$0.5 < H < 1.0$ 持续性趋势(Persistent) 上涨后更可能继续上涨,趋势跟踪策略存在数学依据
$0 < H < 0.5$ 反持续性/均值回归(Anti-Persistent) 上涨后更可能反转下跌,均值回归策略存在数学依据
$H = 1.0$ 完全确定性趋势 理论极限,现实市场极少见
赫斯特指数与价格路径形态对照:

H = 0.5 (随机游走):     /\  /\/\    /\
                       \/  \/  \/\/  \/    <- 无规律折返

H = 0.7 (趋势持续):    /
                      /  /
                     /  /              <- 长期单向趋势明显
                    /  /

H = 0.3 (均值回归):   /\      /\
                     /  \    /  \      <- 快速拉扯回归均值
                    /    \  /    \

曼德博对棉花、黄金及多种股票指数长期数据的实证研究发现,绝大多数金融时间序列的赫斯特指数落在 0.5 到 0.7 之间——这直接证伪了有效市场假说所要求的 $H = 0.5$ 纯随机游走前提,证明市场存在统计学意义上可测量的长期记忆效应。

Python 实现:计算赫斯特指数

import numpy as np

def hurst_exponent(price_series: np.ndarray, min_window: int = 10, max_window: int = None) -> float:
    """
    使用重标极差法 (R/S Analysis) 计算价格序列的赫斯特指数
    :param price_series: 价格或收益率时间序列(建议使用对数收益率)
    :param min_window: 最小窗口长度
    :param max_window: 最大窗口长度,默认为序列长度的一半
    """
    n = len(price_series)
    if max_window is None:
        max_window = n // 2

    window_sizes = np.unique(np.logspace(np.log10(min_window), np.log10(max_window), 20).astype(int))
    rs_values = []

    for window in window_sizes:
        n_chunks = n // window
        if n_chunks < 1:
            continue
        rs_chunk = []
        for i in range(n_chunks):
            chunk = price_series[i * window:(i + 1) * window]
            mean_adj = chunk - np.mean(chunk)
            cumulative = np.cumsum(mean_adj)
            r = np.max(cumulative) - np.min(cumulative)
            s = np.std(chunk)
            if s > 0:
                rs_chunk.append(r / s)
        if rs_chunk:
            rs_values.append(np.mean(rs_chunk))

    valid_windows = window_sizes[:len(rs_values)]
    log_windows = np.log(valid_windows)
    log_rs = np.log(rs_values)
    hurst, _ = np.polyfit(log_windows, log_rs, 1)
    return hurst

# 示例:模拟一个具有趋势持续性的价格序列并计算赫斯特指数
np.random.seed(1)
trend_returns = np.cumsum(np.random.normal(0.001, 0.01, 2000)) + np.random.normal(0, 0.002, 2000)
h = hurst_exponent(trend_returns)
print(f"估算赫斯特指数 H = {h:.3f}")
if h > 0.55:
    print("判读:市场呈现趋势持续性,适用趋势跟踪策略")
elif h < 0.45:
    print("判读:市场呈现均值回归特性,适用反转策略")
else:
    print("判读:市场接近随机游走,技术择时边际优势有限")

可执行的操作规则

  1. 在部署任何趋势跟踪或均值回归策略前,先测算标的的赫斯特指数。 对 $H$ 明显高于 0.55 的资产(如部分大宗商品、加密货币)优先使用趋势跟踪;对 $H$ 明显低于 0.45 的资产(如部分外汇对、高流动性大盘股短周期)优先使用均值回归。
  2. 警惕赫斯特指数的时变性。 同一资产在不同市场周期下的 $H$ 值会漂移,必须使用滚动窗口(如过去 252 个交易日)定期重新估算,而非依赖一次性历史值。
  3. 不要将 $H$ 值本身当作直接的择时信号。 赫斯特指数只能告诉你策略框架的数学适配性,具体的入场出场仍需结合动量指标或均值回归带宽等独立信号确认。