A statistical transform that reshapes bounded price position into a sharper, near-Gaussian oscillator.
The Fisher Transform is a momentum oscillator introduced to trading by John Ehlers. It applies a genuine statistical function — the inverse hyperbolic tangent, 0.5 × ln((1 + x) / (1 − x)) — to a normalized measure of where price sits within its recent range. The idea is that raw price position is bounded and its distribution is compressed near the extremes; the Fisher Transform stretches those extremes out so that the resulting series looks closer to a normal (Gaussian) distribution, with sharp, well-defined turning points instead of the rounded tops and bottoms typical of smoothed oscillators. It is plotted in a separate pane, usually with a one-bar-delayed copy of itself as a trigger line. Important honesty note: the transform makes the indicator's values approximately normal, not the market — price returns famously have fat tails, and the normality assumption is weakest exactly when markets move violently. The Fisher Transform describes recent price position; it predicts nothing. Educational content only, not financial advice; trading involves risk of loss.
The calculation has three stages. First, normalize price position: take a source (Ehlers used the bar midpoint, hl2) and locate it within the highest and lowest source values over a lookback window (commonly 9-10 bars), rescaled to the range −1 to +1. Second, smooth that raw position with a light recursive filter (the classic coefficients are 0.66 on the new value and 0.33 on the previous smoothed value, often written 0.67 in code) and clamp it just inside ±1 — the clamp matters, because the transform goes to infinity at exactly ±1. Third, apply the Fisher Transform itself, 0.5 × ln((1 + x) / (1 − x)), and smooth the output with another light recursive average. The logarithmic stretch is what gives the indicator its character: small changes in position near the middle of the range barely move the output, while the same changes near the extremes move it a lot. That is why Fisher Transform peaks look sharp and 'spiky' compared with RSI or stochastics. The output is unbounded in principle, though in practice most readings fall roughly between −3 and +3, and the one-bar-lagged trigger line turns crossovers into discrete events.
Typical length is 9 or 10 bars applied to hl2 (the bar midpoint), with the trigger line as the Fisher value delayed one bar. Shorter lengths make the normalization window tighter and the output far more jumpy; longer lengths (20+) smooth the position estimate but delay everything. The smoothing coefficients (0.66/0.33-style) are Ehlers' conventions and are hard-coded in most implementations. As with any oscillator, changing length or source changes every reading, so state your settings when comparing results.
//@version=6
indicator("Fisher Transform Example", overlay = false)
length = input.int(9, "Length", minval = 1)
src = input.source(hl2, "Source")
hi = ta.highest(src, length)
lo = ta.lowest(src, length)
rng = math.max(hi - lo, syminfo.mintick)
// Smoothed price position in [-1, 1], clamped away from the poles
value = 0.0
value := 0.66 * ((src - lo) / rng - 0.5) + 0.67 * nz(value[1])
value := math.min(math.max(value, -0.999), 0.999)
// Fisher Transform with light output smoothing
fish = 0.0
fish := 0.5 * math.log((1 + value) / (1 - value)) + 0.5 * nz(fish[1])
plot(fish, "Fisher", color = color.blue)
plot(fish[1], "Trigger", color = color.orange)
hline(0, "Zero", color = color.gray)Pro tip: Plot the Fisher Transform next to a plain stochastic of the same length and source. You will see they turn at essentially the same bars — the transform changes the shape and scale of the extremes, not the timing of the information. That comparison keeps expectations honest: the statistics are real, the foresight is not. Educational only, not financial advice; all trading carries risk of loss.
Educational only — not financial advice, not a recommendation to trade. No indicator is predictive; trading involves substantial risk of loss.