RSI-14
For each of the last 14 trading sessions, we split the close-to-close move into a gain or a loss (a down day counts as a zero gain, an up day as a zero loss). We average those 14 gains and 14 losses separately, divide them (avg_gain / avg_loss = RS), then compute 100 − 100/(1+RS). It's one fresh 14-day window with no smoothing carried forward from prior days, and it needs at least 15 closes to produce a value. Source: `backend/app/services/stock_analysis/data_provider.py:956-970` (`_rsi_14`), which sets `snap.rsi_14` at `data_provider.py:499` on a `TickerSnapshot`. That snapshot is upserted into `IntelTickerSnapshot.rsi_14` by `persist_ticker_snapshot()` (`backend/app/services/stock_analysis/service.py:731`), surfaced for display at `backend/app/qtick/services/ticker_service.py:2235`, and mapped to the frontend at `qtick/frontend/src/lib/data/map/technicals.ts:23`.
RSI-14 tells you how stretched the tape is, not whether the fundamentals changed. An extreme reading (above 70 or below 30) sharpens your timing question — does the thesis still hold at this price velocity? A reading above 70 adds friction to a long case (momentum-chasers are already in); below 30 weakens the near-term bear case (the tape is already pricing in the pain). Neither extreme is decisive alone — pair it with volume and the 50/200 MA structure before forming a view.
Above 70: the stock has gained on most of the last two weeks — price is stretched above recent norms, and mean-reversion pressure often builds. Below 30: losses have dominated — the tape is compressed, often a sign of near-term exhaustion of sellers. The 40-60 band is normal drift. QTick labels 55+ "firm," 45- "soft," and uses 70/30 as the outer band cells and 60/40 as the secondary bands (`TraderTape.tsx`).
Fixed 0-100. Theoretical extremes: 0 (every day a loss), 100 (every day a gain, or avg_loss == 0 — the code returns 100.0 in that branch). Practical range: most large-caps oscillate 30-70. Sub-30 and above-70 are the conventionally watched zones. Penny/crypto cohorts use a wider overbought threshold of 75 (vs. 70 for normal stocks) because their tape is noisier — see `tactical_state.py:191-193`.
Our stock-page RSI uses a plain 14-day simple average (`data_provider._rsi_14`), not Wilder's exponential smoothing used in charting platforms and our own tactical engine (`_wilder_rsi` in `tactical_state.py`). The simple version is slightly more reactive and will differ numerically from Bloomberg/TradingView RSI for the same ticker.