RSI Mean Reversion Credit Spreads

RSI Mean-Reversion — Short Spreads (overview)

When an instrument becomes overbought (high RSI) or oversold (low RSI) AND other filters agree (price vs moving average, volatility context, liquidity), we will sell defined-risk credit spreads that profit from mean reversion (RSI returning toward neutral).


Strategy components (defaults you can tune)

  • Universe: liquid index & ETFs (e.g., SPX/SPY, QQQ, IWM) or highly liquid single names.

  • Bar timeframe: 15-min intraday or daily (choose one per implementation). Defaults below assume daily (smoother signals); I’ll note intraday adjustments.

  • RSI: Period = 14 (alt: 9 or 21 for faster/slower). Use Wilder-style RSI.

  • RSI thresholds:

    • Overbought: RSI ≥ 75 (aggressive) / 70 (standard).

    • Oversold: RSI ≤ 25 (aggressive) / 30 (standard).

  • Price trend filter: 20-period EMA (daily) — check how far price is from EMA (z-score or %).

  • Volatility filter: IV Rank / IV Percentile over last 252 trading days. Prefer IVRank ≥ 40–50 to sell premium (you get richer premium).

  • Liquidity: min option open interest & volume (e.g., OI ≥ 200, volume ≥ 50), bid-ask spread < 0.25×midpoint (or spread < $0.50 on index options).

  • Strike selection: target short option delta ~0.10–0.30 (conservative 0.10–0.20). Long leg width 5–20 strikes (or set width to risk budget).

  • DTE: 20–60 days to expiry (avoid < 10 DTE unless you have special intraday rules). For intraday implementation use 5–20 hours.

  • Position sizing: risk-per-trade 1–2% of account equity (max), or use volatility-adjusted sizing (notional / ATR).

  • Max concurrent trades: e.g., 3–6 depending on capital.


Entry Criteria (all must be checked — logical ANDs and ORs shown)

Primary directional decision:

  • Sell call credit spread (bearish spread) when:

    1. RSI ≥ Overbought threshold (default 75).

    2. Price is above 20-EMA and has diverged from EMA by X% or z-score > +1 (shows extreme).

    3. IVRank ≥ 40 (preferably) — premium rich.

    4. No scheduled company-specific catalyst / earnings in next 10–14 days.

    5. Liquidity checks pass (OI/volume/spread).

    6. Market breadth or index-level confirmation (optional): e.g., sector index also extended or market internals weak.

  • Sell put credit spread (bullish spread) when:

    1. RSI ≤ Oversold threshold (default 25).

    2. Price is below 20-EMA and diverged by X% or z-score < −1.

    3. IVRank ≥ 40.

    4. No earnings/catalyst.

    5. Liquidity checks pass.

    6. Market breadth/sector confirmation supports mean reversion.

Additional optional confirmation (useful to avoid false signals):

  • RSI divergence: price makes new low but RSI does not (bullish divergence) before selling put spread; or price makes new high but RSI fails to confirm (bearish divergence) before selling call spread.

  • Candlestick rejection: e.g., rejection wick away from extremes, hammer/shooting star on daily timeframe.

  • Volume confirmation: extreme RSI accompanied by declining volume on the extreme move can help.

Entry execution:

  • Prefer selling one-lot initially, scale if mean reversion begins and risk allows.

  • Use limit orders for spreads at a target credit (e.g., 40–60% of theoretical mid) to avoid poor fills.


Exit Criteria (prioritize — execute as soon as any rule triggers)

A. Profit targets

  • First target: 30–50% of max possible premium collected (common).

  • Conservative: close at 25–30% early to lock profits; scale out (close half @ 30–40%, rest @ 50%).

B. Stop-loss / Hard exit

  • Close if the position loses max_loss_per_trade (e.g., 50–100% of collected premium equivalent to X% account risk). Alternatively:

    • If short strike breached by ≤ 0.25 × width (i.e., underlying moves near/through short strike) — tighten and consider closing/rolling.

    • If loss reaches max_dollar_loss (e.g., 1–2% of equity) close trade.

C. Time-based exits

  • If remaining DTE ≤ 7 days, consider closing to avoid gamma/assignment risk (unless position is comfortable and hedged).

  • If days-in-trade > threshold (e.g., you planned 30 DTE and now 5 DTE left) close or manage.

D. IV & volatility exits

  • If IV spikes suddenly (IVRank jump +20 pts), consider closing/hedging (short spreads hurt from IV spike).

  • If realized volatility > expected and underlying moves strongly against you, cut losses.

E. Price action exit

  • If price closes beyond long leg (i.e., spread is in the money and close to max loss) — consider closing or rolling.

F. Roll rules

  • If trade moves against you but you still believe in mean reversion and maximum risk budget allows:

    • Roll down/up (add credit) to widen spread, or roll to later expiry for debit — but only if roll reduces risk or results in acceptable new R/R. Keep roll count limited (e.g., max 1–2 rolls).

  • If underlying breaks structural support/resistance or a new trend emerges, avoid rolling — exit.

G. Portfolio-level risk kill-switch

  • If portfolio loss in a day > X% (e.g., 3–5% equity), close new entries or close most risk to preserve capital.


Risk Management & Position Sizing

  • Use fixed % of equity per trade (1–2% risk per trade). Calculate dollar risk = (width of spread − credit received) × contract size × #contracts.

  • Limit total margin exposure to e.g., 10–15% of equity.

  • Correlation control: avoid concentrated exposure to same sector/direction; control portfolio delta near neutral.

  • Max simultaneous losers: e.g., if 3 trades lose beyond stop, pause strategy for the day.

  • Use alerts & automated order cancels for expiries/assignments.


Pseudocode (high-level)

for each tradable_symbol in universe:
  if not passes_liquidity(tradable_symbol): continue
  compute RSI14, EMA20, price_zscore, IVRank, days_to_earnings

  if days_to_earnings <= 14: skip

  if RSI >= RSI_overbought:
    if price_above_EMA and price_zscore >= Z_high and IVRank >= IV_min:
      short_leg = find_strike(delta=target_short_delta_call)
      long_leg = short_leg + width    # credit_spread
      if spread_liquid_and_credit_acceptable:
        enter_call_credit_spread(symbol, short_leg, long_leg, contracts_per_risk)

  if RSI <= RSI_oversold:
    if price_below_EMA and price_zscore <= Z_low and IVRank >= IV_min:
      short_leg = find_strike(delta=target_short_delta_put)
      long_leg = short_leg - width
      enter_put_credit_spread(...)

# Manage open positions every bar:
for each open_position:
  if profit >= profit_target_pct * max_profit: close_position()
  if loss >= loss_stop_pct * max_loss: close_position()
  if imminent_expiry or IV_spike or price_touch_long_leg: close_position_or_roll()
  enforce_portfolio_risk_kill_switches()

Decision Matrix Diagram (simple, actionable)

Below is a compact decision table you can implement as a hard rule-check before order placement.

Condition
RSI ≥ 75
RSI 70–75 (weak)
RSI 30–70 (neutral)
RSI 25–30 (weak oversold)
RSI ≤ 25

Price vs 20EMA

Above by > Z_high

Above moderately

Around EMA

Below moderately

Below by > Z_high

IVRank ≥ 40

SELL CALL SPREAD (if price & liquidity OK)

Consider small size / skip

NO TRADE

Consider small PUT spread only w/ divergence

SELL PUT SPREAD

IVRank < 40

Consider skipping (premium poor)

Skip

NO TRADE

Skip

Avoid (premium poor)

Earnings within 14d

Abort / Skip

Skip

Skip

Skip

Skip

Liquidity fail

Abort

Abort

Abort

Abort

Abort

Interpretation:

  • Bold cell indicates primary action. Weak ranges (70–75 or 25–30) may be allowed only if divergence / candlestick rejection / extra confirmation present and position size reduced.

(If you prefer a graphical flowchart I can render a mermaid flowchart or canvas.)


Example (hypothetical trade)

  • Underlying: XYZ at $100, RSI14 = 78, price = $106 (EMA20 = $98), price_zscore = +1.4, IVRank = 65, no earnings.

  • Action: Sell 30-delta call credit spread: Short 1x 110 call, Long 1x 115 call (width $5). Credit received = $1.10.

  • Max risk = $5 − $1.10 = $3.90 × 100 = $390.

  • Profit target = 40% of max profit (max profit = $110) → target ≈ $44 (close when spread value ≤ $66).

  • Stop loss = 100% of premium or when spread value ≥ $330 (or price closes above short strike by > $1.50 for 2 consecutive days).


Backtest & eval checklist

  • Backtest on daily & intraday (15m) separately.

  • Metrics: Annualized return, Sharpe, Sortino, max drawdown, win rate, average win/loss, return per unit of risk (e.g., return per max drawdown), avg days per trade, roll frequency, commissions/fees impact, slippage.

  • Examine behavior across regimes (2008-like vol spike, 2017 low vol, 2020 pandemic) — short premium strategies behave differently in regime shifts.

  • Include transaction costs, realistic fills (mid vs. bid/ask), and worst-case slippage scenarios.

  • Forward-test (paper) live for at least 3 months and compare PnL drivers (IV changes vs. delta moves).


Implementation notes & practical tips

  • Prefer automated entry/exit (API) with limit orders and pre-programmed stop/targets to avoid emotional errors.

  • Use monitoring for IVRank & earnings calendar (automation to screen earnings prevents large losses).

  • For intraday you can compress RSI period (9) and reduce DTE to same day or next-day options; increase profit targets because activity is noisier.

  • Keep a log of every trade reason-code (which filter tripped) for later analysis.

  • Consider hedging portfolio-level tail risk with a small allocation to long-dated puts or buying cheap protection when IV is very low and risk of crash increases.


Quick implementation checklist

  1. Data: daily OHLCV, option chains (IV, delta, OI, vol rank), earnings calendar.

  2. Precompute RSI14, EMA20, price_zscore, IVRank.

  3. Candidate signals: mark symbols passing entry filters.

  4. Find strikes by target delta or nearest strike and check credit.

  5. Place limit spread order; set automated OCO rules (profit target & stop).

  6. Monitor positions nightly (daily) or intraday loop.

  7. Risk & portfolio checks before adding new trades.


Last updated

Was this helpful?