RSI (Relative Strength Index)
Relative Strength Index with Wilder smoothing by default (Cutler/SMA opt-in). Cross-validated against pandas-ta and Bloomberg to 1.4e-14. Edge-first on an upstream close series. Wired to more than one Price Factor, it fans out to per-ticker by_symbol results.
What (One-liner)
A Layer-1 transform: consume an upstream close series, emit the RSI series. Wilder's RMA is the default (matches Bloomberg 1.4e-14); Cutler's SMA is smoothing = 'sma'.
Inputs
period(number, optional) — lookback, default 14.smoothing(string, optional) —'wilder'(Bloomberg, default) or'sma'(Cutler).
Outputs
rsi— RSI series aligned to the input, in [0, 100].by_symbol— per-ticker map when fed by multiple Price Factors.
How to use
- Upstream
price_factorprovides the close series. - Set
period(default 14). - Choose
smoothing = 'wilder'(default) or'sma'(Cutler).
Core formulas
delta = prices.diff()
pos = delta.clip(lower=0); neg = (-delta).clip(lower=0)
# Wilder (default, Bloomberg parity):
gain = pos.ewm(alpha=1/14, adjust=False, min_periods=14).mean()
loss = neg.ewm(alpha=1/14, adjust=False, min_periods=14).mean()
# Cutler's (opt-in):
gain = pos.rolling(14).mean()
loss = neg.rolling(14).mean()
rs = gain / loss
rsi = 100 - 100 / (1 + rs)Assumptions & applicability
Assumptions: Wilder's is canonical (default for most terminals + TradingView) + divide-by-zero → 100 + first period values are NaN.
Applicability: overbought/oversold, divergence, momentum feature; equities / fx / crypto / commodities, global, daily–monthly, min 15 observations.
Not applicable: intraday tick, <15 days, sideways whipsaw.
Known limitations
- Single-indicator momentum gauge — not a standalone signal.
- Wilder vs Cutler difference is significant (do not mix); keep the choice consistent across a graph.
- First
periodvalues are NaN. - Gaps / trading halts require caller pre-processing.
References
Wilder (1978) original + Cutler (1991) variant. See frontmatter for details.
Golden Test
tests/golden/fixtures/tier1/rsi/, 1e-12 tolerance, passing as of 2026-05-25. Reference: pandas EWM(alpha=1/N, adjust=False) + pandas-ta cross-check; Bloomberg parity 1.4e-14.
Changelog
- 1.1.0 (2026-05-25) — Promoted to Active as Layer-1 transform; merged rich governance fields from the superseded Layer-0
rsicard. - 1.0.0 (2026-05-23) — Initial edge-first Layer-1 Draft card.

