Iron Butterfly

Neutral

Sell an ATM straddle and buy OTM wings — maximum profit at the strike, defined risk.

Performance across all datasets

SymbolReturn %SharpeMax DD %Win %Avg/trade %Trades
SPY-395.1%-0.63+450.1%+36.8%-20.8%19
QQQ-621.7%-1.08+635.8%+21.1%-32.7%19
IWM-515.3%-0.84+542.0%+31.6%-27.1%19
DIA-393.7%-0.79+381.5%+21.1%-20.7%19
Avg-481.4%-0.83+502.4%+27.6%19
Cumulative P&L % — all symbols
Detail:
Cumulative P&L % — SPY

Risk Profile

Max Profit
Net credit (underlying at ATM strike)
Max Loss
Wing width − Credit
Breakeven
ATM ± Credit
Outlook
Very neutral (pinned to strike)

Parameters

ParameterDefaultDescription
put_wing_pct0.90Long put wing (10% OTM)
call_wing_pct1.10Long call wing (10% OTM)
dte45Days to expiration

Methodology

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.

Implementation

# 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