← All backtests

Cash-Secured Puts Strategy

IncomeThetaRules built-in

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.

Stock2020202120222023202420252026 YTDCAGRB&H CAGRMax 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%
Gap to buy and hold: behind ahead · option prices before Feb 2024 are modelled, real quotes after

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 copy
Show 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

  1. C0No position: sell the cash-secured put (no earnings before expiry) When: shares < 100 and leg.put.open == 0 and leg.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
  2. R1aHalf the credit kept, but the put is worth under $0.05 near expiry: let it expire When: leg.put.pnl_pct >= take_pct and leg.put.mark < 0.05 and leg.put.dte <= 5Do: nothing (hold)
  3. R1aHalf the credit kept: buy the put back When: leg.put.pnl_pct >= take_pctDo: close put
  4. R1bJust in the money near expiry: roll out for roll_min_credit or more, or take the shares When: leg.put.dte <= manage_dte and spot < leg.put.strike and (leg.put.strike - spot) / leg.put.strike <= near_bandDo: roll put dte 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.strike scan strike_desc avoid_earnings 1 require new.mark > leg.put.mark + roll_min_credit

2. Covered call

Assigned: calls at or above the adjusted basis until the shares are called

  1. C2Assigned: sell the call nearest the money, at or above the adjusted cost basis When: shares >= 100 and leg.call.open == 0 and leg.put.open == 0Do: sell call (as call) qty shares / 100 strike spot strike_min adj_basis dte dte (7) dte_min dte_min (4) dte_max dte_max (10) avoid_earnings 1
  2. R5aHalf the credit kept, but the call is worth under $0.05 near expiry: let it expire When: leg.call.pnl_pct >= take_pct and leg.call.mark < 0.05 and leg.call.dte <= 5Do: nothing (hold)
  3. R5aHalf the credit kept: buy the call back When: leg.call.pnl_pct >= take_pctDo: close call
  4. R5bJust above the strike near expiry: roll up and out for a credit, or let the shares go When: leg.call.dte <= manage_dte and spot > leg.call.strike and (spot - leg.call.strike) / leg.call.strike <= near_bandDo: roll call dte 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_desc avoid_earnings 1 require new.mark > leg.call.mark + roll_min_credit

3. Hedge age

  1. 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

  1. W0Something to cover and no hedge: buy a ~90-day 0.10 Δ put below the shorts When: hedge_delta > 0 and leg.hedge.open == 0 and leg.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 + 7 strike_max min(spot, if(leg.put.open == 1, leg.put.strike, spot), if(leg.call.open == 1, leg.call.strike, spot)) - 0.001 strict 1
  2. W3The hedge fell below 0.05 Δ: swap it for a fresh 0.10 Δ one When: hedge_delta > 0 and leg.hedge.open == 1 and leg.hedge.delta < hedge_min_delta and leg.hedge.dte > hedge_replace_dte and leg.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 + 7 strike_max min(spot, if(leg.put.open == 1, leg.put.strike, spot), if(leg.call.open == 1, leg.call.strike, spot)) - 0.001 strict 1 require 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.

ParameterDefault
put_delta0.3
dte7
dte_min4
dte_max10
take_pct50
manage_dte2
near_band0.03
hedge_delta0.1
hedge_dte90
hedge_replace_dte30
hedge_min_delta0.05
roll_min_credit0
roll_max_days0

Make a copy to change any of it and run your own backtest.

Trade log · every open, roll, assignment and close for SPY
Show trades

Loading…

income

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.

Related strategies