Three ways to run the same position
Monthly, rolling continuously, or laddered across several rungs.
The strategy so far is one put a month, closed at half its maximum profit,
then a wait until the next cycle. That wait is doing nothing, which invites
two obvious questions: why not sell the next put immediately, and why open
the whole position on one day at all.
| Doing it this way | Growth added | Deepest fall | Sharpe | Trades | Start-date luck removed |
| Once a month, then waitthe baseline every other figure on this site is measured on | +1.23 pts | −58.4% | 0.615 | 359 | — |
| Roll straight back ina new put the same session the old one closes | +2.13 pts | −61.9% | 0.624 | 712 | 90% |
| Laddered, six rungsthe same notional opened in six pieces across the cycle | +1.23 pts | −58.4% | 0.617 | 2,151 | 76% |
Rolling straight back in wins on every column in that table. It
adds 0.91 points of growth for 3.46 points of extra
drawdown, its Sharpe is indistinguishable rather than worse, and it removes more of
the start-date luck than laddering does.
What cost does to it
Rolling trades about twice as often, so the obvious objection is that it
pays the spread twice as often. Twice the trades at the same cost per
trade sounds like it should settle the question by arithmetic alone.
A short straddle is the wrong thing to reason from. There the
premium is the entire return, so a proportional haircut takes all
of it. Here the return is mostly index exposure with premium as an
increment on top, and the same haircut bites far less. Trade count alone
does not carry the result across, so it is swept, one run per level:
| Round-trip cost, as a share of premium | 0% | 0.5% | 1% | 2% | 4% |
| Once a month | +1.23 | +1.19 | +1.16 | +1.09 | +0.96 |
| Rolling | +2.13 | +2.07 | +2.01 | +1.89 | +1.64 |
| Laddered | +1.23 | +1.20 | +1.17 | +1.10 | +0.97 |
At 2% rolling nets +1.89 points, and it keeps
beating the monthly version until a round-trip cost of about
16% of premium. Its own edge does not reach zero
until 17%, against 19% for
monthly. Real round-trip costs on liquid index options are a few percent.
Cost is not what rules rolling out.
What should still give you pause is the model, not the friction.
The backtest hands every entry a contract exactly 30 days out on any
session it likes. Real chains list monthly expiries 28 to 35 days apart.
The monthly version re-enters on a fixed grid and would meet roughly the
same chain each cycle; rolling re-enters on whatever day its target
happened to hit, so in practice it would repeatedly take the wrong tenor
or wait, and waiting is the one thing it is defined by not doing.
Its figures are an upper bound, and by an amount this backtest cannot
measure.
Laddering is the one that changes something real without that
caveat. Opening the same notional in pieces across the cycle changes
neither the return nor the drawdown: both move by less than a hundredth of
a point across every size tested. It changes one thing, which is how much
your result depends on the day you happened to start. Two rungs removes
28% of that, six removes 76%, and after six the curve
is flat.
Note what that is not. It is not a smoother ride: the year-to-year
variation of returns is unchanged, and the drawdown does not shrink.
Dispersion is worth being exact about here, because the only thing that
falls is dispersion across start dates, which is easy to read as a
shallower fall and is not one. Nor does it take six rungs to get: two
remove more than a third of it.
All three measured at 25% notional, the same
size every other figure here is quoted at, and averaged the same way over
all 21 possible cycle start days.
Covered calls do not add return. They buy drawdown
The other side of the same trade, over the same thirty years.
The obvious question about a short-put overlay is whether the other side
works too. It does not, and the way it fails is more useful than the
failure.
Over the same 1996–2026 window, writing monthly calls against the
shares and holding to expiry, no delta and no size beat simply holding
the index. The best row gives up a hundredth of a point a year; the
worst gives up four and a third. The loss grows with the delta and with how
much of the book is written against, without exception:
| call delta | written | CAGR |
vs holding | worst drawdown | assigned |
| 0.15 | 100% | 10.27% | −0.10 pts |
−51.1% | 19% |
| 0.20 | 100% | 9.84% | −0.52 pts |
−49.4% | 29% |
| 0.30 | 100% | 8.44% | −1.92 pts |
−46.9% | 42% |
| 0.50 | 100% | 6.03% | −4.33 pts |
−41.4% | 64% |
| holding the index | 10.36% | — |
−55.2% | — |
That direction is not a quirk of this simulator. Cboe's own BXM index has
underperformed the S&P 500 with dividends by 3.90 points a year
over its published history, and the replication was calibrated against it
before any of these figures were produced.
What the last column is buying is the point. Read the drawdown
column instead of the return one and the same table says something else
entirely: at the money, fully written, the worst fall goes from
−55.2% to −41.4%. A covered call is not a yield
instrument that happens to cap you. It is a drawdown instrument that
happens to pay a premium, and it is the exact mirror of the put overlay,
which buys return and pays for it in drawdown.
Friction is not what stops it. A round-trip cost of 4% of premium
moves the worst row by 0.70 points and the best by 0.15. The put overlay's
edge dies somewhere near a 17% cost; here there is no edge to kill.
Premium is a small increment on a large share position, so a proportional
haircut on premium barely registers.
Timing the write does not rescue it either
If writing every month loses to holding, the natural next question is
whether writing only in the right months does not. Sell the call when
volatility is rich, or when the trend is against you, and skip it
otherwise. Ten rules were tested: VIX level, the volatility risk premium
(VIX less the past month's realised volatility, in vol points), the
200-day average, RSI and twelve-month momentum, each in both directions,
plus the VIX term structure on the shorter window it has. The two median
rules compare against an expanding median of the signal's own history to
that day, never a trailing window, so no early decision sees the future.
The first thing to know is what makes this question hard to answer
honestly. A covered call costs you the capped upside, and writing no
call costs nothing. So any rule that writes fewer calls beats
writing always, automatically, with no skill involved. A rule that writes
half the cycles and earns more has demonstrated arithmetic. The comparison
that means something is against writing the same number of calls in
different months.
So each rule is scored against its own mask rotated around the calendar,
which keeps the count and the clustering exactly and destroys only the
alignment with the market. All 358 rotations are run rather than sampled.
The percentile below is where the real rule sits among them. Each rule is
also re-run on the two halves of the window separately, against each
half's own always-write baseline, because a signal that only worked in one
half is not a signal.
Every row below is the same call. A
0.15 delta, written on the full share count, held to
expiry, American exercise, rolled on the third Friday. Only the months it
is written in change. A CAGR here is not comparable with one from a
different delta, which is why the sweep further up this page varies that
parameter on its own.
Read the last three columns together. They are the same
measurement, in points against writing every cycle, over the whole window
and then over each half. A rule that earned its full-period figure
steadily shows three numbers of a similar size. A rule that shows nothing
in the first half and a lot in the second has not found a way to pick
months; it has found that the second half had no drawdown that failed to
reverse quickly, which is a fact about 2011 to 2026 and not a rule you can
run forward.
| write when | writes | CAGR |
worst drawdown | vs rotated | whole period |
1996–2011 | 2011–2026 |
| holding the index | 0% | 10.36% | −55.2% | — | — | — | — |
| every cycle | 100% | 10.27% | −51.1% | — | — | — | — |
| VIX above its running median | 52% | 10.51% | −51.3% | 69th | +0.24 | +0.14 | +0.34 |
| VIX below | 48% | 10.12% | −55.1% | 31st | −0.14 | −1.10 | +0.89 |
| VRP above its running median | 48% | 10.71% | −54.0% | 92nd | +0.44 | −0.05 | +0.95 |
| VRP below | 52% | 9.92% | −52.4% | 8th | −0.34 | −0.91 | +0.28 |
| above the 200-day average | 75% | 10.76% | −54.6% | 93rd | +0.50 | −0.30 | +1.34 |
| below it | 25% | 9.86% | −51.8% | 7th | −0.40 | −0.66 | −0.11 |
| RSI(14) at or above 50 | 66% | 10.96% | −54.5% | 99th | +0.70 | −0.04 | +1.47 |
| RSI below 50 | 34% | 9.67% | −51.9% | 1st | −0.60 | −0.92 | −0.23 |
| 12-month return positive | 79% | 10.01% | −54.6% | 18th | −0.26 | −1.15 | +0.69 |
| 12-month return negative | 21% | 10.62% | −51.8% | 82nd | +0.35 | +0.20 | +0.54 |
Half-sample columns are CAGR points against writing every
cycle in that half, where always-write returned 7.41% and then 13.15%.
Read the drawdown column and most of the table collapses. Every rule
that beats writing always on return has a drawdown near the index's own
−55.2%, not the −51.1% that writing always produces. They are
not finding richer premium. They are standing aside during the falls the
call was there to cushion, which raises the return by exactly the mechanism
that removes the protection. If the call is a drawdown instrument, a rule
that spends the drawdown to buy back the return has sold the thing you
came for.
Then the split takes the rest. The strongest rule in the table,
RSI at or above 50, sits at the 99th percentile of its own rotations and is
worth −0.04 points in the first half and +1.47 in the second.
Above the 200-day average is the same story, −0.30 then +1.34.
These
are three near-duplicate ways of saying "do not write while the market is
below its recent range", and what they actually found is that 2011 to 2026
had no drawdown that failed to reverse quickly. That is a fact about the
second half of the sample, not a rule.
One rule is not like the others, and it still is not enough. Writing
only when VIX is above its own running median is the only rule positive in
both halves, +0.14 and +0.34, and the only one that keeps the drawdown
benefit: −51.3% against always-write's −51.1%. It also has a
mechanism, which can be checked without running the strategy at all:
| cycle opened with | cycles | premium |
index move over the cycle | premium kept |
| VIX above its running median | 186 |
0.371% of spot | +1.11% | +0.02 |
| VIX below | 173 | 0.203% of spot | +0.54% |
−0.24 |
At low volatility you are paid roughly half as much, the index still rises
roughly half as much, and the call gives back about a quarter of the
premium. That is where the money goes. Skipping those cycles is worth
about 0.25 points a year, which is what the simulation shows.
And it is still not significant. Against its own rotations that rule
sits at the 69th percentile on return, which is to say
indistinguishable from pointing the same mask at a different stretch of
history. Ten rules on 359 cycles will produce a 99th percentile whatever is
true; this is the one with the story and the consistency, and thirty years
of monthly cycles cannot separate it from noise.
The ceiling is the real answer. Suppose it is real and it delivers
its full 0.25 points. Writing always trails holding by 0.10, so the timed
version lands at 10.51% against holding's 10.36%: a seventh of a point, in
exchange for a capped upside, a tax event several times a year and a rule
that has to be right. Timing does not turn a covered call into a return
strategy. It is still a drawdown instrument, and the honest way to use it
is the one this page already describes.
What could not be tested, and why that is not an oversight. Index
P/E and CAPE are the obvious absences. Both are valuation levels that cross
their own median once or twice in thirty years, so as a regime switch they
are nearly the same variable as "is it after 2013", with one or two
effective degrees of freedom. That is the axis the trend rules already fail
on, and 359 cycles cannot separate the two.
VIX3M begins in 2006, so the
term structure was run on its own shorter window and against its own
baseline: writing in contango returns 11.72% against always-write's 11.34%
over those twenty years, at the 95th percentile of its rotations, while
writing 92% of cycles and giving up two drawdown points. It is the same
shape as the rest.
Put the two together and the call pays for the put's drawdown
If one leg buys return with drawdown and the other buys drawdown with
return, the combination is worth measuring rather than assuming. It was
measured:
| position | CAGR | vs holding |
worst drawdown | vs holding | Sharpe |
| holding the index | 10.36% | — |
−55.2% | — | 0.609 |
| put overlay at 25% | 11.55% | +1.18 pts |
−59.2% | −3.98 pts | 0.617 |
| 0.15 delta call, fully written | 10.27% |
−0.10 pts | −51.1% | +4.05 pts |
0.642 |
| both together | 11.46% |
+1.10 pts | −55.5% |
−0.27 pts | 0.644 |
The two legs are not run on the same rule, and the difference is easy
to miss. Both are opened on the same day, once a month, on the third
Friday. The put is bought back when it has made half of its maximum
profit and then waits for the next month, which is what every put figure on
this site is measured on. The call is held to expiry.
That is deliberate rather than an oversight. Buying a short call back at
half its maximum profit means buying it back after the market has
fallen, which hands you back the upside you just sold and turns the
position into a different strategy. The cap is the whole cost of a covered
call, and the cap only bites at expiry. BXM, the Cboe index this call is
calibrated against, holds to expiry too, so measuring it any other way
would break the anchor.
So a month of the pair is: open both, close the put early if it gets there,
let the call run to the third Friday. If you write calls on a faster
cadence than that, or close them early, none of the figures below describe
what you are doing.
The call gives back 93% of the put's drawdown cost for 7% of its
return. The put alone earns 1.18 points and pays 3.98 drawdown points
for them. Adding the call costs 0.09 of those points and recovers 3.71 of
these, landing at −55.5% against holding's −55.2%. That is the
put overlay's return at the index's own drawdown, and it is the best
risk-adjusted row in the study.
It is not "covered calls add return". They subtract at every delta,
and the combination earns less than the put alone. The call is a drawdown
instrument being paid for out of the put's return. Going further out of the
money does not improve it either: at 0.30 delta the same combination gives
up 0.72 points a year against holding.
What is not measured, and why none of this is on the tool yet
Assignment, and the tax it forces. The 0.15 delta call is assigned
in 19% of cycles and in 97% of calendar years, and at a 0.30 delta
in 42% of cycles and every year without exception. Every figure above
is before tax. Somebody holding an index fund with a large unrealised gain
who is assigned realises that gain, at once, in that tax year: the
covered-call equivalent of a margin call, an outcome the strategy's own
success forces on you. No yield figure shows it and the returns above do
not either.
An early-exercise rule has to test that the call is in the money.
Comparing the coming dividend against the option's remaining time value
is not enough on its own: on a cheap far-strike call the time value
decays below the dividend while the contract is still worthless to
exercise, because exercising it buys shares above the market price.
Counting those as assignments overstates the rate, and at a 0.15 delta it
overstates it by 99 contracts in 118.
No return moves either way, which is what makes it easy to miss.
An out-of-the-money call settles at zero whether it is recorded as
exercised or not, so the P&L is unaffected and nothing else on the page
disagrees with it. The check is the shape of the series: assignment rises
with the delta, 19% to 64%, because deeper in the money must be exercised
more often. A count that is flat across the delta is a count that never
looked at the strike.
Cash settlement, and the rule it does not get you out of
None of this is tax advice, and it was not written by a
tax professional. It describes United States federal rules in general
terms and applies them to nobody. Whether any of it touches your situation
depends on facts this site never sees. Take it to somebody qualified before
you act on it, and read the terms.
The obvious way out of the assignment problem is to write the call on
something that cannot deliver shares. XSP is the Mini-S&P 500
index option: a tenth of SPX, the same notional as one SPY contract,
European exercise, and cash settled. Nothing is ever delivered. It
is also a Section 1256 contract, which is taxed 60% long-term
and 40% short-term whatever the holding period, and marked to market at
year end.
On the first question that works, and it works completely. A cash
settled option cannot take your shares, so there is no sale of the stock,
so the unrealised gain it carries is not realised. The event this whole
section is about does not happen. What replaces it is a settlement in cash
on the option itself and a year-end mark, which is a tax event of a
different kind: smaller, annual, and not tied to the size of a position you
may have held for twenty years.
On the second question it does not work, and the reason is worth
understanding. Writing a call against stock you own creates what the
code calls a straddle: two positions that offset each other. There is a
specific exception for the ordinary case, the qualified covered
call, and it is why writing SPY calls against SPY shares is normally
untroubled. That exception is written for an option on the stock you
hold. An index option is not an option on your shares, so the exception
does not reach it.
The next question is whether the two are related enough to be a straddle
at all, and there is a mechanical test for it. Treasury regulation
1.246-5 asks whether your holdings and the stocks behind the index
position substantially overlap, and sets the line at 70% by
value. SPY against the S&P 500 is not a marginal case. It is
essentially total overlap, which is the entire point of owning it.
So the likely answer is that it is a straddle, and one with a
complication. One leg is a Section 1256 contract and the other is
not, which is its own category with its own elections. Losses on one side
can be deferred while the other is still open, and the position stops being
two things you can think about separately.
And there is a cost that runs the opposite way to the intuition.
Section 246(c) stops the clock on a share's holding period for any
period in which you have diminished your risk of loss by holding an
offsetting position, and that clock is what decides whether a dividend is a
qualified dividend taxed at the lower rate.
The exception to that
rule is, again, the qualified covered call. An index option written against
an ETF is not one, so a programme of index calls against SPY may cost
you the qualified rate on SPY's dividends, turning them into ordinary
income. On a large share position held for the dividends as well as the
growth, that is not a footnote.
Which leaves both routes carrying something. Writing SPY calls
against SPY shares fits the qualified covered call exception, keeps the
dividend treatment, and can deliver your shares. Writing XSP calls against
those shares can never deliver them, and gives up the exception that made
the first route simple. Neither is free, and which one is worse depends
entirely on the size of the unrealised gain you are protecting, how much of
your return is dividends, and a bracket. Those are your numbers, not
ours.
This is why none of it is in the tool. A calculator that told you
what assignment costs would have to take a position on which of these
applies to you, and that is a determination about a person rather than
arithmetic on numbers somebody typed. The research can say what the rules
are and where the fork is. It stops there deliberately.
Sources for the paragraphs above, so they can be checked
rather than trusted:
26 U.S.C.
§ 1092 for straddles and the qualified covered call definition,
26 C.F.R.
§ 1.246-5 for the 70% substantial-overlap test,
26 U.S.C.
§ 246(c) for the holding-period suspension behind qualified
dividends, Rev. Rul.
2002-66 on stock portfolios against index options, and
Cboe
on XSP for the contract's own terms.
Rolling instead of being assigned, and what it is actually worth
Every figure above is already the rolling path. The simulator never
sells shares: at expiry it settles the short call at its intrinsic value
and keeps the stock, which is what rolling is. The assignment percentages
are how often you would face the decision, not a different set of
returns.
The strike moves when it rolls. This is not rolling out at the same
strike to defend a position. The expiring call settles at whatever it is
worth, which realises its loss, and the next one is written fresh at the
target delta measured from wherever the price now is. If the market has run
and the call finished deep in the money, the new strike is higher, not the
old one pushed out a month.
That is because, before tax, rolling and assignment are the same
trade. Paying the option's intrinsic value and delivering shares worth
more than the strike for the strike are one number. What genuinely differs
is the tax, and the share round trip: delivery means the position leaves
and has to be bought back.
| 0.15 delta call | CAGR | worst drawdown |
Sharpe |
| roll, re-covering on the next monthly expiry | 10.27% |
−51.1% | 0.642 |
| roll, re-covering immediately after an early call |
10.28% | −51.1% | 0.642 |
| assignment, 10bp share round trip | 10.02% |
−51.2% | 0.629 |
| assignment, 25bp share round trip | 9.64% |
−51.3% | 0.609 |
Rolling is worth 0.25 to 1.36 points a year over delivering,
depending on the delta and what the share round trip costs, and that is
before any tax at all. At a 0.30 delta with a 25bp round trip the friction
alone is larger than the whole strategy. Two commissions and a share spread
on the entire position, two to five times a year, is not a rounding
error.
Re-covering immediately after an early call, rather than waiting for
the next monthly expiry, is worth 0.02 points at a 0.15 delta and 0.14 at a
0.30. The model otherwise leaves the book uncovered under 1% of sessions at
the far strike and a real writer would not. At a 0.15 delta it costs
nothing in drawdown to collect. On that strongest version the calls return
10.28% against holding's 10.36%, giving up a twelfth of a
point for 4.1 drawdown points.
What rolling does not do is make the tax go away. It converts a
realised gain on the shares into a realised loss on the option, which is a
different amount in a different category, and it engages the
qualified-covered-call and straddle rules, which can defer that loss and
suspend the holding period on the shares underneath it. That needs a
cost basis and a bracket to answer, which is arithmetic on numbers a reader
would type rather than anything a backtest can settle. It is the open
question in this study.
The equity leg is not costed. Assignment means shares going out and
being bought back: two commissions and the share spread on the whole
position, two to five times a year. The cost figures above are option
costs and are the smaller half.
Strikes are continuous here. The delta target is hit exactly rather
than rounded to a listed strike, so these are upper bounds on precision in
the same way the continuous-rolling figures are.
All of which is why the calculator still sizes one thing: a monthly
at-the-money short put. The covered-call figures are research, not a
product, until the tax question has a measured answer.
Where the option prices come from
The method under every figure above, and the bug that stopped it reproducing itself.
There is no free record of what S&P 500 options actually traded at
going back that far, so every contract in this backtest is priced from
VIX with Black-Scholes. That introduces a bias, and the bias runs
one way.
VIX is not the price of the option this strategy sells. It is a
variance swap rate, computed across the whole strip of out-of-the-money
strikes, and on an index with steep put skew it sits above at-the-money
implied volatility. Pricing an at-the-money put at VIX therefore collects
more premium than the market would have paid, on every cycle, for
thirty-three years.
So the pricing is calibrated against a published index that actually
ran the trade. Cboe's PUT, the S&P 500 PutWrite Index, sells
one-month at-the-money SPX puts monthly, holds them to expiry and
collateralises them fully with Treasury bills. Free daily history since
1996. It is the same option on the same schedule, and because it holds no
shares at all it carries no equity exposure, so a gap between a replication
of it and the published index is the option leg and almost nothing else.
Uncalibrated, a replication of PUT returned 12.50% a year against
the index's 8.51%. Solving for the volatility that reproduces PUT
gives 88.2% of VIX, which at a mean VIX of 20.2 implies
at-the-money volatility of 17.8: a gap of 2.38 volatility points,
the textbook size of the variance-swap convexity premium on this index.
Every figure on this page is measured with that calibration applied, at
entry and at mark.
One limitation is measured rather than suspected, and it runs the other
way. This backtest has no listed expiry calendar: it opens a contract
every 21 trading sessions, on a grid that drifts against the third-Friday
schedule real options actually use.
On the same trade, PUT run on its own
calendar falls −37.1% where this grid falls −35.0%
averaged across every start day. Averaging recovers about half of it and no
more. So the drawdown figures here are roughly two points shallower than
a real expiry schedule would produce, and the honest reading of every
one of them is that the true cost is slightly worse.
The backtest starts where PUT starts, so nothing is extrapolated.
A calibration solved on one window and applied to a longer one carries an
assumption across the difference. This one does not: both begin in August
1996 and end together, so every cycle measured here sits inside the window
the pricing was checked on.
That costs three and a half years of history, which is a real price. It is
worth paying because those years were doing very little work: they contain
no crisis, and both of the events the drawdown figures actually rest on,
2008 and 2020, are comfortably inside the shorter window. The trade is a
smaller sample for a number with no assumption inside it.
It is a calibration and not a measurement, so it is worth
saying what it absorbs. PUT pays real bid/ask spreads and rolls on the
third Friday rather than on a fixed grid of sessions, and this single
factor is doing the work of those differences too. It absorbs a
difference in the strike as well. PUT sells the listed strike closest
to but not greater than the index, so it rounds down every month and is
never in the money; this backtest writes a strike exactly at the spot
price, which is on average a little above that.
A higher strike on a short
put collects more and risks more, so these figures describe a marginally
richer and marginally riskier contract than the index they are solved
against. Its own replication now
matches PUT's annual return to two decimal places and still runs about four
points shallower on drawdown, which is roughly the size of what is left
over. py putwrite.py in the research repository reproduces the
whole comparison.
What the returns are measured on
Every growth figure on this site is a total return. The underlying
series has dividends reinvested, so the baseline is not price
appreciation, and it sits meaningfully above it. If you are holding a
figure here against your own account, compare it with a total return
rather than with what the share price did.
The edge over buy-and-hold is not flattered by that. Both sides of
every comparison run on the same series, so the dividends are in both
numbers and cancel in the difference. What they do change is the level
each side starts from.
Cash never sits idle. In the covered-call study the premium
collected, the dividends paid and anything left over from buying a
contract back are all swept into the underlying at the next session's
price, and the share count grows accordingly. The buy-and-hold benchmark
is the same simulator with nothing written, so it sweeps the same way. The
covered-call result is therefore not an artefact of premium being left in
cash: it is reinvested, it compounds, and the strategy still gives up more
in capped upside than the premium is worth.
The options themselves are priced off the price index,
not the total-return one, and that is deliberate rather than an
inconsistency. A contract does not pay its holder the dividend, so pricing
one off a series that assumes reinvestment would put the forward too high.
The shares compound with dividends and the contracts are priced without
them, which is what happens in an account. data/run.json
records all of this under data_source.