Cash-Secured Puts Strategy
Sell a weekly 0.30 Δ put. If assigned, sell calls at or above the adjusted cost basis until the shares are called. A cheap 90-day put sits under every short as crash insurance.
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 |
|---|---|---|---|---|---|---|---|---|---|---|
| +9.9%−5.3 | +17.9%−9.0 | −6.4%+13.1 | +13.1%−11.2 | +11.4%−11.9 | +6.8%−9.6 | +10.4%−2.1 | +9.0% | +13.4% | −20.9% | |
| +16.8%−28.3 | +25.4%−1.4 | −3.3%+29.7 | +18.6%−35.2 | +9.7%−15.1 | +8.4%−11.7 | +9.2%−3.4 | +12.1% | +18.5% | −15.4% | |
| +11.2%−7.2 | +43.5%+30.3 | −5.4%+16.2 | +11.8%−3.3 | +12.2%+2.1 | +12.0%+0.6 | +9.3%−6.1 | +13.1% | +8.2% | −33.8% | |
| +5.9%−111.8 | +12.5%−112.7 | −1.5%+48.9 | +25.0%−214.0 | +25.3%−145.9 | +19.7%−19.2 | +10.0%+9.9 | +13.8% | +65.2% | −12.7% | |
| +22.0%−54.7 | +23.8%−10.0 | −3.9%+22.9 | +15.4%−32.8 | +3.4%−26.7 | +0.7%−7.8 | +13.0%−15.6 | +10.4% | +25.2% | −18.9% | |
| +5.7%−9.5 | +12.9%−14.0 | −1.4%+18.1 | +9.2%−15.0 | +9.0%−14.3 | +5.8%−10.5 | +7.7%−4.7 | +7.1% | +13.4% | −5.8% | |
| +10.7%−34.5 | +18.4%−8.4 | +0.2%+33.2 | +12.8%−41.0 | +7.5%−17.4 | +7.8%−12.4 | +6.1%−6.5 | +9.1% | +18.5% | −6.9% | |
| +27.1%+8.7 | +35.9%+22.7 | −3.8%+17.8 | +11.2%−3.9 | +10.1%−0.0 | +10.5%−0.9 | +7.2%−8.2 | +13.7% | +8.2% | −7.3% | |
| +3.2%−114.6 | +8.3%−116.9 | +1.3%+51.6 | +17.2%−221.8 | +16.4%−154.8 | +14.4%−24.4 | +9.4%+9.3 | +10.1% | +65.2% | −9.4% | |
| +14.9%−61.8 | +16.1%−17.8 | −0.8%+26.1 | +11.3%−36.9 | +1.7%−28.4 | +0.1%−8.5 | +9.5%−19.0 | +7.5% | +25.2% | −8.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 4 tracks side by side. Each day, the first rule whose conditions hold in each track acts.
1. Short put
No shares: sell the weekly put, take half, roll for a credit or take the shares
- C0No position: sell the cash-secured put (no earnings before expiry)
When:
shares < 100andleg.put.open == 0andleg.call.open == 0Do: sell put (as put)delta put_delta (0.3)dte dte (7)dte_min dte_min (4)dte_max dte_max (10)avoid_earnings 1 - R1aHalf the credit kept, but the put is worth under $0.05 near expiry: let it expire
When:
leg.put.pnl_pct >= take_pctandleg.put.mark < 0.05andleg.put.dte <= 5Do: nothing (hold) - R1aHalf the credit kept: buy the put back
When:
leg.put.pnl_pct >= take_pctDo: close put - R1bJust in the money near expiry: roll out for roll_min_credit or more, or take the shares
When:
leg.put.dte <= manage_dteandspot < leg.put.strikeand(leg.put.strike - spot) / leg.put.strike <= near_bandDo: roll putdte dte (7)dte_min dte_min (4)dte_max if(roll_max_days > 0, min(dte_max, roll_max_days - leg.put.chain_age), dte_max)strike_max leg.put.strikescan strike_descavoid_earnings 1require new.mark > leg.put.mark + roll_min_credit
2. Covered call
Assigned: calls at or above the adjusted basis until the shares are called
- C2Assigned: sell the call nearest the money, at or above the adjusted cost basis
When:
shares >= 100andleg.call.open == 0andleg.put.open == 0Do: sell call (as call)qty shares / 100strike spotstrike_min adj_basisdte dte (7)dte_min dte_min (4)dte_max dte_max (10)avoid_earnings 1 - R5aHalf the credit kept, but the call is worth under $0.05 near expiry: let it expire
When:
leg.call.pnl_pct >= take_pctandleg.call.mark < 0.05andleg.call.dte <= 5Do: nothing (hold) - R5aHalf the credit kept: buy the call back
When:
leg.call.pnl_pct >= take_pctDo: close call - R5bJust above the strike near expiry: roll up and out for a credit, or let the shares go
When:
leg.call.dte <= manage_dteandspot > leg.call.strikeand(spot - leg.call.strike) / leg.call.strike <= near_bandDo: roll calldte dte (7)dte_min dte_min (4)dte_max dte_max (10)strike_min max(leg.call.strike, adj_basis)strike_max max(leg.call.strike, spot * 1.02)scan strike_descavoid_earnings 1require new.mark > leg.call.mark + roll_min_credit
3. Hedge age
- W2The hedge put is down to its last month: sell it (the hedge track buys a new one if needed)
When:
leg.hedge.dte <= hedge_replace_dteDo: close hedge
4. Hedge put
- W0Something to cover and no hedge: buy a ~90-day 0.10 Δ put below the shorts
When:
hedge_delta > 0andleg.hedge.open == 0andleg.put.open == 1 or (shares >= 100 and leg.call.open == 1)Do: buy put (as hedge)delta hedge_delta (0.1)dte hedge_dte (90)dte_min hedge_replace_dte + 7strike_max min(spot, if(leg.put.open == 1, leg.put.strike, spot), if(leg.call.open == 1, leg.call.strike, spot)) - 0.001strict 1 - W3The hedge fell below 0.05 Δ: swap it for a fresh 0.10 Δ one
When:
hedge_delta > 0andleg.hedge.open == 1andleg.hedge.delta < hedge_min_deltaandleg.hedge.dte > hedge_replace_dteandleg.put.open == 1 or (shares >= 100 and leg.call.open == 1)Do: close hedge; buy put (as hedge)delta hedge_delta (0.1)dte hedge_dte (90)dte_min hedge_replace_dte + 7strike_max min(spot, if(leg.put.open == 1, leg.put.strike, spot), if(leg.call.open == 1, leg.call.strike, spot)) - 0.001strict 1require new.strike != leg.hedge.strike or new.expiry != leg.hedge.expiry
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 |
|---|---|
put_delta | 0.3 |
dte | 7 |
dte_min | 4 |
dte_max | 10 |
take_pct | 50 |
manage_dte | 2 |
near_band | 0.03 |
hedge_delta | 0.1 |
hedge_dte | 90 |
hedge_replace_dte | 30 |
hedge_min_delta | 0.05 |
roll_min_credit | 0 |
roll_max_days | 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…
Sell a weekly 0.30 Δ put. If assigned, sell calls at or above the adjusted cost basis until the shares are called. A cheap 90-day put sits under every short as crash insurance.
What it is
Sell a weekly 0.30 delta put with the cash to buy the shares set aside. Take half the credit early; near expiry, roll a put that is just in the money for a credit or take the shares. Once assigned, sell calls at or above the adjusted cost basis until the shares are called away. A cheap 90-day put sits under every short as crash insurance.
When to use it
Use it to get paid while waiting to buy a stock you would be happy to own at a lower price, with a hedge for the weeks when the market gaps down.
Maximum risk
A cash-secured put carries nearly the full downside of owning the shares from the strike down, less the premium. The hedge put limits losses in sharp crashes but not in slow declines.
Questions
How is this different from the wheel?
It is the wheel with a hedge: a 0.10 delta, 90-day put is held under every short position and replaced when it gets old or too far out of the money.
What is the adjusted cost basis?
The price paid for the shares minus all premium collected since. Calls are sold at or above it so a call-away never locks in a loss.
Why weekly puts?
Short expiries collect premium quickly and avoid most earnings dates. The trade-off is more trades and more frequent tests near the strike.