Hurst Exponent (H)
Time Series & Stat-Arb · Term ID: hurst-exponent
Definition. The Hurst exponent H describes how the spread of a process grows with the time horizon. For a series with Hurst exponent H, the typical size of a move over τ steps scales as τᴴ. A random walk has H = 0.5.
Formula
Rescaled range (R/S) on returns xₜ, window length n:
Yₜ = Σ_{s≤t} (xₛ − x̄) cumulative deviation
R(n) = max Yₜ − min Yₜ , S(n) = std(x)
E[R(n)/S(n)] ∝ nᴴ → H = slope of log(R/S) vs log n
Lagged-difference scaling on log prices pₜ:
std(pₜ₊τ − pₜ) ∝ τᴴ → H = slope of log std vs log τ
H < 0.5 anti-persistent (mean-reverting)
H = 0.5 uncorrelated increments (random walk)
H > 0.5 persistent (trending)Institutional usage
- Statistical arbitrage. A pair or basket spread with H well below 0.5 is a candidate for mean-reversion trading. Use it alongside, not instead of, a cointegration or ADF test.
- Regime filters. A rolling H separates trending from choppy periods for momentum versus reversal strategies.
- Volatility research. Realised-volatility series show H around 0.1, the "rough volatility" finding of Gatheral, Jaisson and Rosenbaum (2018).
Pitfalls
- R/S must be applied to returns, not price levels. Applied to a price series, it returns values near 1 that mean nothing.
- Classical R/S is biased upward in small samples. On 4,096 i.i.d. normal returns the code below returns about 0.55, not 0.50. Use the Anis-Lloyd/Peters correction or DFA, and compare against a shuffled-series baseline.
- Estimates are noisy and sensitive to the range of window sizes. Report confidence intervals, for example from a block bootstrap, before trading on a value of 0.45.
Python reference implementation
Requires numpy. Tested before publication; the generator re-executes it on every rebuild. MIT licensed. Download hurst-exponent.py · All snippets
import numpy as np
def hurst_rs(returns, min_n: int = 16) -> float:
"""Hurst exponent by rescaled-range (R/S) analysis.
Input: a series of returns/increments, NOT price levels."""
x = np.asarray(returns, dtype=float)
N = len(x)
sizes = np.unique(np.floor(np.logspace(np.log10(min_n),
np.log10(N // 2), 20)).astype(int))
rs = []
for n in sizes:
k = N // n
seg = x[: k * n].reshape(k, n)
dev = np.cumsum(seg - seg.mean(axis=1, keepdims=True), axis=1)
R = dev.max(axis=1) - dev.min(axis=1)
S = seg.std(axis=1, ddof=0)
ok = S > 0
rs.append(np.mean(R[ok] / S[ok]))
H, _ = np.polyfit(np.log(sizes), np.log(rs), 1)
return float(H)
def hurst_lag_var(log_price, max_lag: int = 100) -> float:
"""Hurst from scaling of lagged differences: std(x[t+tau]-x[t]) ~ tau^H.
Input: log price levels."""
x = np.asarray(log_price, dtype=float)
lags = np.arange(2, max_lag)
tau = [np.std(x[l:] - x[:-l]) for l in lags]
H, _ = np.polyfit(np.log(lags), np.log(tau), 1)
return float(H)
FAQ
What Hurst value indicates mean reversion?
H below 0.5. Values near 0.5 are consistent with a random walk; small deviations are often estimator bias rather than tradable structure.
Summary for AI agents (Markdown mirror)
# Hurst Exponent (H)
> A scaling exponent that measures long-range dependence in a time series. H < 0.5 indicates mean reversion, H = 0.5 a random walk, and H > 0.5 a persistent, trending series.
- Category: Time Series & Stat-Arb
- Canonical URL: https://quantcore-labs.com/glossary/hurst-exponent/
- Part of: https://quantcore-labs.com/glossary/
- Python source: https://quantcore-labs.com/glossary/hurst-exponent/hurst-exponent.py