曼德博分形第三章:长期记忆与赫斯特指数
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("判读:市场接近随机游走,技术择时边际优势有限")
可执行的操作规则
- 在部署任何趋势跟踪或均值回归策略前,先测算标的的赫斯特指数。 对 $H$ 明显高于 0.55 的资产(如部分大宗商品、加密货币)优先使用趋势跟踪;对 $H$ 明显低于 0.45 的资产(如部分外汇对、高流动性大盘股短周期)优先使用均值回归。
- 警惕赫斯特指数的时变性。 同一资产在不同市场周期下的 $H$ 值会漂移,必须使用滚动窗口(如过去 252 个交易日)定期重新估算,而非依赖一次性历史值。
- 不要将 $H$ 值本身当作直接的择时信号。 赫斯特指数只能告诉你策略框架的数学适配性,具体的入场出场仍需结合动量指标或均值回归带宽等独立信号确认。