Bull Call Spread

Spread

Buy a lower-strike call and sell a higher-strike call for a net debit.

Performance across all datasets

SymbolReturn %SharpeMax DD %Win %Avg/trade %Trades
SPY-100.8%-0.05+500.0%+42.1%-5.3%19
QQQ+241.8%0.11+443.0%+42.1%+12.7%19
IWM+217.4%0.10+500.0%+47.4%+11.4%19
DIA-191.4%-0.09+600.0%+36.8%-10.1%19
Avg+41.8%0.02+510.7%+42.1%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
Spread width − Debit
Max Loss
Debit paid
Breakeven
Long strike + Debit
Outlook
Moderately bullish

Parameters

ParameterDefaultDescription
long_strike_pct1.02Long call strike (2% OTM)
short_strike_pct1.07Short call strike (7% OTM)
dte45Days to expiration

Methodology

A bull call spread buys an OTM call (102% of spot) and sells a further OTM call (107% of spot) for a net debit. Maximum profit is the spread width minus debit (when underlying closes above the short strike). Maximum loss is the debit paid. The strategy profits in moderately bullish markets with defined risk and capped reward. P&L is expressed as a percentage of the debit paid.

Implementation

# Bull Call Spread: buy K1 call, sell K2 call (K1 < K2)
for entry in monthly_entries:
    S = spot_at_entry
    K1 = round(S * 1.02 / 5) * 5  # buy call (closer to ATM)
    K2 = round(S * 1.07 / 5) * 5  # sell call (further OTM)
    T = 45 / 365.25

    prem_buy  = black_scholes_call(S, K1, T, r, sigma)
    prem_sell = black_scholes_call(S, K2, T, r, sigma)
    debit = prem_buy - prem_sell

    S_exp = spot_at_expiry
    payoff_buy  = max(0, S_exp - K1)
    payoff_sell = max(0, S_exp - K2)
    pnl = payoff_buy - payoff_sell - debit
    pnl_pct = pnl / debit * 100