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:
RSI ≥ Overbought threshold (default 75).
Price is above 20-EMA and has diverged from EMA by X% or z-score > +1 (shows extreme).
IVRank ≥ 40 (preferably) — premium rich.
No scheduled company-specific catalyst / earnings in next 10–14 days.
Liquidity checks pass (OI/volume/spread).
Market breadth or index-level confirmation (optional): e.g., sector index also extended or market internals weak.
Sell put credit spread (bullish spread) when:
RSI ≤ Oversold threshold (default 25).
Price is below 20-EMA and diverged by X% or z-score < −1.
IVRank ≥ 40.
No earnings/catalyst.
Liquidity checks pass.
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.
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
Data: daily OHLCV, option chains (IV, delta, OI, vol rank), earnings calendar.
Precompute RSI14, EMA20, price_zscore, IVRank.
Candidate signals: mark symbols passing entry filters.
Find strikes by target delta or nearest strike and check credit.
Place limit spread order; set automated OCO rules (profit target & stop).
Monitor positions nightly (daily) or intraday loop.
Risk & portfolio checks before adding new trades.
Last updated
Was this helpful?