6.5 KiB
RSIH: Ehlers Hann-Windowed RSI
By replacing Wilder's exponential smoothing with a Hann window, Ehlers produces an RSI that is zero-mean, bounded, and inherently smooth—no supplemental filtering required.
| Property | Value |
|---|---|
| Category | Oscillator |
| Inputs | Source (close) |
| Parameters | period (default 14) |
| Outputs | Single series (Rsih) |
| Output range | [-1, +1] |
| Zero mean | Yes |
| Warmup | period + 1 bars |
| PineScript | rsih.pine |
- RSIH (Hann-Windowed RSI) is a zero-mean relative strength oscillator that uses Hann window coefficients to weight price differences, producing a bounded [-1, +1] output with inherent smoothing.
- Similar: RSI, LRSI, RRSI | Complementary: Moving averages for trend confirmation | Trading note: Zero crossings signal direction changes; ±0.5 levels indicate strong momentum.
- No external validation libraries implement RSIH. Validated through self-consistency and behavioral testing.
RSIH applies Hann window weighting to consecutive price differences, computes separate weighted sums of up-moves (CU) and down-moves (CD), then normalizes as (CU - CD) / (CU + CD). The Hann window provides inherent smoothing that eliminates the need for supplemental filtering, while the normalization produces a zero-mean output bounded to [-1, +1].
Historical Context
The Hann-Windowed RSI was published by John F. Ehlers in the January 2022 issue of Technical Analysis of Stocks & Commodities magazine under the title "(Yet Another) Improved RSI." Ehlers observed that classic RSI suffers from two fundamental issues: (1) Wilder's exponential smoothing introduces lag and spectral leakage, and (2) the 0–100 output range obscures the zero-mean nature of momentum. By replacing the smoothing with a Hann window FIR filter and using a symmetric [-1, +1] normalization, Ehlers created an RSI variant that is both mathematically cleaner and practically more responsive.
Architecture & Physics
RSIH operates as a single-stage FIR filter:
Hann Window Coefficients
The weighting function is precomputed in the constructor:
w(k) = 1 - \cos\left(\frac{2\pi k}{N + 1}\right) \quad \text{for } k = 1, 2, \ldots, N
where N is the period. Note: Ehlers uses (N + 1) in the denominator, not the standard symmetric Hann formula (N - 1).
Weighted CU/CD Accumulation
For each bar, consecutive price differences are weighted by the Hann coefficients:
\text{CU} = \sum_{k=1}^{N} w(k) \cdot \max(\text{Close}_{t-k+1} - \text{Close}_{t-k}, \; 0)
\text{CD} = \sum_{k=1}^{N} w(k) \cdot \max(\text{Close}_{t-k} - \text{Close}_{t-k+1}, \; 0)
Normalization
\text{RSIH}_t = \frac{\text{CU} - \text{CD}}{\text{CU} + \text{CD}}
When \text{CU} + \text{CD} = 0 (flat market), RSIH returns 0.
Implemented with FMA for the coefficient multiplication:
cu = Math.FusedMultiplyAdd(w, diff, cu);
Performance Profile
RSIH is an O(N) FIR filter — each bar requires scanning the full window.
Operation Count (Streaming Mode, Scalar)
| Operation | Count | Cost (cycles) | Subtotal |
|---|---|---|---|
| Hann Window Scan | |||
| SUB (newer - older) | N | 1 | N |
| CMP (diff > 0, diff < 0) | N | 1 | N |
| FMA (w × diff + acc) | N | 4 | 4N |
| Normalization | |||
| ADD (CU + CD) | 1 | 1 | 1 |
| SUB (CU - CD) | 1 | 1 | 1 |
| DIV (ratio) | 1 | 15 | 15 |
| Total | ~6N + 17 cycles |
For default N=14: ~101 cycles per bar.
Dominant cost: FMA loop (4N cycles, ~67%)
Batch Mode (SIMD Analysis)
RSIH is not SIMD-parallelizable across bars because each bar's window overlaps with adjacent bars. However, the inner loop (coefficient × difference accumulation) could potentially benefit from SIMD vectorization within a single bar's computation.
Quality Metrics
| Metric | Score | Notes |
|---|---|---|
| Accuracy | 9/10 | Hann window provides excellent spectral properties |
| Timeliness | 8/10 | FIR filter with minimal lag for oscillator class |
| Overshoot | 9/10 | Bounded [-1, +1] — no possibility of divergence |
| Smoothness | 8/10 | Hann window provides inherent anti-aliasing |
Validation
RSIH is not implemented in mainstream libraries. Validation relies on behavioral testing.
| Library | Status | Notes |
|---|---|---|
| TA-Lib | N/A | Not implemented |
| Skender | N/A | Not implemented |
| Tulip | N/A | Not implemented |
| Ooples | N/A | Not implemented |
| Behavioral | ✅ | Validated: constant→zero, symmetry, mode consistency |
Behavioral Test Summary
- Constant Input → Zero: Constant close → all diffs = 0 → CU = CD = 0 → RSIH = 0
- Output Symmetry: RSIH(ascending) = -RSIH(descending) — output is antisymmetric
- Bounded Output: All outputs in [-1, +1] regardless of input magnitude
- Mode Consistency: Streaming, batch, span, and event-driven modes produce identical results
- Bar Correction: Snapshot/Restore via RingBuffer produces exact rollback
Common Pitfalls
-
Warmup Period: RSIH requires
Period + 1bars to fill the close buffer forPerioddifferences. UseIsHotto detect readiness. -
Hann Window Denominator: Ehlers uses
(period + 1)in the Hann formula, NOT the standard symmetric(period - 1). Using the wrong denominator will produce incorrect coefficients. -
Zero-Mean Output: Unlike classic RSI (0–100), RSIH oscillates around zero with range [-1, +1]. Overbought/oversold levels should be set around ±0.5, not 70/30.
-
FIR Complexity: RSIH is O(N) per bar, not O(1) like IIR indicators. For very large periods, this may impact performance in high-frequency applications.
-
Flat Market Edge Case: When all prices in the window are identical, CU + CD = 0. The implementation returns 0.0 in this case (using an epsilon floor of 1e-10).
-
Period Selection: Ehlers recommends using the dominant cycle period (not half-cycle like classic RSI). Default period of 14 works well for daily charts.
-
Bar Correction: Like all QuanTAlib indicators, RSIH supports bar correction via the
isNewparameter. The RingBufferSnapshot()/Restore()mechanism handles this atomically.