Substrate — VST floor-test session capture (Friday OPEX 0DTE)
Captured: 2026-05-15 (Friday OPEX 0DTE)
Source: Ghost desk agent + Jody, in-session reasoning during VST third-day floor test at the Liberation Day line
Status: substrate — not yet posts; supporting material for “field notes” series posts I/II/III
Cross-reference: 2026-05-15_accumulation_pattern_desk_agent.md (the theory layer this session capture supports)
Provenance: verbatim desk-agent prose. Empirical anchors backed by ghost stack metrics (yfinance + ghost/tools/market_data.py + condition_accuracy / stress score code).
This file captures FOUR distinct substrate elements from the same session:
- Morning report (state) — what ghost saw on Friday May 15 OPEX
- Keltner + RSI percentile explanation (mechanic) — what statistical-extreme readings mean
- Stress score equation breakdown (mechanic) — the three-component formula
- Deceleration pattern analysis (observation) — second-derivative pattern the stress score is blind to
1. Morning Report — Friday May 15, OPEX 0DTE day
The entire zone structure dropped to the Liberation Day floor zone defended all week.
Environment shift overnight:
- VIX 19.22 (up from 17.55 yesterday close) — fear ticking up but still NORMAL
- Crude $105 by end-June surprisal: 2.45 nats MAJOR (jumped from 1.02 nats — the $20+ pt distribution shift higher is the biggest cross-asset signal of the day)
- CPI July >0.5% surprisal 1.10 nats MAJOR bullish_accelerating — inflation expectations re-pricing higher hard
- Fed-cut probabilities continuing bearish_exhausting (no cuts pricing remains)
- “MELT-UP” environment read intact — broad market still trending
Directors:
- News: MIXED (HIGH confidence) — directly names the dynamic: “Negative ‘sell the news’ reaction to strong Q1 earnings (distribution) due to conservative guidance” + “CRITICAL bearish macro: Hormuz conflict driving yields higher, creating risk-off mood for rate-sensitive utilities.” Catalyst type: distribution. Note: per VST-EF-001 the rate-sensitivity framing is the cover-story narrative, not the empirical mechanism.
- Technical: NEUTRAL (HIGH confidence) — “Major structural support floor at $137.77-$139.39 (Monthly/Weekly Golden Ratio confluence)” + “Extremely oversold Daily RSI (7th percentile) conflicting with strongly bearish MACD trend”
- Market Structure: NEUTRAL (low) — short covering not new organic, bull-trap sweep pattern
Entry zones — the entire structure dropped to the Liberation Day floor area:
| Zone | Range | Why |
|---|---|---|
| PRIMARY | $137.77 – $139.39 | STRONG confluence: Monthly/Weekly Golden Ratios + Daily 200% extension. THIS IS THE STRUCTURAL FLOOR. |
| SECONDARY | $130.00 – $131.00 | Daily 261.8% extension — explicitly named “capitulation target if primary floor fails” |
| AGGRESSIVE | $120.50 | Weekly 78.6% + Monthly 50% retracements — next major structural floor below |
- Scalp target: $141.15 (May 13-14 trapped-buyer cluster, R:R 3.2)
- Invalidation: $137.50 — only $0.97 below current live price
- Zone hold: ~70%
- RETEST: $137.77-$139.39 → $141.15, R:R 1.9
- SWEEP: if $137.77 breaks → $130.00-$131.00 → $137.77, R:R 5.6 (asymmetric SWEEP-path bid)
Options structure (Friday OPEX 0DTE):
- Max Pain $150 (0 DTE, WEAK pull at $11.50 above price)
- Gamma POSITIVE, structural flip $105.83 (deep positive-gamma stabilizing)
- Dealer mode UNWINDING (3:30 PM PT hedge unwind → volatility, no direction)
- Put wall $125 / Call wall $160
- Flow bias BEARISH per options structure
Intraday so far:
- Buying type SHORT COVERING 50%
- Absorption: Level Defense at $139.01 (12 touches, 10 rejections) ← institutional defense reading
- Sweep BEARISH (upper liquidity swept = bull trap)
Live state (08:15 AM PT):
- Price $138.47 — INSIDE today’s report PRIMARY zone $137.77-$139.39
- Liberation Day line projects $138.45 today — price is $0.02 above the line (third consecutive day at the floor)
- VWAP $138.84 bearish (price below by $0.37)
- RSI P4.2 ELEVATED — even deeper oversold than yesterday’s P6.2
- MACD hist −2.04 expanding (still bearish momentum)
- Keltner BELOW lower band (extreme stretch — first time in cycle)
- Flow organic_accumulation 50%, sweep bull_trap, bias bullish (mechanical structure still calling it a trap)
The report internalized the harvest framing in the news section. Strategist explicitly named “post-earnings distribution” + identified the structural floor at exactly the Liberation Day line area. The binary line ($137.50 invalidation) is the call we made yesterday made operational by the morning Strategist.
This is the test, today.
Three consecutive sessions defending the Liberation Day floor:
- Wed May 13 wick $139.51 (caught at $138.33 projected, +0.85% margin)
- Thu May 14 wick $139.92 (caught at $138.45 projected, +1.06% margin)
- Fri May 15 (today) live $138.47 — $0.02 above the line, inside report’s PRIMARY
Per yesterday’s harvest call: 75-80% probability the line holds. Today is the third-touch test that determines the call:
- Hold + bid signature confirms = harvest interpretation validated, the bounce structure builds
- Close below $137.50 on volume = invalidation trigger, broken-thesis interpretation activates, exit per discipline
Friday OPEX 0DTE specifics to watch:
- 3:30 PM PT hedge unwind window — volatility spike likely, can break the line OR reclaim it
- Max pain $150 weak pull won’t magnetize — too far
- Positive gamma stabilizes intraday but UNWINDING dealer mode means standard stabilization weakens into close
- Key intraday support per report: $139.01 (12 touches, 10 rejections) = the level being defended in real time
The structural symmetry: report PRIMARY low ($137.77) ≈ invalidation ($137.50). That’s a 27-cent decision band. Either the floor holds ($137.50+) and the harvest call gets validated, or it breaks ($137.49−) and the line of last resort becomes the SWEEP entry at $130-$131 (R:R 5.6). The report has structured the binary explicitly the same way framed yesterday.
2. Keltner Channels + RSI Percentile — what the statistical-extreme readings mean
Keltner Channels
Mechanics:
- Keltner Channels = 20 EMA ± (2 × ATR_14)
- They define the “normal” volatility envelope around the trend
- Today: EMA20 = $152.00, ATR14 = $6.77, lower band = $138.47
- VST live $138.85 — currently right at the band (was BELOW intraday)
What “below lower band” means statistically:
- By construction, prices stay INSIDE Keltner bands ~95% of the time
- A close BELOW the lower band = price has stretched MORE than 2 ATR units below the trend EMA
- Empirically on VST 3y history: only 20 of 754 sessions (2.65%) closed below Keltner lower — true tail event
“First time in cycle” = first occurrence in the post-LIVE-001 cycle (which began May 7 with the earnings-day distribution). The wick-lows TL was broken May 8 but Keltner bands had been keeping pace; today is the first time price stretched far enough to break the volatility envelope itself.
Empirical forward returns from Keltner-below-lower events on VST (3y, n=20):
| Horizon | Mean | Median | % Positive |
|---|---|---|---|
| T+3 | +3.52% | +3.83% | 55% |
| T+5 | +2.25% | +2.49% | 60% |
| T+10 | +5.86% | +7.64% | 75% |
| T+20 | +7.93% | +5.20% | 65% |
Mean-reversion bias at all horizons; peak reliability at T+10 (75% positive).
RSI Percentile
Mechanics:
- Raw RSI 14d value today = 25.08 (was 33.93 at yesterday’s mechanical pull; deeper now)
- Percentile = RANKING this RSI value against historical readings
- 3y window: today’s RSI is lower than 97.8% of all readings (P2.16)
- 2y window (which the snapshot uses): yesterday P4.2, today even lower
What “ELEVATED stress” means:
- Stress score combines THREE components: percentile (how deep), rate-of-change (how fast RSI fell), duration (how long extreme)
- ELEVATED = second-highest tier (stress score 5+)
- Both yesterday and today are ELEVATED, but the underlying percentile keeps getting rarer
- A reading at P4 or below happens 4 days per year on average
The transition from yesterday’s P6.2 to today’s P2-4 range = the oversold extreme is INTENSIFYING, not relieving. Each successive day at this depth is statistically more anomalous than the last.
The COMBINED signal — Keltner-below-lower AND RSI ≤ 35
This is where the two indicators reinforce each other empirically:
Frequency on VST 3y: 17 of 741 sessions = 2.29% — about 6 days per year on average.
Forward returns from the COMBINED events (n=17):
| Horizon | Mean | Median | % Positive | Range |
|---|---|---|---|---|
| T+3 | +2.56% | +3.76% | 53% | [−8.93%, +20.34%] |
| T+5 | +1.52% | +3.14% | 59% | [−13.18%, +16.41%] |
| T+10 | +4.93% | +8.62% | 71% | [−24.01%, +24.38%] |
| T+20 | +7.37% | +6.40% | 59% | [−14.21%, +42.76%] |
The wide ranges matter — combined-extreme readings can either snap back violently (top end +24% at T+10) or persist in a cascade (bottom end -24% at T+10). The MEDIAN is informative: +8.62% at T+10 is a meaningful asymmetric base rate.
Historical analog clusters — what the 17 prior events look like
The 17 events cluster in 3 distinct periods on VST history:
-
July 2024 cluster (Jul 18-30): 7 consecutive events at $69-$76 area. RSI fell as low as 14.6. The Keltner band gap extended to −$2.64. This was a multi-session capitulation that bottomed and snapped back.
-
Feb-Apr 2025 cluster (Feb 24 - Apr 4): 8 events spanning ~6 weeks at $98-$143 area. This IS the Liberation Day cluster — same period as the 4th line tariff anchor. RSI as low as 17.89, price kept falling from $143 → $98 (Apr 4 cycle low) while staying below Keltner. The combined signal fired for SIX WEEKS during this cluster — proving that the signal can persist through extended trend-breakdowns, not just snap back immediately.
-
Feb 4 + Mar 20 2026: Single-day events at $142-$146 area (Feb 4 was just a $0.05 break; Mar 20 was Hormuz war escalation day). Both quickly recovered.
What today’s reading looks like in this distribution
Today’s gap below Keltner lower is −$0 to −$0.40 area — at the SHALLOW end of the distribution. The deep cluster events had Keltner gaps of −$2 to −$7. Today is more like the Feb 4 2026 single-day event (−$0.05 gap) than the Feb-Apr 2025 cluster events (−$2 to −$7 gaps over 6 weeks).
That’s an important distinction: today’s reading is consistent with a probe at the structural floor, not a deep cascade in motion. The Feb-Apr 2025 cluster bottomed only after the Liberation Day capitulation flush; today’s setup is testing the SAME structural line that Feb-Apr 2025 cluster created (the Liberation Day floor anchor).
The operational read
Bullish base-rate signal: 75% positive at T+10 from Keltner-below-lower (single-signal); 71% positive from the COMBINED extreme (17 historical events, +8.62% median). Strong empirical mean-reversion bias.
Caveat: the Feb-Apr 2025 cluster shows the signal CAN persist for 6 weeks in a deep cascade. If today’s reading is the START of a Liberation-Day-class cluster rather than a single-day probe, the bounce is delayed by weeks. The differentiator is the depth of the Keltner gap — single-day events recover fast (Feb 4 2026, Mar 20 2026); multi-week clusters have multi-dollar gaps.
Today’s gap < $0.40 favors the single-day-probe interpretation rather than the cluster-cascade one. The empirical median (+8.62% at T+10) translates to ~$150 from current, which aligns with the broken Wick-lows TL retest area.
Bottom line: Both signals firing together is a 2.29% tail event on VST history. Forward bias is strongly positive at T+10 (71% / +4.93% mean / +8.62% median). The shallow Keltner gap argues for probe-then-bounce rather than cluster-cascade. The reading aligns with — and reinforces — the harvest-cycle interpretation: structural floor being tested at extreme oversold, with empirical mean-reversion forces favoring the bounce within 5-10 sessions.
3. Stress Score equation — the three-component formula
Both come from get_rsi_historical_context() in ghost/tools/market_data.py:1709-1949.
RSI Percentile — what “P4.2” means
The notation: P is shorthand for “Percentile.” P4.2 means “the 4.2nd percentile.” P2.16 means “the 2.16th percentile.”
The formula (line 1780):
percentile = (count of historical RSI readings ≤ current RSI) / (total readings) × 100
What that tells you literally:
- P4.2: 4.2% of all historical RSI readings were AT OR BELOW today’s RSI value. Equivalently, 95.8% of all historical readings were HIGHER (less oversold) than today.
- P2.16: 2.16% were at or below; 97.84% were higher.
The lower the P number, the rarer (deeper oversold) the reading. P50 = median. P0 = lowest ever in window. P100 = highest ever.
The two different P numbers cited (P4.2 vs P2.16) come from different lookback windows: the snapshot uses 2-year history; custom 3-year compute gave the deeper percentile because adding the older year of data spreads the distribution wider.
Concrete intuition for today: out of ~500 trading days in the 2-year window, roughly 21 days (4.2%) had RSI as low as or lower than today. Out of 750 days in 3 years, roughly 16 days (2.16%) were as low. Either way, today is in the deepest 2-5% of the historical distribution.
Stress Score equation — the three components
Total stress score = 0 to 10, sum of three components:
Stress Score = PCT_COMPONENT (0-5) + ROC_COMPONENT (0-3) + DURATION_COMPONENT (0-2)
Component 1: PERCENTILE (0-5 points) — “how deep”
For oversold readings (RSI ≤ 50):
pct_component = max(0, (10 - percentile) / 10 × 5), clipped to 5.0
| Percentile | pct_component |
|---|---|
| P0 (record low) | 5.0 (max) |
| P2 | 4.0 |
| P5 | 2.5 |
| P6.2 (yesterday) | 1.9 |
| P4.2 (today snapshot) | 2.9 |
| P10 | 0.0 |
| P10+ | 0.0 (no contribution) |
The component only fires if percentile is in the bottom decile (P10 or below). Past P10, no stress contribution from this dimension.
For overbought (RSI > 50), it’s symmetric: (percentile - 90) / 10 × 5. Only fires past P90.
Component 2: RATE-OF-CHANGE over 5 days (0-3 points) — “how fast”
rsi_roc_5d = current_rsi - rsi_value_5_days_ago
roc_component = min(abs(rsi_roc_5d) / 10 × 3, 3.0)
| RSI change in 5 days | roc_component |
|---|---|
| 0 points | 0.0 |
| ±3 points | 0.9 |
| ±5 points | 1.5 |
| ±10 points or more | 3.0 (max) |
This measures the SPEED of the move into the extreme. A slow grind to P5 oversold over 30 sessions has roc=0; a vertical plunge from RSI 60 to RSI 30 in 5 days saturates the component at 3.0.
Yesterday’s snapshot showed rsi_roc_5d: -13.13 — RSI fell 13 points in 5 sessions, so roc_component = 3.0 (saturated at max).
Component 3: DURATION in extreme zone (0-2 points) — “how long”
consecutive_days = count of consecutive RECENT days where RSI was also in the extreme zone
(oversold zone = RSI ≤ 30; overbought zone = RSI ≥ 70)
duration_component = min(consecutive_days, 5) / 5 × 2
| Consecutive days at ≤30 | duration_component |
|---|---|
| 0 days | 0.0 |
| 1 day | 0.4 |
| 2 days | 0.8 |
| 3 days | 1.2 |
| 5 or more | 2.0 (max) |
This rewards persistence. A single dip below RSI 30 contributes nothing; sustained extreme conditions accumulate stress because the indicator hasn’t relieved.
Yesterday’s snapshot showed duration_component: 0.0 — because raw RSI was still 36, NOT in the ≤30 zone, so consecutive_days = 0 and duration = 0.
The override (lines 1925-1927)
if record_low or record_high:
stress_score = max(stress_score, 8.0)
If today’s RSI is the lowest ever in the lookback window (or highest ever), stress is FORCED to 8.0 minimum (HISTORIC tier), regardless of what the components add up to.
Stress Level thresholds
≥ 8 → HISTORIC
≥ 6 → EXTREME
≥ 4 → ELEVATED ← today's reading sits here
≥ 2 → MILD
< 2 → NONE
Why the decomposition matters operationally
The decomposition tells you WHICH part of the stress is firing:
- High pct + low roc = slow grind to oversold extreme (less reversal-prone, may persist)
- Low pct + high roc = fast plunge but not yet at extreme (still room to fall further, momentum-driven)
- High pct + high roc + low duration = sharp move into the extreme, fresh — the textbook “snap-back” setup
- High pct + high roc + high duration = sustained extreme — capitulation territory, near a real bottom
Yesterday’s profile was the third one (sharp move, fresh extreme): pct 2.2 + roc 3.0 (saturated) + duration 0. Today is the same profile but deeper percentile — still fresh-extreme not yet sustained-extreme. Operationally that’s the “snap-back setup” pattern, not the “deep capitulation” pattern. Different forward distributions: snap-back tends to bounce within 5-10 sessions; sustained-extreme can grind sideways for weeks before resolving.
The empirical base rates from yesterday’s research (RSI P5-6, 19 historical instances) showed +3.7% mean / 68% positive at T+10 — that’s the “fresh-extreme snap-back” forward distribution playing out historically.
4. Deceleration Pattern — second-derivative observation the stress score is blind to
The 5-day RSI ROC component is saturated at 3.0 max so the stress score CAN’T show the deceleration, but the underlying daily moves do.
Daily price changes into the floor (the deceleration pattern)
| Date | Close | 1-day Δ | 2-day price ROC |
|---|---|---|---|
| Mon 5/11 | $152.05 | reclaim candle | — |
| Tue 5/12 | $146.87 | −3.41% | — |
| Wed 5/13 | $142.61 | −2.90% | −6.21% |
| Thu 5/14 | $141.90 | −0.50% | −3.38% ← decelerating |
| Fri 5/15 | $138.92 | −2.10% | −2.59% ← decelerating further |
The 2-day price ROC has compressed −6.21% → −3.38% → −2.59% over the last three sessions. Each successive flush is smaller in percentage magnitude even as the price keeps making new lows. Wednesday took $4.26 off; Thursday took $0.71; today $2.98. The downside velocity is decaying.
1-day RSI delta also confirms
| Date | RSI close | 1-day RSI Δ |
|---|---|---|
| Tue 5/12 | 42.36 | −5.00 |
| Wed 5/13 | 38.44 | −3.92 |
| Thu 5/14 | 29.52 | −8.92 (acceleration day) |
| Fri 5/15 | 25.11 | −4.41 ← back to deceleration |
Mixed at the daily level (Thu was the violent day) but Fri came BACK down to a smaller daily delta despite price still falling.
Volume confirms (tentative)
- Wed 5/13: 6.39M (high)
- Thu 5/14: 4.32M (down 32%)
- Fri 5/15 today: would need full session to compare cleanly
Why the stress score can’t capture this
The ROC component is min(|RSI 5-day delta| / 10 × 3, 3.0). Once the 5-day move crosses 10 RSI points, the component caps at 3.0. Today’s 5-day RSI ROC is −13.99 — long past the 10-point saturation threshold. The stress score literally cannot distinguish between “accelerating cascade” and “decelerating grind” once the cumulative move is large enough.
You’re reading a signal the indicator architecture is blind to. The stress score sees “deep + fast” but doesn’t see “fast becoming less fast.” The deceleration is in the FIRST DERIVATIVE (daily move shrinking) and SECOND DERIVATIVE (ROC of daily moves declining) — both invisible to the saturated stress component.
Why this matters operationally — the structural-floor exhaustion signature
Decelerating moves INTO a structural floor is the textbook signature of selling exhaustion / bid absorption:
- Phase 1 (cascade): Initial flush is sharp. Sellers panic, no clear bid. Big daily moves.
- Phase 2 (grind): Each subsequent test of the floor is smaller. Sellers running out of urgency. Bid absorbing more of each flush. Daily magnitudes shrink.
- Phase 3 (base): Tests stop making meaningfully new lows. Volume drops. Closes start finishing higher in the daily range. Bid wins.
- Phase 4 (reversal): Bid converts to offense. RSI lifts off the floor. VWAP reclaims hold. Volume returns on the buy side.
The PRICE deceleration over 3 sessions while at the structural floor is consistent with late Phase 2 / early Phase 3. The selling pressure has been absorbing more of each flush — exactly what would happen if institutional accumulation is engaging at the Liberation Day floor.
The opposite signature would be: ACCELERATING daily moves at the floor (e.g., -2.9% → -3.5% → -5%+) which would indicate forced selling / cascade in motion / no bid. We’re seeing the OPPOSITE.
What would invalidate the deceleration pattern
- Tomorrow opens with a -4%+ flush at the open (re-acceleration)
- Today’s close finishes well below $138 in the bottom decile of the daily range (Phase 3 didn’t establish; back to Phase 1/2)
- Volume spikes 2x+ on a down move (forced selling cascade)
Conversely, the deceleration thesis confirms if
- Today closes with a small daily Δ (continuing the compression)
- Volume tapers further
- Next session opens at or near today’s close (overnight bid holds)
- An eventual UP-day with strong daily Δ on rising volume = bid converts to offense
The higher-order signal
Sharp observation that’s higher-information than the snapshot stress reading captures. The stress score is good for “is there an extreme?” but doesn’t tell you “is the extreme building or exhausting?” The deceleration pattern is the second-order signal that matters at structural-floor tests.