Bull Put Spread

Spread

Sell a higher-strike put and buy a lower-strike put for a net credit.

Performance across all datasets

SymbolReturn %SharpeMax DD %Win %Avg/trade %Trades
SPY+447.7%1.04+68.3%+94.7%+23.6%19
QQQ+541.9%1.04+101.9%+89.5%+28.5%19
IWM+343.6%0.59+155.3%+79.0%+18.1%19
DIA+309.7%0.68+94.8%+89.5%+16.3%19
Avg+410.8%0.84+105.1%+88.2%19
Cumulative P&L % — all symbols

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.

Detail:
Cumulative P&L % — SPY

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.

Risk Profile

Max Profit
Net credit received
Max Loss
Spread width − Credit
Breakeven
Short strike − Credit
Outlook
Neutral to bullish

Parameters

ParameterDefaultDescription
short_strike_pct0.97Short put strike (3% OTM)
long_strike_pct0.92Long put strike (8% OTM)
dte45Days to expiration

Methodology

A bull put spread sells an OTM put (97% of spot) and buys a further OTM put (92% of spot) for a net credit. Maximum profit is the credit received when both puts expire worthless (underlying stays above the short strike). Maximum loss is the spread width minus credit. The strategy profits in neutral-to-bullish markets and has defined risk on both sides. P&L is expressed as a percentage of the spread width.

Implementation

# Bull Put Spread: sell K1 put, buy K2 put (K1 > K2)
for entry in monthly_entries:
    S = spot_at_entry
    K1 = round(S * 0.97 / 5) * 5  # sell put (closer to ATM)
    K2 = round(S * 0.92 / 5) * 5  # buy put (further OTM)
    T = 45 / 365.25

    prem_sell = black_scholes_put(S, K1, T, r, sigma)
    prem_buy  = black_scholes_put(S, K2, T, r, sigma)
    credit = prem_sell - prem_buy

    S_exp = spot_at_expiry
    payoff_sell = max(0, K1 - S_exp)
    payoff_buy  = max(0, K2 - S_exp)
    pnl = credit - payoff_sell + payoff_buy
    pnl_pct = pnl / (K1 - K2) * 100  # % of spread width