SPY · Call or Put before the close, the side chosen by RSI

A copy of the “Call + Put before the close” test that buys only one side each session. At the chosen minute between 15:30 and 15:50 New York the page takes the RSI of the chosen bar size and length: above the upper band it buys one side, below the lower band the other (“reversal” buys the Put when RSI is high and the Call when it is low, “trend” the reverse); between the bands it skips the session or buys both. Options expire the same day; the exit is a sale at the 16:10 bid or intrinsic value at 17:25. Every setting is recalculated in the browser from frozen quotes, 2022–2026.

Frozen NBBO archive: 2022-03-07 — 2026-09-23, sessions: 1142 · RSI from the project’s minute data through 2026-09-24 · New York time · built 2026-09-24.

By year

Every entry clock and strike

lossprofit· click a cell to select that variant

Cumulative result

Starts from zero on the first day of the period; days without an entry leave it unchanged. It sums trade P&L and is not an account balance. Dots between the panels mark sessions with an after-close report from the basket below. Hover, or focus the chart and use the arrow keys; a click opens the day in the table.

Every trading date

How it is calculated
  • RSI. Wilder’s RSI on regular-session bars of the chosen size from the project’s minute data (from September 2021, so every length is warmed up by 2022); bars are aligned to 09:30, an hour bar runs 09:30–10:30 … 15:30–16:00, and a bar’s close is its last minute. At the entry clock the RSI uses every bar that ended by then plus the bar in progress with the price of the minute before the clock as its close — what a live chart shows then: the day bar is always in progress, a 5-minute bar ending exactly at the clock is complete. The rule compares it with the two bands, bounds included: at or above the upper band one side, at or below the lower band the other, in between the choice in the form. Sessions without RSI (half-days) are skipped.
  • Default and the search. Every one of 2,744 RSI rules (4 bar sizes × 7 lengths × 2 directions × 25 pairs of bands × skip or both between them) was tried against 160 trade settings (entry clock, OTM step, exit and lock, filters) on QQQ, SPY and IWM — 439,040 variants per ETF. The default is the QQQ variant with the largest total without its three best days on 2022–2024, averaged with its neighbours (length one step either way, each band 10 points either way), so a single lucky cell cannot win; 2025–2026 is the check. Picked on the three ETFs together, no rule makes money on 2022–2024; the QQQ pick loses on SPY and IWM. Details: docs/QQQ_CALL_PUT_CLOSE_RESULTS.md, section 19.
  • Data. Minute NBBO snapshots and the full quote stream of SPY 0DTE options from the project archive; the SPY price is the last completed minute.
  • Strike. Chosen from the SPY price at the entry minute. OTM: the Call is the nearest strike strictly above the price, the Put strictly below; ITM is the reverse. “+N steps” moves N strikes further out in the same direction ($1 per step).
  • Entry. Buy at the ask of the entry-minute snapshot. The quote must be valid, the ask at least $0.01 with at least one contract displayed, and no older than the chosen limit. The project rule is 15 s; far OTM quotes often stand unchanged longer, so the default allows 5 minutes.
  • 16:10 exit. Sell at a bid no older than 15 s. Without one, the first positive bid before 16:15. Contracts the bid size could not take are valued at intrinsic value from the SPY price at 16:15.
  • 17:25 exit. Intrinsic value from the SPY price at 17:25 (a minute no older than 4 minutes). The option is assumed exercised before 17:30 and the share position closed at that price. This is not an observed trade.
  • Profit lock. From the minute after entry until the scheduled exit, the page checks the SPY price every minute. As soon as the intrinsic value of the whole position reaches the chosen multiple of the money spent (fees included), the position is closed at that price: before 16:15 by selling the options, later by trading SPY shares after hours and exercising the options, which locks at least the intrinsic value. Otherwise the scheduled exit applies. A leg with no intrinsic value at that minute counts as closed at $0, a conservative choice that ignores its remaining time value. Minute closes are trade prices, not executable quotes; after-hours trading and exercise deadlines depend on the broker.
  • Lock method. “Close the position” works as described above. “Hedge with shares”: the options are kept to 17:25; at the lock minute every in-the-money leg is hedged with 100 SPY shares per contract (a Call by selling shares, a Put by buying them), so its intrinsic value at that minute is kept, and if SPY comes back through the strike, the other side of the position gains again. That is the same as buying a deep in-the-money option of the other kind, without paying its spread. “Delta hedge”: at the lock minute every leg is hedged with shares by its Black–Scholes delta (volatility implied from the entry mid price, time to 17:30), and the hedge is reset every minute in which the delta has moved by 0.05; if no volatility can be implied, the leg gets the plain share hedge. Shares are closed at the 17:25 price. Costs: $1 per 100 shares for the share hedge, 1 cent a share for every delta-hedge trade. Both hedges apply only to the 17:25 exit, since they need the after-hours minutes. All lock methods compared, including a vertical spread and a bought in-the-money option.
  • Stability. Besides the total, the page shows how many calendar months ended in profit, on what share of the sessions the running total stood above zero, each year under the chart, and every year beside the pair and each single side at the same settings.
  • $1000 a day. The page opens with $1000 of options a day. With the daily budget it also shows the return on capital: the budget plus the largest drawdown the rule went through, and that result scaled to 252 sessions a year without compounding.
  • Costs. Share trades after the close cost 1 cent a share in the model ($1 per 100 shares for a share hedge); the form can double or triple that for wider after-hours spreads, and can add 1–2 cents to the price of every contract bought.
  • SPY and IWM. The same page and model run on their own snapshots from the same archive. The report-day basket is the same; the 30-minute volatility filter is QQQ-only because its thresholds are QQQ quartiles.
  • Minimum per share order. Some brokers charge at least $0.35 or $1.00 for a share order. The share costs above already include $0.0035 a share, so each order adds only what it lacks to that minimum. The share hedge and a close after 16:15 trade 100 shares per contract and are barely touched; the delta hedge trades small lots many times, so the minimum costs it most with one contract and matters less as contracts are added.
  • Report days. The project research basket: AAPL, MSFT, NVDA, AMZN, META, Alphabet, TSLA, AVGO, AMD, MU. All of them publish results after the close; the dates come from the Nasdaq calendar saved in the project (sessions in the period: 137). The largest late moves happen on these days, so a profit lock can cut them short: the “hold” mode disables the lock on report days only.
  • Hedge fills. A lock is decided on a minute’s closing price, which is gone by then. By default every share trade of a hedge fills at the first minute open after its signal (the archive’s verified minute bars); “signal minute price” shows the earlier, optimistic model. Found by the execution audit in research/qqq_call_put_close_2026-09-24.
  • Strike by delta, spread and VIX. Strike by delta: of the four OTM steps, the one whose Black–Scholes delta at entry (volatility from the quote mid, to the 17:30 cut-off) is nearest to the target, so “how far out” follows the price and volatility of the year. Minimum price in % of the ETF: the same idea for the option price. Spread: the pair’s combined bid/ask spread at entry over its combined ask. VIX: the Cboe close of the previous session (data/vix_prices_v1.json). All are known before the entry.
  • Filters. Activity: the SPY range (high minus low over the first price) of the minute closes in the 15 minutes before entry, either at least a fixed percentage or at least a share of the median 15:30–15:45 range of the previous 20 sessions. Minimum price: both options must cost at least this much at entry; very cheap options mark quiet sessions and are mostly fees. Evenings: the mean after-hours range (16:15–17:25) of the previous 10 sessions; 0.19% and 0.25% are the median and the upper third of January–June. Every filter uses only data known before the entry. How the filters were checked.
  • 30-minute volatility. From the study research/qqq_late_move_2026-09-24: 100 × the square root of the sum of squared one-minute QQQ returns from 15:15 to entry. Its groups are fixed by the quartiles of 2023–2024: low ≤ 0.122%, high ≥ 0.218%, so 2026 never shaped them. The window needs QQQ from 15:15, so the filter works for entries from 15:45. How it did on this pair.
  • Fees are charged for every contract bought and sold. When intrinsic value does not cover the fee, the option is not exercised and the exit is worth nothing.
  • Several contracts per leg are bought at the same ask; with displayed sizes respected, a leg gets no more than the ask size shown at entry. Everything else, fees and share hedges included, scales with the count.
  • Budget is split equally between the selected legs. Contracts per leg = leg budget ÷ (ask × 100 + fee), rounded down. With displayed sizes respected, a purchase is capped by the ask size and a 16:10 sale by the bid size.
  • Limits. Quotes do not prove fills; latency, queue position and slippage are not modeled. The default was chosen among many variants on 2022–2024, so only its 2025–2026 result is out of sample, and even that follows a choice among several ways of picking; a rule that works on QQQ but not on SPY and IWM may be luck. A reliable check needs future sessions with the rule fixed in advance.
  • Reproduction. The quote facts are the call-put-close snapshots (python -m scripts.build_qqq_call_put_page), RSI python -m scripts.build_call_put_close_rsi --symbol SPY, the search research/qqq_call_put_close_rsi_2026-09-25. The page uses the model of the original test, which matches independent Python calculations to the cent.