Hurst Exponent: Is a Series Trending or Mean-Reverting?
The Hurst exponent is a single number that tells you the most important thing about a time series before you ever build a strategy on it: is it mean-reverting, a random walk, or trending? Picking a mean-reversion strategy for a trending series — or a trend-following strategy for a mean-reverting one — is a guaranteed way to lose money. The Hurst exponent, denoted H, is a fast diagnostic that helps you avoid that mismatch. This guide explains what H measures, two ways to estimate it, a clean Python implementation, and the caveats that keep it from being a magic bullet.
What the Hurst exponent measures
The Hurst exponent describes how the range (or variance) of a series scales with the time horizon over which you measure it. The key fact: for many processes, the spread of cumulative deviations grows like τ^H, where τ is the lag. The value of H lands in three regimes:
| Range of H | Behavior | Strategy fit |
|---|---|---|
0 ≤ H < 0.5 | Mean-reverting / anti-persistent | Fade moves (mean reversion) |
H ≈ 0.5 | Random walk (no memory) | No edge from direction |
0.5 < H ≤ 1 | Trending / persistent | Ride moves (momentum) |
Intuitively, H < 0.5 means an up move tends to be followed by a down move (the series fights its own direction), H ≈ 0.5 means moves are independent like Brownian motion, and H > 0.5 means moves cluster in the same direction so trends persist.
The rescaled-range (R/S) idea
The original estimator, due to Hurst's study of Nile flood levels, is the rescaled range (R/S) analysis. For a window of length n:
- Take the series and subtract its mean to get deviations.
- Form the cumulative sum of deviations and measure its range
R(max minus min). - Divide by the standard deviation
Sof the window to get the rescaled rangeR/S. - Repeat across many window sizes
n. The rescaled range scales like(R/S) ∝ n^H. - Regress
log(R/S)onlog(n); the slope is the Hurst exponent.
It is elegant but fiddly to implement robustly (sensitive to window choice and short samples), which is why many practitioners prefer the simpler variance-based estimator below.
The variance-of-lagged-differences estimator
A more robust and popular approach for trading uses the scaling of the variance of lagged differences. For a price (or log-price) series, the variance of the change over lag τ scales as:
Var( x(t+τ) − x(t) ) ∝ τ^(2H)
So if you compute that variance for several lags τ, take logs, and regress against log(τ), the slope is 2H. Halve it to get H. This is fast, stable, and easy to get right:
import numpy as np
def hurst_exponent(series, max_lag=50):
"""Estimate the Hurst exponent via the variance of lagged differences."""
series = np.asarray(series, dtype=float)
lags = np.arange(2, max_lag)
# standard deviation of the differences at each lag
tau = [np.std(series[lag:] - series[:-lag]) for lag in lags]
# log-log regression: log(tau) ~ H * log(lag)
log_lags = np.log(lags)
log_tau = np.log(tau)
H = np.polyfit(log_lags, log_tau, 1)[0]
return H
# Examples on synthetic data
rng = np.random.default_rng(0)
rw = np.cumsum(rng.standard_normal(5000)) # random walk
print(f"Random walk H ~ {hurst_exponent(rw):.2f}") # near 0.5
trend = np.cumsum(rng.standard_normal(5000) + 0.1) # drifting
print(f"Trending H ~ {hurst_exponent(trend):.2f}") # > 0.5
Note we use np.std of the differences, so the slope estimates H directly (since std ∝ τ^H). If you instead use the variance, the slope is 2H and you must halve it — a common off-by-a-factor bug.
Using H to choose a strategy
The Hurst exponent is a regime classifier and filter, not a signal generator. Use it to decide which kind of model to deploy on an instrument or a cointegrated spread:
Hwell below 0.5 (e.g. < 0.45): candidate for mean reversion. Pair this with an
Ornstein-Uhlenbeck fit to get the half-life and trade z-score reversions.
Hwell above 0.5 (e.g. > 0.55): candidate for momentum/trend following.Hnear 0.5: no exploitable autocorrelation in direction — do not bet on it.
A practical workflow:
def classify(series, lo=0.45, hi=0.55):
H = hurst_exponent(series)
if H < lo:
return f"mean-revert (H={H:.2f})"
if H > hi:
return f"trend (H={H:.2f})"
return f"random walk (H={H:.2f})"
You can also compute a rolling Hurst exponent to detect regime changes — a series that drifts from H < 0.5 toward H > 0.5 may be transitioning from ranging to trending, a complement to formal stationarity tests.
Instability and caveats
The Hurst exponent is genuinely useful but notoriously unstable, and treating it as gospel will hurt you:
- High estimation variance. On short or noisy samples,
Hcan swing by ±0.1 or more
just from sampling noise. Require a comfortable sample and bootstrap a confidence band.
- Lag-range sensitivity. The estimate depends on which lags
max_lagyou include.
Report H over a sensible lag range and check robustness.
- It is not a regime guarantee. A historical
H < 0.5does not promise future mean
reversion; structure breaks.
- Linear-memory only. It captures long-range linear dependence, not the
volatility clustering or fat-tail effects that also matter.
- Series choice matters. Compute it on the quantity you actually trade — the spread,
the log-price, the residual — not a loosely related proxy.
Use it as one input among several (cointegration tests, OU half-life, out-of-sample performance), never as a standalone green light.
Common mistakes
- Forgetting the factor of 2. Variance scales as
τ^(2H); standard deviation as
τ^H. Mixing them doubles or halves your estimate.
- Over-interpreting
H = 0.52. Tiny deviations from 0.5 are usually noise, not a
tradeable trend.
- Tiny samples. A few hundred points produce a meaningless, high-variance
H. - One-shot estimation. Markets shift regimes; a single static
Hhides that. - Skipping confirmation. Always confirm a "mean-reverting" verdict with an
OU half-life and out-of-sample tests before committing capital.
Key takeaways
- The Hurst exponent classifies a series:
H < 0.5mean-reverting,H ≈ 0.5
random walk, H > 0.5 trending.
- The variance-of-lagged-differences estimator is fast and robust; the
rescaled-range (R/S) method is the classic alternative.
- Use
Hto choose between mean reversion
and trend following, not to generate signals.
His unstable — require enough data, check lag-range robustness, and recompute
on a rolling basis.
- Confirm with an OU half-life,
stationarity tests, and out-of-sample validation before trading.
