← All backtests

Vertical Spreads by IV Rank

IncomeGrowthThetaRules built-in

IV Rank sets the kind, the 50-day trend the side: at IV Rank ivr_high+ sell a credit spread (bull put above the average, bear call below); at ivr_low or less buy a debit spread (bull call or bear put). Take take_pct, stop credit spreads at 2× the credit and debit spreads at half the debit, out at 21 days.
Default settings, 2020 to Nov 4, 2026.

By stock and year

Select a row to chart it below. Shade is the gap to buying and holding that stock.

Defined risk by design: the long options in the structure cap the loss, so there is no separate hedged version.

Stock2020202120222023202420252026 YTDCAGRB&H CAGRMax drawdown
+5.9%−9.3+18.1%−8.8−32.2%−12.7+4.2%−20.1−11.6%−34.9+32.3%+16.0+0.8%−11.6 +0.6%+13.4%−55.0%
+56.1%+11.0−15.1%−41.9+1.6%+34.7+25.0%−28.8+1.8%−23.1+32.9%+12.7+13.6%+1.0 +14.8%+18.5%−45.7%
+8.8%−9.7−14.9%−28.1−0.5%+21.1−6.4%−21.5−38.4%−48.5−17.6%−29.0+16.4%+1.0 −9.4%+8.2%−62.8%
−0.2%−117.9−1.6%−126.8−3.3%+47.0+2.8%−236.2−5.8%−177.0−15.8%−54.7−30.1%−30.2 −8.6%+65.2%−47.9%
+6.9%−69.9−0.3%−34.1−20.7%+6.1+26.2%−22.0+38.6%+8.5−5.7%−14.3−36.6%−65.1 −1.8%+25.2%−53.9%
Gap to buy and hold: behind ahead · option prices before Feb 2024 are modelled, real quotes after

Growth of $10,000

Weekly closes on a log scale; the red shade is the strategy's drawdown from its last high. Returns are on the capital the strategy needed at its peak, with interest on idle cash. Hypothetical: how the backtests are made.

Rules · the when / do flow, read-only until you make a copy
Show flow

The strategy runs as 1 track side by side. Each day, the first rule whose conditions hold in each track acts.

1. Vertical

  1. BPHigh IV, uptrend: sell a bull put spread When: book.open == 0 and iv_rank >= ivr_high and spot > sma(trend_days)Do: sell put (as short) delta short_delta (0.3) dte dte (45) dte_min dte_min (30) dte_max dte_max (60) avoid_earnings 1 strict 1; buy put (as long) strike leg.short.strike - spot * width_pct strike_max leg.short.strike - 0.001 expiry leg.short.expiry strict 1
  2. BCHigh IV, downtrend: sell a bear call spread When: book.open == 0 and iv_rank >= ivr_high and spot <= sma(trend_days)Do: sell call (as short) delta short_delta (0.3) dte dte (45) dte_min dte_min (30) dte_max dte_max (60) avoid_earnings 1 strict 1; buy call (as long) strike leg.short.strike + spot * width_pct strike_min leg.short.strike + 0.001 expiry leg.short.expiry strict 1
  3. DCLow IV, uptrend: buy a bull call spread When: book.open == 0 and iv_rank <= ivr_low and spot > sma(trend_days)Do: buy call (as long) delta long_delta (0.5) dte dte (45) dte_min dte_min (30) dte_max dte_max (60) avoid_earnings 1 strict 1; sell call (as short) strike leg.long.strike + spot * width_pct strike_min leg.long.strike + 0.001 expiry leg.long.expiry strict 1
  4. DPLow IV, downtrend: buy a bear put spread When: book.open == 0 and iv_rank <= ivr_low and spot <= sma(trend_days)Do: buy put (as long) delta long_delta (0.5) dte dte (45) dte_min dte_min (30) dte_max dte_max (60) avoid_earnings 1 strict 1; sell put (as short) strike leg.long.strike - spot * width_pct strike_max leg.long.strike - 0.001 expiry leg.long.expiry strict 1
  5. TPtake_pct made: close When: book.pnl_pct >= take_pctDo: close short; close long
  6. SCCredit spread lost stop_credit of the credit: close When: book.credit > 0 and book.pnl_pct <= -stop_creditDo: close short; close long
  7. SDDebit spread lost stop_debit of the debit: close When: book.credit < 0 and book.pnl_pct <= -stop_debitDo: close short; close long
  8. EXexit_dte left: close When: leg.short.dte <= exit_dteDo: close short; close long
  9. Closed or expired When: book.open == 0Do: nothing (hold)

Parameters and defaults

Every named number in the rules can be changed in the Rule Builder. These are the defaults the backtest used.

ParameterDefault
trend_days50
ivr_high50
ivr_low30
short_delta0.3
long_delta0.5
width_pct0.03
dte45
dte_min30
dte_max60
take_pct50
stop_credit200
stop_debit50
exit_dte21

Make a copy to change any of it and run your own backtest.

Trade log · every open, roll, assignment and close for SPY
Show trades

Loading…

incomegrowth

IV Rank sets the kind, the 50-day trend the side: at IV Rank ivr_high+ sell a credit spread (bull put above the average, bear call below); at ivr_low or less buy a debit spread (bull call or bear put). Take take_pct, stop credit spreads at 2× the credit and debit spreads at half the debit, out at 21 days.

What it is

One strategy that picks its spread from implied volatility and the trend. When IV Rank is 50 or more it sells a credit spread about 45 days out (a bull put spread above the 50-day average, a bear call spread below it). When IV Rank is 30 or less it buys a debit spread instead (a bull call or bear put spread). It takes half the credit or half the debit as profit, stops credit spreads at twice the credit and debit spreads at half the debit, and closes at 21 days left.

When to use it

Use it when you want a directional spread but let the price of options decide whether to sell them (rich IV) or buy them (cheap IV). Between the two IV levels it stays out.

Maximum risk

Every trade is a vertical spread, so the most it can lose is the spread's width less the credit (credit spreads) or the debit paid (debit spreads).

Questions

Why sell when IV is high and buy when it is low?

Options are priced off implied volatility. When IV Rank is high, the premium you collect is rich compared with its own history; when it is low, buying is cheap. The strategy only trades in those two zones.

How does it pick the direction?

The 50-day moving average: above it, bullish spreads (bull put or bull call); below it, bearish ones (bear call or bear put).

Why do the stops differ?

A credit spread risks more than it collects, so it stops at twice the credit. A debit spread's whole risk is the debit, so it stops at half of it.

Related strategies