Options-Expiry Gamma-Wall Unwind Slippage Playbook
Date: 2026-03-08 Category: research
Why this matters
Execution cost around options expiry is often mis-modeled as “just higher volatility.” In reality, dealer hedging flow can create strike-pinning (mean reversion toward large OI strikes) and then rapidly flip into unwind flow (directional acceleration after pin breaks or post-expiry de-hedging).
A static impact model calibrated on normal days will usually:
- underprice urgency when a pin breaks,
- overtrade into temporary pin stability (paying spread without real progress),
- and miss tail slippage when gamma support vanishes.
This playbook treats expiry windows as a separate microstructure regime with explicit state control.
Core intuition
Near expiry, large open interest (OI) strikes act like local potential wells:
- Short-gamma pressure low + balanced flow → price sticks near strike (“pin”).
- Flow imbalance + local liquidity thinning → pin destabilizes.
- Pin break + hedge rebalancing → realized impact becomes more persistent, with higher sweep risk.
So the execution question is not only “how much volatility?” but:
- Are we in pinning, fragile pin, or unwind?
- What is the probability of a pin-break transition during our execution horizon?
- How does cost distribution (q50/q95) shift by state?
Data contract (minimum)
1) Spot + order book features
- Mid, spread, top-N depth, imbalance, refill half-life
- Cancel intensity, reject/retry frequency
- Realized vol at short horizons (e.g., 10s/60s/5m)
2) Options-derived features
- Strike-level OI concentration around spot (±2~3% moneyness)
- Approx dealer gamma proxy by strike bucket
- Time-to-expiry (minutes/hours)
- Distance-to-nearest-high-OI strike (in ticks / bps)
3) Flow/transition features
- Spot velocity away from candidate pin strike
- Persistence of signed trade flow
- Futures basis dislocation (if relevant for index names)
- Auction proximity (open/close) flags
Regime labels (practical)
Define three operational states:
PINNED
- spot oscillates near high-OI strike
- low directional drift, higher mean reversion
- passive fill odds look good, but directional progress is slow
FRAGILE_PIN
- drift/flow imbalance increases
- spread/depth instability rises
- transition risk to break/unwind increases
UNWIND
- post-break directional movement
- impact persistence and sweep risk rise
- “wait for reversion” assumptions fail more often
Use a lightweight classifier (logit/GBM) for state probability vector:
[ P_t = (p_{pinned}, p_{fragile}, p_{unwind}) ]
with daily recalibration and strict monitoring of probability calibration.
Slippage model design
Model expected and tail cost jointly:
[ \hat C_{q}(x_t) = \sum_{s \in S} p_s(x_t) \cdot \hat C_{q}^{(s)}(x_t), \quad q \in {0.5, 0.95} ]
where each state-specific model includes:
- spread + fee baseline,
- transient impact term,
- persistence term (larger in UNWIND),
- no-fill / delay branch cost (critical in PINNED),
- retry/reject tax (critical in FRAGILE_PIN/UNWIND).
Recommended branch decomposition
For each child decision (join/improve/take):
[ E[C] = P(fill)\cdot C_{fill} + (1-P(fill))\cdot C_{miss+catchup} ]
Do not train fills-only. Include miss/cancel branches to avoid survivorship bias.
Control policy (state-aware)
Use a simple 4-level action policy:
- GREEN: normal passive bias
- WATCH: moderate urgency bump, tighter dwell limits
- STRESS: reduce passive dwell, increase controlled crossing
- SAFE: cap participation, widen throttles, protect q95 budget
Suggested mapping
- If
p_unwind < 0.2and q95 budget burn low → GREEN/WATCH - If
p_fragile + p_unwindrises and depth half-life worsens → WATCH/STRESS - If pin-break probability spike + reject-loop metrics worsen → SAFE
Add hysteresis to prevent flip-flop.
Calibration and validation loop
Offline (weekly)
- Refit state classifier + state-conditional cost models
- Reliability plots for state probabilities
- Quantile coverage tests (q50/q95)
- Slice-by-slice stress checks (expiry day vs normal)
Online (intraday)
- Drift in feature distribution (PSI/KS)
- Calibration drift of state probabilities
- Budget-burn monitor:
[ Burn_t = \frac{RealizedCost_t}{PlannedBudget_t} ]
Escalate control level when burn-rate breaches thresholds.
Execution heuristics that usually help
- Near strong pin, avoid fake progress chasing
- passive fills may be high but directional completion weak.
- When fragile-pin signals rise, shorten dwell time
- queue age becomes less valuable; reset tax can explode.
- After confirmed break, avoid binary panic sweeps
- move to staged aggression with hard tail budget gates.
- Separate expiry-day parameter set
- do not rely on non-expiry pooled calibration.
Rollout plan
- Shadow mode (2–4 weeks)
- produce state probs + recommended control action without execution changes.
- Canary (5–10% flow)
- only allow GREEN/WATCH decisions initially.
- Expanded canary
- enable STRESS/SAFE with strict rollback criteria.
- Full deploy with champion/challenger
- keep baseline controller as automatic fallback.
Rollback triggers
- q95 slippage breach for N consecutive windows
- no-fill regret exceeds threshold
- classifier calibration collapse (reliability failure)
Minimal KPI dashboard
- State probabilities over time (
p_pinned,p_fragile,p_unwind) - Pin-break event count + detection latency
- q50/q95 slippage vs baseline
- Fill ratio and no-fill regret by state
- Retry/reject tax by state
- Budget burn-rate and control-state occupancy
Common failure modes
- Treating expiry effects as plain volatility scaling
- Overfitting to one expiry cycle
- Ignoring options-derived features due to data friction
- Using instantaneous state labels without transition hysteresis
- Evaluating only average bps (tail blind)
Bottom line
On expiry windows, execution quality depends on state transitions (pin → fragile → unwind), not just spread/vol snapshots.
A practical edge comes from:
- explicit regime probabilities,
- state-conditional tail-cost modeling,
- and budget-linked control escalation.
That is how you prevent “looked fine at q50” from becoming expensive at q95 when gamma support disappears.