TL;DR: 50 options strategy profiles, priced from a minute-level options archive at end-of-day quotes, SPY/QQQ/IWM, 2020 to 2025. Identical rules: enter at the close after the first trading day of the month, exit ten sessions later, ~35 DTE, buy at ask, sell at bid, $0.65/contract/side. 10 of 42 monthly profiles had a positive mean after costs. The top five all own equity upside in a market that went up. Every number has a downloadable trade ledger.
Reading the numbers
Mean after costs is average P&L per trade against the value of 100 shares of the ETF. On a $500 ETF that is $50,000, so +31.2 bps ≈ $156 a trade. No risk adjustment: a credit spread and a long call can sit adjacent with very different risk. Mean far from median means a few trades are moving the average.
Monthly ETF table, the positive half
| # | Strategy | Family | Trades | Mean (bps) | Median | Win rate | Worst |
|---|---|---|---|---|---|---|---|
| 1 | Covered call | Stock overlay | 186 | +76.3 | +171.3 | 69.9% | -1184.4 |
| 2 | Protective put | Stock overlay | 188 | +70.2 | +117.8 | 61.7% | -936.4 |
| 3 | Collar | Stock overlay | 184 | +43.1 | +106.0 | 63.6% | -759.0 |
| 4 | Bullish risk reversal | Ratio/RR | 208 | +41.5 | +66.2 | 61.5% | -719.2 |
| 5 | Long call | Directional | 212 | +36.3 | +33.1 | 53.8% | -457.4 |
| 6 | Vol-carry filtered put spread | Signal filter | 73 | +16.5 | +28.6 | 72.6% | -224.2 |
| 7 | Bull call debit spread | Directional | 185 | +12.2 | +33.5 | 59.5% | -280.1 |
| 8 | Call diagonal | Calendar/diagonal | 176 | +10.3 | +39.5 | 63.1% | -364.2 |
| 9 | Cash-secured put | Stock overlay | 212 | +9.0 | +50.3 | 74.1% | -2007.2 |
| 10 | Put ratio spread | Ratio/RR | 194 | +2.8 | -2.1 | 46.9% | -141.4 |
Ranks 11 to 42 are all negative, ending at -61.1 bps (bearish risk reversal and poor man's covered call) and -74.8 (term-structure conditioned calendar, 4 trades).
Symmetric butterflies and single-right condors won fewer than one trade in six. The put condor won 5.0%, lowest in the study. Mostly a structure/holding-period mismatch: a debit butterfly earns its value in the final days before expiry, and a ten-session exit on a 35-day option leaves that behind while paying three or four legs of spread.
The stricter comparison: six structures, same 133 months
| # | Strategy | After costs | At midpoint | Win rate |
|---|---|---|---|---|
| 1 | Long call | +31.2 | +37.9 | 55.6% |
| 2 | Bull call debit spread | +10.4 | +19.8 | 58.6% |
| 3 | Bull put credit spread | +8.6 | +13.7 | 72.9% |
| 4 | Iron condor | -9.7 | -0.2 | 53.4% |
| 5 | Call calendar | -17.2 | -1.3 | 33.1% |
| 6 | Long straddle | -17.6 | -2.9 | 42.1% |
Win rate is not P&L. 72.9% wins put the credit spread third. Loss size matters as much as loss frequency.
Costs reorder the table. Call calendar: -1.3 at midpoint, -17.2 after spread. Iron condor: flat to -9.7. If a strategy only works at midpoint, it does not work.
First place is not an edge. The ETFs rose an average of +93.6 bps over the same windows. Five of six have a 95% interval for the mean that includes zero; the long call's is roughly -18.5 to +79.5.
The spread is the story
Every mirror pair in the dataset has exactly opposite midpoint results and both sides lose after costs:
- iron condor / reverse iron condor
- iron butterfly / reverse iron butterfly
- call ratio spread / call backspread
- put ratio spread / put backspread
Direction of the trade did not decide these outcomes. Crossing the bid-ask four times did.
The worst offender: poor man's covered call, +53.3 bps at midpoint, -61.1 after costs. Largest cost drag in the dataset. Long-dated deep-ITM calls have wide spreads and this sample crosses them twice in ten sessions. A real PMCC holds the long call for months and rolls only the short, which is not what was tested.
Signal filters: one of four did anything
| Filter | Condition | Trades | Mean | vs unfiltered |
|---|---|---|---|---|
| Vol-carry put spread | ATM IV ≥ 1.2 × 20d RV | 73 | +16.5 | -0.9 → +16.5, skipped the worst month |
| Vol-carry iron condor | Same condition | 67 | -14.1 | -10.5 → -14.1, worse |
| Skew-conditioned vertical | 25d put IV − 25d call IV ≥ 0.03 | 170 | -2.0 | fired almost always, same worst trade |
| Tail-pricing put spread | 10d put IV − ATM put IV ≥ 0.05 | 162 | -1.7 | fired almost always, same worst trade |
| Term-structure calendar | Back 50d call IV − front ≥ 0.02 | 4 | -74.8 | condition almost never held |
The lesson in the bottom three rows: a filter that fires on nearly every window is not a filter. Build the control sample (the windows where it did not fire) before believing the conditional mean.
Earnings: 12 events, useful as worked examples only
Four 2025 announcements each for AAPL, MSFT and AMZN. In one session before, out one session after.
| Strategy | Trades | Mean | Win rate |
|---|---|---|---|
| Earnings short strangle | 11 | +96.4 | 90.9% |
| Post-earnings vol crush | 12 | +67.1 | 66.7% |
| Earnings iron condor | 11 | +41.2 | 81.8% |
| Pre-earnings vol buildup | 12 | -31.5 | 33.3% |
| Earnings diagonal | 12 | -44.3 | 33.3% |
| Earnings calendar | 6 | -44.4 | 0.0% |
| Earnings long straddle | 12 | -122.5 | 25.0% |
Six to twelve trades each on three of the most liquid stocks in one year. This shows how the accounting works, not that it keeps working. No margin model, and a short strangle without one measures a position nobody could hold.
The wheel
$100,000 starting cash per account, one contract at a time, held to expiry, assignment on anything finishing ITM, no interest on idle cash, no early assignment. 106 completed cycles.
SPY 22.4%, QQQ 21.9%, IWM 4.8% total return over six years. Mostly cash the whole time. Compare with holding the ETF and with holding cash at a real rate before concluding anything.
Method
- Schedule: select from first observed trading day's EOD chain each month, enter next close, exit 10 sessions later. No stops, targets, rolls or hedges.
- Expirations: front 35 calendar days (30–45); back leg 65 (55–80).
- Strikes: delta 50/25/10 means nearest archived absolute delta, rejected beyond 0.10 away. ATM is nearest strike to spot on signal day.
- Quote gates: positive uncrossed bid/ask on signal, entry and exit days; signal-day spread ≤ max($0.10, 30% of mid); displayed size covering the trade. Missing later quote excludes and records the trade rather than substituting.
- Dividends: ex-div windows excluded for stock overlays and any short call. Early assignment not modelled.
- Costs: one contract per leg, buy at ask, sell at bid, $0.65/contract/side. Stock legs cross the underlying spread, no commission.
- RV: sample SD of 20 unadjusted log returns, annualised by √252. IV stored as decimal, so 0.03 is three vol points.
- Uncertainty: 1,000 bootstrap resamples of complete calendar months, three ETFs within a month kept together.
216 scheduled ETF-month windows, 133 survived for all six headline structures (SPY 54, QQQ 39, IWM 40). Requiring valid entry and exit quotes can bias the surviving sample. Expanded release: 7,265 option-trade simulations, 106 wheel cycles, 42 monthly profiles, 7 earnings profiles.
Not modelled: early assignment, financing, margin, collateral yield, taxes, market impact, daily account path. Retrospective study designed in 2026 with no untouched holdout. End-of-day quotes are aggregated views without a contributing timestamp.
Reproduce it
Download packs include raw query responses, selected legs, quote lineage, trade results, exclusions, calculation code and offline reproduction instructions, with file hashes.
- Article and all 50 profiles: https://flashalpha.com/articles/options-strategies-ranked-light-backtest-spy-qqq-iwm
- Historical API docs: https://flashalpha.com/docs/historical-api
- Historical playground: https://flashalpha.com/docs/historical-playground
The archive behind this runs at one-minute resolution back to January 2017, so the obvious next tests are intraday entries and exits, per-leg spread filters at entry, and holding to expiry instead of a fixed ten sessions.
Top comments (0)