Sell an ATM straddle and buy OTM wings — maximum profit at the strike, defined risk.
| 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| Symbol | Return % | Sharpe | Max DD % | Win % | Avg/trade % | Trades |
|---|---|---|---|---|---|---|
| SPY | -317.6% | -0.60 | +316.6% | +31.6% | -16.7% | 19 |
| QQQ | -375.7% | -0.66 | +438.5% | +31.6% | -19.8% | 19 |
| IWM | -646.9% | -1.07 | +631.0% | +21.1% | -34.0% | 19 |
| DIA | -197.2% | -0.35 | +212.8% | +42.1% | -10.4% | 19 |
| Avg | -384.3% | -0.67 | +399.8% | +31.6% | — | 19 |