Covered Calls Strategy
Hold 100 shares and sell a far out-of-the-money weekly call against them. Take half the credit early; if the price runs to the strike, roll up and out for a credit, or let the shares go and buy them back.
Default settings, 2020 to Nov 4, 2026.
By stock and year
Select a row to chart it below. Shade is the gap to buying and holding that stock.Unhedged: nothing protects against a crash beyond what the strategy itself holds.
| Stock | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 YTD | CAGR | B&H CAGR | Max drawdown |
|---|---|---|---|---|---|---|---|---|---|---|
| +21.5%+6.3 | +29.1%+2.1 | −10.3%+9.2 | +14.7%−9.6 | +18.4%−4.9 | +14.7%−1.7 | +4.6%−7.8 | +12.9% | +13.4% | −30.6% | |
| +38.4%−6.7 | +25.8%−1.0 | −17.7%+15.4 | +30.3%−23.5 | +16.0%−8.8 | +14.6%−5.6 | −3.8%−16.5 | +13.6% | +18.5% | −20.5% | |
| +27.6%+9.1 | +23.3%+10.0 | −10.6%+11.0 | +17.6%+2.5 | +12.6%+2.5 | +13.0%+1.6 | +14.7%−0.7 | +13.7% | +8.2% | −38.5% | |
| +8.4%−109.3 | +24.6%−100.6 | −11.1%+39.2 | +33.8%−205.1 | +54.6%−116.6 | +24.3%−14.6 | −4.1%−4.2 | +17.2% | +65.2% | −25.6% | |
| +88.8%+12.0 | +41.3%+7.5 | −16.0%+10.8 | +35.8%−12.4 | +26.6%−3.4 | +10.4%+1.8 | +17.3%−11.2 | +26.5% | +25.2% | −27.7% | |
| +25.2%+10.0 | +31.1%+4.2 | −10.4%+9.0 | +14.2%−10.0 | +18.1%−5.2 | +14.4%−1.9 | +4.2%−8.2 | +13.4% | +13.4% | −26.6% | |
| +42.8%−2.3 | +26.8%+0.0 | −17.9%+15.1 | +30.0%−23.8 | +16.1%−8.7 | +15.3%−4.9 | −4.3%−17.0 | +14.2% | +18.5% | −20.2% | |
| +33.0%+14.5 | +22.1%+8.8 | −9.2%+12.4 | +16.7%+1.6 | +11.2%+1.1 | +12.9%+1.5 | +13.3%−2.0 | +14.0% | +8.2% | −31.6% | |
| +8.5%−109.3 | +21.1%−104.1 | −10.5%+39.8 | +31.6%−207.4 | +55.9%−115.3 | +28.8%−10.1 | −4.6%−4.7 | +17.2% | +65.2% | −21.4% | |
| +92.1%+15.4 | +37.5%+3.7 | −15.9%+10.9 | +36.8%−11.4 | +26.8%−3.3 | +10.8%+2.2 | +16.0%−12.6 | +26.3% | +25.2% | −22.9% |
Growth of $10,000
Weekly closes on a log scale; the red shade is the strategy's drawdown from its last high. Returns are on the capital the strategy needed at its peak, with interest on idle cash. Hypothetical: how the backtests are made.
Rules · the when / do flow, read-only until you make a copyShow flow
The strategy runs as 2 tracks side by side. Each day, the first rule whose conditions hold in each track acts.
1. Covered call
- K0No shares (start, or called away): buy 100
When:
shares < 100andleg.call.open == 0Do: buy sharesqty 100 - K1Sell the covered call: out of the money, no earnings before expiry
When:
shares >= 100andleg.call.open == 0Do: sell call (as call)qty shares / 100delta call_delta (0.1)dte call_dte (7)dte_min call_dte_min (4)dte_max call_dte_max (10)strike_min spot + 0.001avoid_earnings 1 - K2aHalf the credit kept, but the call is worth under $0.05 with 5 days or less left: let it expire
When:
leg.call.pnl_pct >= take_pctandleg.call.mark < 0.05andleg.call.dte <= 5Do: nothing (hold) - K2aHalf the credit kept: buy the call back
When:
leg.call.pnl_pct >= take_pctDo: close call - K2bAt the strike near expiry: roll up and out for at least roll_min_credit, or let the shares be called
When:
leg.call.dte <= manage_dteandspot >= leg.call.strike or abs(spot - leg.call.strike) / leg.call.strike <= near_bandDo: roll calldte 0dte_min leg.call.dte + 1dte_max roll_max_days - leg.call.chain_agestrike_min leg.call.strikescan strike_descavoid_earnings 1require new.mark > leg.call.mark + roll_min_credit
2. Crash put
A cheap far put under whatever is held; hedge_delta 0 turns it off
- CP1Something is held and no crash put: buy one
When:
hedge_delta > 0andleg.hedge.open == 0andshares >= 100 or book.open > 0Do: buy put (as hedge)qty max(1, round(shares / 100))delta hedge_delta (0)dte hedge_dte (90)dte_min hedge_replace_dte + 7strike_max spot - 0.001strict 1 - CP2Nothing left to protect: sell it
When:
leg.hedge.open == 1andshares < 100andbook.open <= 1Do: close hedge - CP3Down to its last month, or worth hedge_take_x its cost: sell it and buy a fresh one
When:
leg.hedge.open == 1andleg.hedge.dte <= hedge_replace_dte or (hedge_take_x > 0 and leg.hedge.mark >= leg.hedge.cost * hedge_take_x)Do: close hedge; buy put (as hedge)qty max(1, round(shares / 100))delta hedge_delta (0)dte hedge_dte (90)dte_min hedge_replace_dte + 7strike_max spot - 0.001strict 1
Parameters and defaults
Every named number in the rules can be changed in the Rule Builder. These are the defaults the backtest used.
| Parameter | Default |
|---|---|
call_delta | 0.1 |
call_dte | 7 |
call_dte_min | 4 |
call_dte_max | 10 |
take_pct | 50 |
manage_dte | 2 |
near_band | 0.01 |
roll_max_days | 60 |
hedge_delta | 0 |
hedge_dte | 90 |
hedge_replace_dte | 30 |
hedge_take_x | 3 |
roll_min_credit | 0 |
Make a copy to change any of it and run your own backtest.
Trade log · every open, roll, assignment and close for SPYShow trades
Loading…
Hold 100 shares and sell a far out-of-the-money weekly call against them. Take half the credit early; if the price runs to the strike, roll up and out for a credit, or let the shares go and buy them back.
What it is
Hold 100 shares and sell a far out-of-the-money weekly call (about 0.10 delta) against them, avoiding expiries across earnings. Buy the call back at half its credit; if the price runs to the strike near expiry, roll up and out for a credit, or let the shares be called and buy them back.
When to use it
Use it on shares you already hold and would keep anyway, to earn extra income in flat or gently rising markets.
Maximum risk
The downside is the same as owning the shares, less the premium collected. The upside is capped at the call strike for each week, so a fast rally can leave you behind buy-and-hold.
Questions
Why such a low delta (0.10)?
Far calls are rarely tested, so the shares are seldom called away in a rally. The premium is small, but it adds up over 52 weeks.
Why take half the credit early?
Once half the premium is earned, the remaining half pays little for the risk left. Closing early frees the shares for the next call.
What does the earnings filter do?
No call is sold with an earnings report before its expiry, because earnings gaps are when covered calls get run over.