Help us double down on what's working, instead of guessing. Takes 5 seconds, totally optional.
optionselling · 18 min read
sell-window: A Blueprint for Selling Options on SPY, QQQ and IWM
A blueprint for selling options, built on more than 5 million backtests. Each session sell-window tells you whether to sell SPY, QQQ and IWM options and, if so, which expiry, which structure, the exact strikes and how to exit. Following it cut the deepest drawdown to $255,105 from $958,924 for the same trades sold every session, with a higher Sharpe ratio. This guide shows you how to follow it.
Don't know how to start selling options? Follow sell-window. More than 5 million backtests led to it. For each session it tells you whether to sell, at which expiry, which structure, the exact strikes and how to get out. Experienced traders can use sell or skip alone to stand aside on bad sessions; newer traders can follow the concrete picks. How much you trade is your decision.
$255k vs $959kMax drawdown at the same trade size
−$171k vs −$307kWorst month at the same trade size
0.76 vs 0.61Sharpe ratio, 2018 to 2026
$3.55M vs $2.32MTotal P&L at the same max drawdown
Following sell-window vs the same trades sold every session. Backtest, January 2018 to October 2026: every listed trade on SPY, QQQ and IWM, at halfway fills. Drawdown, worst month and Sharpe ratio are at one unit per signal. Same max drawdown means 3.76 units per signal, so both books fell $958,924 at their deepest.
No account
Watch it trade live
A paper bot follows sell-window every session and posts its trades and P&L on our Discord.
Selling options means making the same decisions every session, and any one of them can sink the trade: whether to sell today, which expiry, which structure, which strikes, when to get out and how big to go. Most traders make them by feel. sell-window comes out of more than 5 million backtests of strategies, deltas, expiries, exits and entry rules from 2018 to 2026. For each session it gives you a blueprint:
When to sell. For each expiry, sell or skip. Skip marks the sessions to stay out of.
What to sell. The structures that held up in the backtest for that expiry, from a short put to a broken-wing butterfly.
Which strikes. Concrete strikes with each contract's delta and quote and the credit at mid, picked with the same contract rules the backtest used. You do not scan the chain or turn a signal into strikes.
How to get out. Every trade carries its exit rule: hold to expiry, or take profit at half the credit.
How big to go. This guide shows each trade's worst month in the backtest, so you can size before you enter.
Proof you can check. Every past session replays through the historical API with the same response, so you can test the blueprint on your own fills and sizing first.
Two ways to use it
Experienced traders: avoid the bad sessions. Keep your own strategy and use sell or skip per expiry as a risk switch: trade that expiry when it says sell, stand aside when it says skip. Sitting out the skip sessions is where the backtest's smaller drawdown came from. Our tests cover the candidate trades, not your strategy, so replay it on your own trades through the historical API first.
Newer traders: take the concrete picks. Don't know how to start? Follow the candidates as listed: the expiry, the strikes, the exit, sized from the worst month. The next section walks you through one session.
Smaller drawdowns, or more money for the same drawdown
Following the blueprint gives you a choice. Keep your trade size and the drawdown is far shallower. Or size up until the deepest drawdown matches selling every session, and earn more. From January 2018 to October 2026, at the same trade size:
sell-window
Same trades every session
Max drawdown
$255,105
$958,924
Worst month
−$170,829
−$307,241
Sharpe ratio
0.76
0.61
Sharpe ratio, 2022 to 2026
0.89
0.66
P&L
$945,541
$2,321,150
Trades
20,883
56,975
Same trade size: how far each book fell
Same max drawdown: total P&L
At the same trade size it earned less in total because it placed about a third of the trades, and it made slightly more per trade, $45 against $41. The higher Sharpe ratio leaves room to size up. At 3.76 times the contracts, both books have the same deepest drawdown, $958,924, and following it made $3,554,225 against $2,321,150. Its worst month was deeper at that size, −$642,135 against −$307,241, so size from the worst month. Compare the trades one by one in the backtest.
Start here: follow the blueprint for one session
Plan after the close. After 16:00 ET (13:00 ET on half days), the answer switches to the next session. Check which expiries say sell and which candidates you would consider. The plan does not change before that session ends.
Get live strikes at 09:35 ET. The backtest entered at 09:35 ET, after the opening auction settles. Call the endpoint again at or after that time. Strikes and quotes are now from the live chain.
Pick one candidate per window. Candidates in one window overlap: a short strangle already contains the short put. The backtest scored each candidate on its own, so stacking several in one window adds risk the backtest did not measure as one position.
Size it from the worst month. Use the candidate table below. Start small; size up only as far as the worst month stays a loss you can carry.
Enter with a limit order. Start at the mid and move toward the natural price in small steps. The results in this guide assume a fill halfway between the mid and the natural price; at the mid they are better. See the fills tip below.
Set the exit when you enter. For a take-profit candidate, place a good-till-cancelled order to buy back at half the credit. For hold-to-expiry candidates, plan to close by 15:55 ET on expiry day, as the backtest did.
Do nothing on skip. Skip and unavailable mean no new trade at that expiry. Positions you already hold keep their own exit.
Reading the blueprint
One call per symbol returns four windows, always in the same order. Each window is a real listed expiry, named in the response by its date (expiry) and its days_to_expiry, not by a label. The dates roll forward every session. For a session on Wednesday 4 November 2026, with SPY listing an expiry every weekday:
Window
Expiry
Days to expiry
How it is picked
Same day
2026-11-04
0
The same-day expiry.
About 1 week
2026-11-11
7
The listed expiry closest to 7 days out, within 4 to 10 days.
About 2 weeks
2026-11-18
14
The listed expiry closest to 14 days out, within 11 to 17 days.
About 1 month
2026-12-04
30
The listed expiry closest to 30 days out, within 25 to 35 days.
If no listed expiry falls in a window's range, that window comes back without an expiry and is not traded.
For each window the action is one of three values:
sell: a session to sell at this expiry. The window lists the trades.
skip: stand aside. No new trade at this expiry.
unavailable: there is no answer, usually a missing day of data. Treat it like skip.
Each candidate carries its legs: the strike, the side, the quantity, the contract's own delta and its bid and ask. mid_credit is the credit per share at mid, so one unit at mid is that number times 100 in dollars. Sell or skip is set from the previous session's close and stays fixed all session. The strikes come from the option chain at the moment you call. Before 09:35 ET they are indicative and legs_indicative is true, so call again at or after 09:35 ET for the strikes to trade.
A skip day looks like this. There is nothing to do (SPY, 2026-11-05):
GET https://lab.flashalpha.com/v1/strategies/sell-window/SPY
Read it this way. In the session of 16 October, the 23 October expiry says sell. The short put sells the 754 strike for about $70 at mid, and the short strangle sells 786 and 754 for about $113.
The trades, structure by structure
sell-window lists 7 structures. Four of them carry undefined risk: the short put's loss stops only at its strike, and the other three have no cap. Know which ones before you trade them.
Structure
Legs
Risk
Most you can lose, per unit
Short put
Sell one out-of-the-money put.
Undefined
Strike minus credit, if the underlying goes to zero. Needs margin or cash.
Short call
Sell one out-of-the-money call.
Undefined
No cap. A sharp rally keeps adding to the loss.
Short strangle
Sell one out-of-the-money call and one out-of-the-money put.
Undefined
No cap on the call side; strike minus credit on the put side.
Short straddle
Sell the call and the put at the strikes nearest the money.
Undefined
No cap. The largest credit, and the most exposed to any move.
Put credit spread
Sell one put and buy one cheaper put below it.
Defined
Gap between the two strikes minus the credit.
Tail-hedged put
Sell one put and buy one far out-of-the-money put below it.
Defined
Gap between the two strikes minus the credit.
Put broken-wing butterfly
Buy one put above, sell two puts, buy one put further below. Opened for a credit.
Defined
The lower gap minus the upper gap, minus the credit. Nothing is lost above the top strike.
The strike rules are the backtest's. Each leg is an out-of-the-money contract with a bid above zero, a spread no wider than 20% of its mid and open interest of at least 250. Among those, the leg is the contract whose delta is closest to the backtest's target. If no contract meets the rules for a leg, that trade is left out: the backtest could not have filled it either.
The candidates, window by window
This table shows every candidate the endpoint can list and what it did in the backtest, from 2018 to 2026, averaged over SPY, QQQ and IWM. The backtest sold one unit on every session the candidate qualified, at 09:35 ET. Each fill was halfway between the mid and the bid or ask, plus $0.01 a share and $1 per contract.
Window
Trade
Exit
Sessions listed
Winning trades
Worst month, one unit per session
Sharpe ratio
Same day
Short put
Hold to expiry
37%
86%
−$1,001
0.31
Short strangle
Hold to expiry
33%
73%
−$1,114
0.61
Short call
Hold to expiry
34%
79%
−$949
0.28
Tail-hedged put
Hold to expiry
35%
84%
−$639
−0.37
About 1 week
Short put
Hold to expiry
36%
95%
−$5,453
0.61
Short strangle
Hold to expiry
36%
90%
−$5,268
0.58
Short straddle
Take profit at 50% of the credit, otherwise hold to expiry
32%
65%
−$4,010
0.37
About 2 weeks
Short strangle
Hold to expiry
35%
95%
−$7,420
0.38
Short put
Hold to expiry
33%
79%
−$13,569
0.48
About 1 month
Short put
Hold to expiry
36%
92%
−$13,109
0.54
Tail-hedged put
Hold to expiry
36%
87%
−$11,189
0.57
Put credit spread
Hold to expiry
36%
92%
−$7,188
0.54
Put broken-wing butterfly
Hold to expiry
36%
90%
−$9,675
0.46
The trades were chosen from these same years, so read this table as an upper bound. Figures are averages over SPY, QQQ and IWM. "Worst month" is at mid fills, for a book that sold one unit on every session the trade was listed, with all those positions open together.
Three things stand out:
Most trades win, and the losses are bigger. Every candidate won between 65% and 95% of its trades. The worst months are many times one trade's credit. Size for the worst month, not the typical trade.
The one-month window carries the book. It made 69% of the backtest's profit. The same-day and one-week windows add small, frequent trades.
The take-profit straddle wins least often. The one-week short straddle won 65% of its trades. It collects the most credit and relies on the take-profit exit.
Sizing: start from the worst case
Size from the worst case, not the average trade.
Start from your drawdown budget. Decide the deepest drawdown you will accept, then size so the backtest's worst month and deepest drawdown stay inside it. At one unit of every trade on all three symbols, the deepest fall was $255,105. Leave a margin: the next one can be deeper.
Count the overlap. A one-month candidate was listed on about 36% of sessions and each trade stays open about 21 sessions. Trading it every time it is listed means about 8 positions open at once. Size the total, not the single trade.
Size from the worst month. For the one-month short put, the worst month for one unit per listed session was −$13,109. If that loss would hurt, trade fewer sessions, fewer contracts, or a defined-risk candidate.
Prefer defined risk on a small account. The put credit spread, tail-hedged put and broken-wing butterfly cap what one gap can cost per unit, and their margin is the gap between strikes, not the strike. The one-month put credit spread's worst month was −$7,188 per unit per listed session. The overlap rule still applies.
Keep cash for assignment and margin calls. Short puts and calls on these ETFs can be assigned before expiry. A margin call during a fast market forces you to close at the worst price.
Expect losing years. The backtest lost money in 2018 and 2022. Size so you are still trading after them.
Year
Profit at halfway fills, whole book
Sharpe ratio
2018
−$57,230
−0.73
2019
$100,974
1.41
2020
$24,748
0.13
2021
$218,530
1.93
2022
−$131,481
−1.60
2023
$144,656
2.60
2024
$108,980
0.54
2025
$293,471
1.56
2026
$242,892
1.62
Whole book: every candidate on SPY, QQQ and IWM, one unit per listed session, 2018 to 2026 (October).
Exits, expiry and assignment
Hold to expiry means the backtest closed the position at the 15:55 ET quote on expiry day. It never held through the settlement. Closing before the bell avoids being assigned shares overnight on a strike that finishes near the money.
Take profit at 50% means buy back once the position costs half the credit or less. If that never happens, close at 15:55 ET on expiry day.
Same-day trades open at 09:35 ET and close at 15:55 ET the same session.
Early assignment. SPY, QQQ and IWM options are American style. Deep in-the-money short puts, and short calls before an ex-dividend date, can be assigned early. Check the dividend calendar before you hold short calls into an ex-date.
A later skip does not close a trade. The backtest kept every position until its own exit.
Practical tip: better fills, higher Sharpe
Every result in this guide assumes halfway fills: you sell halfway between the mid and the bid and buy back halfway between the mid and the ask. Fill closer to the mid and the same trades do better. Over the whole period, the Sharpe ratio was 0.88 at the mid against 0.77 at halfway fills, with the backtest's 1x margin cap. Filling at the natural price every time costs more. How to get closer to the mid:
Never use market orders. Enter with a limit at the mid and step toward the natural price in small increments, waiting between steps.
Send multi-leg trades as one order. A strangle, spread or butterfly entered as a single combo order fills at a net price; legging in one contract at a time pays the spread on each leg and risks a move in between.
Use mid_credit as your anchor. It is the credit at mid for one unit. Decide in advance how far below it you will go.
Trade after the open settles. Spreads are widest in the first minutes; the backtest entered at 09:35 ET.
Refresh before you work the order. If the underlying moved since your call, call again: the strikes and quotes update, the sell or skip answer does not.
Close the same way. Buy back with a limit too, including the 15:55 ET exit on expiry day and the take-profit order.
Check the blueprint yourself (Alpha)
The historical API returns the same response for any past session. From launch on, the sell or skip answer, the expiry and the candidate list are exactly what the live endpoint said. Before launch they are rebuilt from the archive with the same rules. Set at to 09:35 ET on a session to get the strikes the backtest's rules pick at its entry time. This script collects every candidate SPY listed in 2024 into a CSV:
import csv
import datetime as dt
import os
import requests
BASE_URL = "https://historical.flashalpha.com"
session = requests.Session()
session.headers["X-Api-Key"] = os.environ["FLASHALPHA_API_KEY"] # Alpha plan
def sell_window(symbol: str, day: dt.date) -> dict:
"""The answer as it stood at 09:35 ET on `day`, the backtest's entry time."""
r = session.get(f"{BASE_URL}/v1/strategies/sell-window/{symbol}",
params={"at": f"{day.isoformat()}T09:35:00"}, timeout=60)
r.raise_for_status()
return r.json()
with open("sell_window_entries.csv", "w", newline="") as f:
out = csv.writer(f)
out.writerow(["session", "expiry", "structure", "exit", "legs", "mid_credit"])
day = dt.date(2024, 1, 2)
while day <= dt.date(2024, 12, 31):
body = sell_window("SPY", day)
if body["session"] == day.isoformat(): # a closed day answers for the next session: skip it
for w in body["windows"]:
for c in w.get("candidates", []):
legs = " ".join(f'{l["side"]} {l["quantity"]} {l["strike"]:g}{l["type"][0].upper()} ({l["delta"]:+.2f})'
for l in c.get("legs", []))
out.writerow([body["session"], w.get("expiry"), c["structure"], c["exit"], legs, c.get("mid_credit")])
day += dt.timedelta(days=1)
To price the exits, read each leg's quote at 15:55 ET on its exit day from the historical option quotes, as the options backtesting guide does.
What to expect
Losing months still happen. 29% of months lost money, and the worst was February 2020. The blueprint makes losses smaller, not rare.
It works on new trades. A skip does not close what you already hold, so it cannot protect open positions when a sudden shock hits.
It is not a forecast. Sell means the backtested rules would have sold. It does not mean the market will stay calm.
It covers three symbols. Other symbols did not reach the bar in testing and return unavailable.
Why you can trust this backtest
We tried to break this result before publishing it. Here is what we did.
More than 5 million backtests. We replayed strategies, deltas, expiries, exits and entry rules on real quotes from 2018 to 2026. Most rules did not survive, including ones that looked good at first.
We tested it against luck. Trading less cuts drawdown on its own, so we compared the rule with 1,000 random schedules that skip the same number of days. On standard trades across SPY, QQQ and IWM from 2018 to 2026, its Sharpe ratio beat 90% of them and its drawdown beat 83%. On SPY from 2022 to 2026, and on SPX weekly options over the same years, its drawdown beat more than 97%.
We set the bar first. For each test we wrote down what would count as a pass before running it. Rules built on the VIX curve and on price trend failed those tests, so we threw them out.
We report what it did not win. In 2017, a calm year with no selloff to avoid, its Sharpe ratio was 1.55 against 1.70 for selling every day.
No hindsight in the signal. Each answer uses only the previous session's close. Trades enter at 09:35 ET at that day's quotes, fill halfway to the bid or ask, pay $1 a contract and are valued every day.
Check it yourself. On the Alpha plan, replay any session since 2018 with the historical API and get the answer it gives, strikes included.
Watch it live. A paper bot follows the endpoint every session and posts its results on our Discord, so the forward test is in public.
A FlashAlpha API endpoint for SPY, QQQ and IWM. For each session it looks at four expiries, from the same day to about one month out, and says sell, skip or unavailable for each. On a sell it lists the candidate trades from our backtests with concrete strikes, each contract's delta and quote, and the credit at mid.
Why do I need sell-window?
It replaces guesswork with a blueprint. For each session and expiry it says whether to sell, which structures, the exact strikes with their deltas and quotes, and how to exit, all drawn from our backtests. From 2018 to 2026, its deepest drawdown was $255,105 against $958,924 for the same trades sold every session, with a higher Sharpe ratio.
I already have a strategy. How do I use sell-window?
Use sell or skip per expiry as a risk switch: trade that expiry when it says sell and stand aside when it says skip. Our tests cover the candidate trades, not your strategy, so replay it on your own trades through the historical API before you rely on it.
How do I start?
Follow the blueprint for one session: plan after the 16:00 ET close, get live strikes at 09:35 ET, pick one candidate per window, size it from its worst month in the backtest, enter with a limit order and set the exit when you enter. Do nothing on skip.
Is sell-window investment advice?
No. It is data: the trades a backtested rule set would have entered in that session, with their strikes. You decide whether to trade, which candidate, and how many contracts.
When should I call it?
The sell or skip answer for the next session is ready after the 16:00 ET close, so you can plan the evening before. Call it again at or after 09:35 ET for strikes from the live chain; the backtest entered at 09:35 ET.
What does skip mean for positions I already hold?
Skip means no new trade at that expiry in this session. In the backtest, open positions stayed on until their own exit rule closed them, whatever later sessions said.
Why are the strikes different from the last time I called?
Strikes are picked from the option chain at the moment you call, so they follow the underlying and the deltas during the day. The sell or skip answer does not change during the session.
Which plan do I need?
Basic or higher through November 2026, and Growth or higher from December 1, 2026. Backtesting through the historical API needs Alpha.
Can I backtest sell-window myself?
Yes, on the Alpha plan. The historical API returns the same response for any past session. Call it with at set to 09:35 ET on that session to get the strikes the backtest's rules pick at its entry time.
sell-window is a blueprint for selling options: for every session, which expiry, which trade, which strikes and how to exit. Following it cut the deepest drawdown to $255,105 from $958,924 for the same trades sold every session, with a higher Sharpe ratio. Start with one candidate, size from the worst month, follow the exit rule, and treat skip as a reason to wait. Read the docs or see every backtested trade.