The Hurst Exponent Reads a Coin Toss as a Trend — We Measured By How Much
The textbook says H = 0.5 is a random walk. We fed pure random walks — memoryless by construction — through the classical rescaled-range estimator, and at 256 bars it read a mean of 0.586: a coin toss printed as a trender. The Anis-Lloyd correction recentres it on roughly 0.50 at every length we tested, but the dispersion that survives is brutal — across 20,000 corrected 128-bar runs, the 1st–99th percentile band spans 0.316 to 0.675. The measurements, the window dependence, and the 0.5 sentinel bug we shipped.
Every textbook gives the Hurst exponent the same legend: above 0.5 the series trends, below 0.5 it mean-reverts, at exactly 0.5 it is a random walk. The legend is fine. The estimator is not. This week we shipped a Hurst-based mean-reversion indicator, and before shipping it we did the check the textbook never asks for: we fed the estimator series whose true H we know by construction, and wrote down what it actually printed.
A coin toss through the classical estimator
The test series are pure random walks — deterministic seeded Gaussian increments, zero memory by construction, so the true answer is exactly 0.5. We ran 40 seeds per length through classical rescaled-range (R/S) analysis, uncorrected — plain R/S, no small-sample adjustment.
| Series length | Mean uncorrected H | True H |
|---|---|---|
| 256 bars | 0.586 | 0.5 |
| 512 bars | 0.576 | 0.5 |
| 1024 bars | 0.570 | 0.5 |
At 256 bars the individual seeds ranged from 0.477 to 0.755. Read that against the legend: a memoryless series averages in the high 0.50s, and an unlucky seed prints 0.755 — deep “strongly trending” territory — with no trend anywhere in the generator. The mechanism is known: the rescaled range of pure noise sits above its asymptotic law at small chunk sizes, and a straight-line fit through raw log(R/S) inherits that offset as a higher slope. But the consequence is rarely stated plainly: a regime filter built on uncorrected R/S with the textbook 0.5 threshold is structurally biased toward calling everything a trend. If you fade “mean-reverting” markets with it, your threshold does not mean what you think it means.
What the correction buys
The fix is old and public: Anis-Lloyd. Compute the R/S that white noise alone would be expected to produce at each chunk size (with Peters’ adjustment for larger chunks), subtract the slope of that expectation from the observed slope, and add back 0.5. We ran the corrected estimator over 60 seeds per regime: random walks, a mean-reverting series (an AR(1) pull toward the mean, phi 0.25) and a trending one (autocorrelated increments, rho 0.55).
| Bars | Random walk | Mean-reverting | Trending |
|---|---|---|---|
| 128 | 0.497 | 0.321 | 0.658 |
| 256 | 0.505 | 0.301 | 0.652 |
| 512 | 0.504 | 0.256 | 0.627 |
| 1024 | 0.508 | 0.224 | 0.611 |
The correction does exactly what it claims: the memoryless series recentres on roughly 0.50 at every length we tested. And the separation is clean in the mean — at every length, 100% of mean-reverting seeds printed below 0.5 and 100% of trending seeds printed above it. On these synthetic series with genuine memory, the corrected estimator found it in every seed we ran.
The dispersion the correction cannot fix
The means recentre. The individual readings do not tighten. At 128 bars the corrected random-walk mean is 0.497 — and the 60 seeds span 0.324 to 0.715. An independent cross-check — a separate reviewer, on a separate code path — pushed 20,000 Monte-Carlo random walks of 128 bars through the corrected estimator: 1st percentile 0.316, 99th percentile 0.675, maximum 0.826. A series with no memory at all prints 0.675 or higher one run in a hundred, and can, rarely, print 0.826.
The seed range narrows with length — 0.394 to 0.671 at 256 bars, 0.385 to 0.606 at 512, 0.434 to 0.591 at 1024 — but on the window lengths an intraday chart actually offers, a single Hurst reading is weak evidence. A reading that persists across bars is the evidence. That distinction is the difference between a regime filter and a random-number generator with a colour scheme.
Same chart, different windows
There is a second degree of freedom nobody prints on the label: the estimation window. We took one fixed anti-persistent series of 320 bars — the exact series in the public sandbox — and dragged the window from 40 to 200 bars. The current reading moved between 0.117 and 0.441. The price path did not change by one pixel. At the default 90-bar window the current reading is 0.225 and the session range is 0.15–0.47.
H is a measurement over a window, not a property of the chart. Two sensible traders running different windows on the same instrument will report different regimes on the same afternoon, and both will be reporting honestly. Any argument about “the” Hurst exponent of an instrument that does not name the window is an argument about nothing.
The bug we shipped
Now the uncomfortable part of the field note. Our estimator needs 3 points on the chunk ladder to regress — the ladder starts at 8 bars and grows by half up to half the window, which puts a hard floor at 37 bars. Below that, the original implementation returned 0.5 as a “no opinion” sentinel. Every caller consumed that 0.5 as if it were a measurement.
In the interactive demo, two slider positions — 30 and 35 bars — rendered a perfectly flat H = 0.50 line, a badge reading “TRENDING — OFF”, and 0 signals, directly under a caption asserting the indicator “stays armed”. Worse: pushing the threshold to 0.70 made those same dead positions read “armed 100% of the time, 12 signals” — the joint-highest signal count anywhere on the slider. A filter that had measured nothing scored as maximally confident.
The fix was a matter of intent, not cleverness: the sentinel became NaN, which fails every comparison and cannot be mistaken for a measurement, and the minimum window was raised to 40 bars. An adversarial review caught it before any user did. The lesson generalises well beyond Hurst: a sentinel value that is also a plausible measurement will, sooner or later, be consumed as one. If your code needs to say “I don’t know”, say it in a value that cannot pass for an answer.
What this changes at the chart
- Thresholds belong to the estimator, not the textbook. The 0.5 line separates regimes only for an estimator that actually centres a memoryless series on 0.5 — ours does after correction; the uncorrected classic does not. Calibrate against your estimator, your window and your instrument.
- One reading is weak evidence. The 1st–99th percentile band of a corrected 128-bar coin toss runs 0.316 to 0.675. Persistence across bars is what upgrades a reading to a regime.
- Name the window or say nothing. The same series read 0.117 and 0.441 depending on where a slider sat.
- If a tool will not tell you which estimator it runs — corrected or not, which correction, what window — its threshold is uninterpretable, whatever its marketing says.
Try it, and the limits
Everything above is reproducible in the browser: the estimator runs client-side in the interactive sandbox on the Hurst exponent guide, including the exact 320-bar series from the window experiment — drag the window yourself and watch the reading move while the chart does not. The indicator these measurements hardened shipped in v0.7.4, signals-only.
The limits, plainly. Every series here is synthetic — seeded Gaussian increments, chosen so the mechanism is legible, not because they resemble market data; real price series are messier in ways these generators do not model. Rescaled-range is one estimator family; detrended fluctuation analysis exists and carries its own bias profile, which we have not measured here. And nothing on this page predicts anything: these numbers characterise an estimator, not a market, and a regime filter — however well calibrated — is an input to a process, not a strategy.
Frequently asked questions
- Why does the uncorrected estimator read a random walk above 0.5?
- Because the rescaled range of pure noise sits above its asymptotic law at small chunk sizes. Classical R/S fits a straight line through log(R/S) against log(chunk size), and the small chunks — where most of the ladder lives on a short window — drag the slope up. The Anis-Lloyd correction computes what white noise alone would produce at each chunk size, subtracts that slope, and adds back 0.5. On our estimator that recentred a memoryless series on roughly 0.50 at every length we tested.
- Is a Hurst reading above 0.5 evidence the market is trending?
- One reading is weak evidence. Across 20,000 corrected 128-bar random walks — series with no memory at all — the 99th percentile reading was 0.675 and the maximum was 0.826: one run in a hundred prints at or above 0.675. What separates a regime from a fluke in our measurements is persistence: in the synthetic trending regime, 100% of seeds sat above 0.5 at every length we tested. Look for readings that hold across bars, not a single print.
- Which estimator does the Senzoukria indicator use?
- Classical rescaled-range with the Anis-Lloyd small-sample correction. The chunk ladder starts at 8 bars and grows by a factor of 1.5 up to half the window; the regression needs 3 points, and the minimum window is 40 bars. Below that the estimator returns NaN — explicitly no opinion — rather than a number. The estimation code runs client-side in the sandbox on the learn page, so the method is inspectable, not asserted.
- Should I use the textbook 0.5 threshold?
- Not without checking what your estimator reads on a series whose answer you know. Uncorrected R/S put a memoryless series in the high 0.50s on average — with that estimator, a 0.5 threshold classifies noise as trend. Even corrected, the useful cut depends on the window length and the dispersion at that length. A threshold is a property of an estimator plus a window, not of the market, which is also why a tool that hides its estimator has an uninterpretable threshold.
Order Flow on a Prop-Firm Account: What Actually Works on Apex, Topstep and 4PropTrader
The rules, the feeds and the drawdown maths nobody writes about because they trade their own money.
v0.7.6: A Home Dashboard, an Agent Named Sen, and the Live Bar on Its Own Screen
The home screen becomes a dashboard, the assistant gets a name and a hard limit, and the forming bar moves to its own monitor.