← All backtests

Iron Condor Strategy

NeutralIncomeThetaRules built-in

Sell a 0.16 Δ put spread and call spread, wings wing_pct apart, at IV Rank 30+. Take half, stop at 2× the credit, out at 21 days; roll a tested side out once for a credit.
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
+11.7%−3.5+29.1%+2.1+14.4%+33.9+14.7%−9.6+14.3%−9.0−10.0%−26.4+3.9%−8.6 +10.8%+13.4%−31.8%
+14.5%−30.6+33.6%+6.7+6.1%+39.2+23.7%−30.1−2.2%−27.1−0.5%−20.7+9.0%−3.6 +11.7%+18.5%−24.8%
+22.7%+4.3+49.0%+35.7+28.1%+49.8+25.7%+10.6+20.0%+9.9−9.9%−21.3+9.3%−6.1 +20.0%+8.2%−31.2%
−1.4%−119.1+1.8%−123.4−2.5%+47.8+9.6%−229.4+1.7%−169.4+20.9%−18.0+7.4%+7.3 +5.2%+65.2%−14.9%
−9.8%−86.5+13.1%−20.7+0.4%+27.2+34.8%−13.4+25.9%−4.2−9.0%−17.6−18.9%−47.5 +3.7%+25.2%−30.5%
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. Iron condor

Four legs managed as one

  1. INSell the condor When: book.open == 0 and iv_rank >= ivr_minDo: sell put (as sput) delta short_delta (0.16) dte dte (45) dte_min dte_min (30) dte_max dte_max (60) avoid_earnings 1 strict 1; buy put (as lput) strike leg.sput.strike - spot * wing_pct strike_max leg.sput.strike - 0.001 expiry leg.sput.expiry strict 1; sell call (as scall) delta short_delta (0.16) strike_min spot expiry leg.sput.expiry strict 1; buy call (as lcall) strike leg.scall.strike + spot * wing_pct strike_min leg.scall.strike + 0.001 expiry leg.sput.expiry strict 1
  2. TPHalf the credit kept: close it all When: book.pnl_pct >= take_pctDo: close sput; close lput; close scall; close lcall
  3. SLLost stop_pct of the credit: close it all When: book.pnl_pct <= -stop_pctDo: close sput; close lput; close scall; close lcall
  4. EXexit_dte left: close it all When: min(leg.sput.dte, leg.scall.dte) <= exit_dteDo: close sput; close lput; close scall; close lcall
  5. RPPut side tested: roll the put spread out for a credit (once) When: spot <= leg.sput.strike * (1 + test_pct)Do: roll sput strike leg.sput.strike dte dte (45) dte_min dte_min (30) dte_max dte_max (60) avoid_earnings 1 require new.mark - mid_put(leg.lput.strike, new.expiry) > leg.sput.mark - leg.lput.mark; roll lput strike leg.lput.strike expiry leg.sput.expiry
  6. RCCall side tested: roll the call spread out for a credit (once) When: spot >= leg.scall.strike * (1 - test_pct)Do: roll scall strike leg.scall.strike dte dte (45) dte_min dte_min (30) dte_max dte_max (60) avoid_earnings 1 require new.mark - mid_call(leg.lcall.strike, new.expiry) > leg.scall.mark - leg.lcall.mark; roll lcall strike leg.lcall.strike expiry leg.scall.expiry
  7. Closed or expired When: book.open == 0Do: nothing (hold)
  8. TPHalf the credit kept: close it all When: book.pnl_pct >= take_pctDo: close sput; close lput; close scall; close lcall
  9. SLLost stop_pct of the credit: close it all When: book.pnl_pct <= -stop_pctDo: close sput; close lput; close scall; close lcall
  10. EPPut side at exit_dte: close it When: leg.sput.open == 1 and leg.sput.dte <= exit_dteDo: close sput; close lput
  11. ECCall side at exit_dte: close it When: leg.scall.open == 1 and leg.scall.dte <= exit_dteDo: close scall; close lcall
  12. All closed 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
short_delta0.16
wing_pct0.05
dte45
dte_min30
dte_max60
ivr_min30
take_pct50
stop_pct200
exit_dte21
test_pct0.01

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…

neutralincome

Sell a 0.16 Δ put spread and call spread, wings wing_pct apart, at IV Rank 30+. Take half, stop at 2× the credit, out at 21 days; roll a tested side out once for a credit.

What it is

Sell a 0.16 delta put spread and a 0.16 delta call spread about 45 days out, wings 5% apart, when IV Rank is 30 or more. Take half the credit, stop at twice the credit, close at 21 days left, and roll a tested side out once for a credit.

When to use it

Use it when you expect a range-bound market and want the income of a short strangle with defined risk on both sides.

Maximum risk

The most you can lose is the width of one spread minus the credit received, because only one side can finish in the money.

Questions

How is an iron condor different from a strangle?

It adds long wings beyond each short strike, so the worst case is capped at the wing width minus the credit, at the cost of a smaller credit.

How much capital does it tie up?

Only the width of one side minus the credit. The backtest counts collateral that way, not as a cash-secured put.

Why roll a tested side only once?

One roll for a credit can buy time; repeated rolls in a trending market usually add risk rather than reduce it.

Related strategies