Skip to content

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

python
from services.algo.technical import compute_rsi
compute_rsi(prices, period=14)                       # Wilder default
compute_rsi(prices, period=14, smoothing='sma')      # Cutler's

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.

Not applicable: intraday tick, <15 days, sideways whipsaw.

Known limitations

  1. Wilder vs Cutler difference is significant (do not mix)
  2. First 14 values are NaN
  3. 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

Verifiable intelligence for the decisions that demand scrutiny.