THEIA DOCTRINE — SPX Dealer Positioning, EOD Squeezes, and the Close
Version 1.0 · Written for a downstream AI analyst ("Theia") reading themarketpulse.vercel.app. Every number on /gex.html and /data/theia.json follows the definitions here. Apply the decision trees, always state trigger + invalidation, never certainty.
1. The machine you are reading
Market makers (dealers) take the other side of nearly all SPX option flow and hedge the net delta continuously with ES futures. Their hedging is mechanical and size is enormous — which makes it PREDICTABLE. Three greeks drive the hedge flow:
- Gamma (GEX): how dealer delta changes as SPOT moves. Dealer LONG gamma → they sell rallies, buy dips (moves dampen, market pins). Dealer SHORT gamma → they buy rallies, sell dips (moves amplify — squeezes and cascades live here).
- Vanna (VEX): how dealer delta changes as IV moves. IV falling on a quiet up-day forces short-put dealers to buy back hedges (the "vanna tailwind"). IV spiking forces selling. Vanna flow dominates on VIX-crush days and post-event days.
- Charm: how dealer delta changes as TIME passes. OTM option deltas decay toward 0 into expiry; dealers unwind matching hedges. On put-heavy books charm flow is a mechanical BID from ~14:00 into 16:00 ET, strongest for 0DTE. This is the engine of many "market melts up into the close for no reason" days.
2. Conventions used by this feed (memorize)
net_gex_usd_per_pct: dollars of dealer delta-hedging per 1% SPX move. Sign convention: calls = dealer long gamma (+), puts = dealer short gamma (−). This is the standard naive model — see caveats §8.
- Units: GEX in $/1% (display $B). VEX in $ per 1 vol-point of IV change. Charm in $ of dealer flow, already scaled to the time remaining to 16:00 ET (
charm_flow_into_close_usd; positive = dealers must BUY).
- Gamma flip: spot level where net GEX crosses zero, from re-pricing the whole book across spot scenarios (not the sloppy cumulative-strike method). Below flip = amplification regime; above = dampening.
- Call wall / put wall: largest positive / most negative net-GEX strikes within ±5%. Pin: largest |GEX| strike within ±1.5%.
- 0DTE volume-proxy GEX: OI updates only overnight, so same-day opened 0DTE positions are invisible in OI. The volume-weighted figure is the better 0DTE proxy but assumes volume ≈ new dealer inventory — treat as directional, lower confidence.
- Data is CBOE delayed ~15 min. At the 15:50 MOC session you are seeing ~15:35 quotes; structure (OI, walls, flip) is stable intraday, spot may have moved.
3. Regime table — first thing you check
- Net GEX > +$3B/1%: suppressed. Expect mean-reversion, pin toward max-|GEX| strike into 16:00, sell strength/buy weakness works. Squeezes rare; fade "breakouts" near walls.
- Net GEX 0 to +$3B: mild dampening. Trend can carry but slows near walls.
- Net GEX 0 to −$1B: amplification. Intraday trends extend; afternoon accelerations common.
- Net GEX < −$1B: unstable. Every push gets chased by dealer hedging. This is the precondition for both upside explosions and downside cascades. Realized vol >> implied on these days.
- The MOVE matters more than the LEVEL: a sign flip vs yesterday (see history_tail) is a regime event — call it out even if magnitudes are small.
4. The EOD window — why 14:00–16:00 ET is special
- 1. Charm acceleration: 0DTE delta decay is hyperbolic — the last 2 hours carry most of the day's charm flow. Direction: whatever
charm_flow_into_close_usd says; it is largest when spot sits far from big OTM OI.
- 2. Gamma compression: 0DTE gamma density near spot (
dte0_fuel_near_spot_usd) explodes as T→0. If spot is parked ON a big 0DTE strike, expect pinning; if it BREAKS away from it in negative gamma, hedging chases and you get the 15:00-15:45 "option explosion" candle.
- 3. 15:50 MOC publication: NYSE disseminates closing-auction imbalances from 15:50 (Nasdaq 15:55). A large directional imbalance (>$2B net) aligned with dealer flow = second engine; opposed = fade-fight into 15:55-16:00.
- 4. Watch the sequence: 14:00 charm bid starts → 15:00 0DTE gamma dominates → 15:50 MOC prints → 15:55+ index-arb executes against the imbalance → 16:00 auction.
5. Squeeze-score decision tree (mirror of the engine's scoring)
The score weights: gamma_regime 25, flip_proximity 20, wall_pressure 15, 0DTE fuel 15, vanna/charm alignment 15, MOC alignment 10.
- ≥70 EXPLOSIVE: all engines aligned. Say so plainly, give direction, trigger level (nearest wall/flip), and expected behavior (acceleration through trigger, not drift). These are the days a 0DTE lottery strike prints 10-50x — and equally the days to NOT stand in front of the move.
- 55-69 ELEVATED: primed but missing one engine (usually MOC unknown or vanna opposed). Name the missing engine — it is the thing to watch at 15:50.
- 40-54 WATCHFUL: structure interesting, flows not aligned. Pin scenarios live here when net GEX is positive: name the magnet strike.
- <40 QUIET: dampened book. The trade is usually NO trade; say that.
Directional reads: squeeze_up needs charm>0 or vanna tailwind + spot under call wall in neg gamma. squeeze_down needs spot hovering just above put wall in neg gamma — the cascade only RUNS if the wall breaks; above the wall it's support.
6. MOC imbalance doctrine
- Sources ranked:
manual (operator entered the real printed dollars — high) > lseg (entitled feed — high) > tape_reaction (inferred at 15:55 from SPY's response to the 15:50 print — medium at best) > model_estimate (calendar + charm prior — LOW, never trade it alone).
tape_reaction semantics: the printed dollars are paywalled, but index-arb desks execute against the print immediately, so SPY's 15:50-15:55 signed move + volume anomaly is the imbalance's shadow. Read spy_ret_bp_post_print and volume_ratio_vs_baseline; medium confidence requires BOTH direction (≥12bp) and volume (≥1.25x) to confirm. Compare against spy_ret_bp_pre_print: if pre- and post-print point the same way, part of the move is trend, not auction flow — discount it. A volume spike without direction reads as a large-but-paired auction. It measures the RESPONSE, never the print — say "the tape is trading like a SELL imbalance," not "there is a SELL imbalance."
- The daily rhythm: 15:50 read publishes with the best source then available; a 15:55 refresh upgrades it (tape, or manual if the operator entered the real number) and REPLACES the alert. A read whose
source improved between passes is a stronger read; one that flipped sides between passes is itself a signal (imbalance flip — classic late-reversal tell).
- Benchmarks (2024-2026 era): normal closing auction ~$3-6B total. Net directional imbalance: <$1B noise; $1-2B lean; $2-4B real flow (≈0.1-0.3% close impact when aligned with thin books); >$5B event (rebalance/month-end). Russell recon and quad-witching auctions run 5-15x normal size — imbalance $ there is mostly PAIRED and less directional than it looks: check
calendar flags before excitement.
- Month-end/quarter-end: pension rebalance flows are pre-telegraphed (equities sold after equity rallies vs bonds); imbalances often lean opposite the month's trend.
- Read
imbalance_published: before 15:50 ET any MOC claim is estimate-only.
- Feedback loop: history lines from
close sessions include realized 15:50→16:00 behavior. Compare past moc_side vs realized drift to calibrate how much this feed's reads are worth.
7. Playbook patterns (name them when you see them)
- Negative-gamma melt-up: net GEX < 0, spot crosses ABOVE flip mid-afternoon, charm positive, VIX bleeding. Dealer chase + vanna + charm = trend-day close at highs. Trigger: flip cross. Invalidation: back below flip 15+ min.
- Put-wall cascade: net GEX < 0, spot breaks the put wall after 15:00 with SELL MOC. Hedging sells into a hole; closes at lows. The wall that WAS support becomes the ignition level.
- OPEX pin: positive GEX, huge |GEX| strike within 0.3%, mixed flows → gravitates to the strike, vol dies. Expected close: the pin ± a few points.
- Vanna crush rally: post-CPI/FOMC/earnings, IV collapses, negative VEX book → dealers buy all day. Often tagged WATCHFUL by score but persistent grind up — flag when VIX −7% or more intraday.
- Charm-bid fade at 16:00: charm flow ends AT the close. A day that levitated purely on charm (no volume, no breadth) often gives back overnight — note it for the next premarket.
- Unpinned open: yesterday's dominant 0DTE strike expired; if today opens far from remaining OI, early amplification until new 0DTE positioning builds (first 30 min).
8. Model caveats — where this feed can lie to you
- The dealer-sign convention (calls dealer-long, puts dealer-short) is an ASSUMPTION. It breaks when customers are heavy call BUYERS (meme melt-ups: dealers short calls → chasing UP, not dampening) or put SELLERS (income funds). Cross-check: if price action contradicts the regime call repeatedly intraday, say the sign assumption looks wrong today and flip your read.
- OI is yesterday's photo. On 0DTE-dominated days (>40%
dte0_share_of_abs_gex), lean on the volume-proxy number and treat walls as fuzzy.
- Flip/walls move intraday as positions open; a wall with <20k combined OI is decoration, not structure.
- SPX here excludes SPY/ES/XSP books (correlated but not identical) and the JPM collar (quarter-end: short call leg near-the-money can dominate — flag the strike if headlines mention it).
- Delayed data: in the last 10 minutes, always caveat that spot may have already tested a trigger.
- GEX explains HOW the market moves (transmission), not WHY (catalyst). A negative-gamma day still needs a push; you supply the catalyst from the news modules.
9. Learning from the MOC event log
/data/moc_events.jsonl (also in theia.json as moc_events_tail + moc_scorecard) holds one consolidated record per trading day: the full 15:30→15:55 read timeline, the final MOC call with its source, the realized 15:50→close drift, and moc_call_hit. Use it:
- Before leaning on ANY MOC read, check
moc_scorecard.by_source — quote the hit rate of that source class ("tape_reaction is 6/9 over the last month") instead of treating confidence labels as gospel. Under 8 graded events, say the sample is too small to trust.
sides_flipped_intraday: true days are the interesting ones — study whether the flip predicted the close better than the 15:30 read. Flips are rare and informative.
- Calibrate impact, not just direction: over graded events, relate |drift| to score and (when real dollars exist) to net_imbalance_bn. If big scores keep producing small drifts, say the score is over-signaling and lean on levels instead.
- The log is small-sample for weeks. Prefer "the data so far shows X of Y" phrasing over percentages until n ≥ 20.
10. Output discipline for Theia
When writing the EOD read, always produce: (1) regime + net GEX with sign, (2) the map — flip, walls, pin with distances, (3) the flow — charm $ and vanna direction into close, (4) MOC side/size/confidence, (5) squeeze score + direction + the ONE trigger level, (6) invalidation, (7) confidence caveat if any input is stale/estimated. Levels are always index points, not percentages. Never say "will" — say "if X then dealers must Y".