Sell an OTM put spread and OTM call spread simultaneously for a net credit.
| Symbol | Return % | Sharpe | Max DD % | Win % | Avg/trade % | Trades |
|---|---|---|---|---|---|---|
| SPY | +575.4% | 0.99 | +49.4% | +84.2% | +30.3% | 19 |
| QQQ | +589.7% | 0.78 | +65.2% | +68.4% | +31.0% | 19 |
| IWM | +507.5% | 0.81 | +44.1% | +73.7% | +26.7% | 19 |
| DIA | +409.1% | 0.73 | +62.5% | +84.2% | +21.5% | 19 |
| Avg | +520.4% | 0.83 | +55.3% | +77.6% | — | 19 |
What this shows: Overlayed cumulative return series for this strategy across all available symbols.
How to read it: Look for symbols with smoother curves and faster recoveries to assess whether performance is broad-based or driven by a few outliers.
What this shows: Single-symbol cumulative return path for SPY.
How to read it: Use this detailed view to inspect entry/exit behavior over time and whether drawdowns cluster in specific periods.
| Parameter | Default | Description |
|---|---|---|
| put_short_pct | 0.95 | Short put strike (5% OTM) |
| put_long_pct | 0.90 | Long put wing (10% OTM) |
| call_short_pct | 1.05 | Short call strike (5% OTM) |
| call_long_pct | 1.10 | Long call wing (10% OTM) |
| dte | 45 | Days to expiration |
An iron condor combines a bull put spread and a bear call spread. It sells a 95% put, buys a 90% put, sells a 105% call, and buys a 110% call — all at the same expiration. The net credit is the maximum profit, achieved when the underlying stays between the two short strikes. Maximum loss is the wider spread width minus credit. It is the classic range-bound, high-probability income strategy. Backtested with 45 DTE cycles.
# Iron Condor: sell put spread + sell call spread
for entry in monthly_entries:
S = spot_at_entry
K_ps = round(S * 0.95 / 5) * 5 # sell put
K_pb = round(S * 0.90 / 5) * 5 # buy put (wing)
K_cs = round(S * 1.05 / 5) * 5 # sell call
K_cb = round(S * 1.10 / 5) * 5 # buy call (wing)
T = 45 / 365.25
credit = (
black_scholes_put(S, K_ps, T, r, sigma)
- black_scholes_put(S, K_pb, T, r, sigma)
+ black_scholes_call(S, K_cs, T, r, sigma)
- black_scholes_call(S, K_cb, T, r, sigma)
)
S_exp = spot_at_expiry
put_loss = max(0, K_ps - S_exp) - max(0, K_pb - S_exp)
call_loss = max(0, S_exp - K_cs) - max(0, S_exp - K_cb)
pnl = credit - put_loss - call_loss
max_risk = max(K_ps - K_pb, K_cb - K_cs)
pnl_pct = pnl / max_risk * 100