Sell an ATM straddle and buy OTM wings — maximum profit at the strike, defined risk.
| Symbol | Return % | Sharpe | Max DD % | Win % | Avg/trade % | Trades |
|---|---|---|---|---|---|---|
| SPY | +451.9% | 0.79 | +38.4% | +79.0% | +23.8% | 19 |
| QQQ | +412.5% | 0.71 | +58.0% | +68.4% | +21.7% | 19 |
| IWM | +323.0% | 0.56 | +49.3% | +68.4% | +17.0% | 19 |
| DIA | +352.0% | 0.65 | +44.5% | +79.0% | +18.5% | 19 |
| Avg | +384.8% | 0.68 | +47.5% | +73.7% | — | 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_wing_pct | 0.90 | Long put wing (10% OTM) |
| call_wing_pct | 1.10 | Long call wing (10% OTM) |
| dte | 45 | Days to expiration |
An iron butterfly sells an ATM call and ATM put (short straddle) and buys OTM wings (90% put, 110% call) to cap the risk. It is a tighter version of the iron condor with a higher credit but narrower profit zone. Maximum profit is achieved when the underlying closes exactly at the ATM strike at expiration. The strategy profits in very low-volatility, range-bound markets. Backtested with 45 DTE cycles.
# Iron Butterfly: sell ATM straddle + buy OTM wings
for entry in monthly_entries:
S = spot_at_entry
K_atm = round(S / 5) * 5 # ATM (sell both)
K_pb = round(S * 0.90 / 5) * 5 # buy put wing
K_cb = round(S * 1.10 / 5) * 5 # buy call wing
T = 45 / 365.25
credit = (
black_scholes_call(S, K_atm, T, r, sigma)
+ black_scholes_put(S, K_atm, T, r, sigma)
- black_scholes_put(S, K_pb, T, r, sigma)
- black_scholes_call(S, K_cb, T, r, sigma)
)
S_exp = spot_at_expiry
put_loss = max(0, K_atm - S_exp) - max(0, K_pb - S_exp)
call_loss = max(0, S_exp - K_atm) - max(0, S_exp - K_cb)
pnl = credit - put_loss - call_loss
max_risk = K_atm - K_pb # wing width
pnl_pct = pnl / max_risk * 100