Superseded (2026-05-25) — this operator is a Layer-1 transform, not a Layer-0 atomic input. Merged into
compute_rsi_v1. Kept for history.
What (One-liner)
RSI Relative Strength Index, defaults to Wilder's RMA smoothing (matches Bloomberg 1.4e-14), optional Cutler's SMA. Library-level primitive.
How to use
from services.algo.technical import compute_rsi
compute_rsi(prices, period=14) # Wilder default
compute_rsi(prices, period=14, smoothing='sma') # Cutler'sCore 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.
Not applicable: intraday tick, <15 days, sideways whipsaw.
Known limitations
- Wilder vs Cutler difference is significant (do not mix)
- First 14 values 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/ (Wilder) + rsi_cutler/ (SMA), 1e-12 tolerance, passing as of 2026-04-20. After switching default to Wilder in 2026-04-20 PR #20, Bloomberg parity is 1.4e-14.
Changelog
- 1.1.0 (2026-04-20) — Default switched to Wilder's; Cutler's retained as
smoothing='sma'option - 1.0.0 (2026-04-19) — Cutler's SMA initial release

