SPY · Deep ITM 0DTE between levels: a Put at a resistance, a Call at a support, out at the opposite level

Trading inside the levels instead of a purchase at 09:35. The levels are known at 09:35 and found automatically: the previous session’s high, low and close, its pivots, the pre-market and 09:30–09:35 highs and lows, round numbers. When during the regular session (09:36–15:59) the SPY price comes up to a level above it, the page buys the deep in-the-money Put expiring that day (strike − premium = the price within the tolerance); when it comes down to a level below, the Call. Only with leverage (the price ÷ the ask) of ×80 or more, that is no deeper than about 1.25% in the money: when the formula needs a deeper strike the market prices in a large move, and the trade is skipped. The loss of a trade cannot exceed its premium. The position is sold at the bid when the price reaches the nearest level on the other side (at least the chosen distance away); otherwise it is closed at the end of the day: sold at the bid at 16:10 or exercised at 17:25. About $10,000 a trade, one position at a time. Every setting below is recalculated in the browser from frozen quotes.

SPY · 2023: no data yet

The sessions of SPY in 2023 are still being collected, or the page snapshot for this year is not built yet. The tool appears here as soon as it is.

Ready for SPY: 2026.

How it is calculated
  • Levels. Known at 09:35, from one-minute bars: the previous session’s regular-hours high, low and close; its classic floor pivots (P = (high + low + close) ÷ 3, R1 = 2P − low, S1 = 2P − high, R2 = P + (high − low), S2 = P − (high − low)); today’s pre-market (04:00–09:30) high and low; the high and low of 09:30–09:35; round numbers (multiples of $5, below $300 of $2.50) within 5% of the 09:35 price. Levels within 0.05% of each other count as one.
  • Touch and entry. A touch is a minute bar of 09:35–15:58 whose high reaches a level above the price (a resistance) or whose low reaches a level below it (a support), after the price closed at least 0.1% away from that level; the level then waits until a close 0.1% away again. At a resistance the page buys a Put, at a support a Call, at the ask of the NBBO at the end of that minute, with the SPY price of that minute (the bar’s close) in the formula: strike ± premium = the price within the tolerance, leverage (price ÷ ask) at least the chosen one. When no strike fits, or no level lies far enough for a target, the touch is skipped. One position at a time: touches while it is open are skipped. If one bar touches levels on both sides, the Put comes first.
  • Target and exit. The target is the nearest level beyond the entry price in the trade’s favour (a Put: below, a Call: above) at least the chosen distance (0.1–0.5%) from it. When a later bar’s low (a Put) or high (a Call) reaches it, by the 15:59 bar, the position is sold at the bid of the NBBO at the end of that minute (with “exercise” for a bid below intrinsic value, exercised at intrinsic value from the price then) and the next touch can open a new trade. Otherwise the position is closed at the day’s exit below and that day has no more trades. The budget is per trade.
  • Data of the touches. For every touch, the NBBO then (the last quote since 09:30) of every listed in-the-money strike of that side up to 1.3% deep from the price then (leverage ×80 is about 1.25%), and for every contract some setting can buy there its NBBO at each minute a target is reached and at the sale minute (Massive, the /v3/quotes history). Minute bars: QQQ, SPY and IWM from the project’s minute archive, SMH from Massive minute bars. Only 2026 is collected for now.
  • Expiry. The same session: 0DTE. A session without a same-day expiry (by the vendor’s list of contracts) is not traded and stays out of the table. Options on SPY expire every session since late 2022; before that on Mondays, Wednesdays and Fridays.
  • Leverage = the SPY price at the purchase ÷ the option’s ask: how many dollars of shares one dollar of premium moves like. A purchase needs at least the chosen leverage (×80 by default), so the option is at most about 1.25% in the money.
  • Sale at 16:10. At the bid of the NBBO standing at that minute, when it is no older than 5 minutes and covers the fee. The shares stop trading at 16:00, options on SPY at 16:15, so at 16:10 the option still has a market. The bid of a deep in-the-money option is often below its intrinsic value (the price minus the strike for a Call, the strike minus the price for a Put): the field “If the bid is below intrinsic value” either sells at the bid anyway (the default) or exercises the option (they are American) at intrinsic value from the SPY price at that minute. Contracts not sold at the bid are exercised at intrinsic value when it covers the fee; otherwise they count as $0 without a fee. When the vendor has no quote of the option since 15:00 at all, the session has no result and is left out of the totals.
  • Exercise at 17:25. Until 17:30 New York the holder of an expiring option decides whether to exercise it, whatever the 16:00 price was. The page exercises at 17:25 when the intrinsic value from the SPY price then (its last trade before 17:25, in the evening session) covers the fee, and counts that value: the shares delivered at the strike are taken as sold (a Put: bought back) at that price, without the shares’ spread or fees. When the option is out of the money at 17:25 it expires at $0 and the premium is lost.
  • Fees are charged for every contract bought and sold (or exercised); $0.65 by default.
  • The same in shares. For comparison: as many shares as each trade’s options cover (100 per contract; for a Put, sold short), from its purchase price to its exit price, without fees or spread.
  • Best variant. The page opens on the best variant of the whole year at $10,000 a trade, leverage ×80 or more, a $0.65 fee, displayed sizes ignored, the strike closest to the formula and touches without a fitting strike skipped: among the variants (side × exit × formula price × tolerance × distance to the target and, for the end-of-day sale at the bid, selling or exercising when the bid is below intrinsic value) that trade on at least half of the sessions, the one with the largest total without its three best sessions; ties go to the larger total. It is picked on the same sessions its result comes from, so that result is overstated.
  • Limits. Quotes do not prove fills; latency, queue position and slippage are not modeled, and five minutes after the open spreads are still wider than later in the day. Buying tens of contracts at once can take more than the displayed ask size. The best variant is chosen in-sample, on the year it is shown on: a rule that looks good in one year needs checking on the other years.
  • Reproduction. The sessions are collected by python -B scripts/collect_deep_itm_0dte.py --symbols SPY (one file per session; a session already on disk is not requested again), and the page snapshot is built from them without new requests by python -B scripts/build_deep_itm_0dte_page.py --symbols SPY --years 2023. The browser prices every setting with public/static/deep-itm-0dte-model.js; money is counted in hundredths of a cent, so results are exact to the cent.