# Does a build-up of Nifty option mispricings predict multi-day moves? *Research, not advice. Read-only study; no orders placed.* Built 2026-10-18 (IST). Page: https://aitradeanalytics.tech/rl-trading/setups/mismatch-accumulation/ ## Short answer - **Direction over 1/2/3/5 days: FAIL.** 128 single-feature direction tests gave 1 hit at test p<0.05, where about 6 are expected by chance. LightGBM 2026 test AUC: next-day up 0.48, 2-day 0.41, 3-day 0.45, 5-day 0.51. Placebo (date-shuffled features) averaged about 0.51. Adding accumulation features to a price/vol-only model made it worse (up1 0.47 vs 0.56; up3 0.40 vs 0.51). The core idea "calls richer than puts over 3 days → Nifty drifts up" has a next-day IC of −0.09 / −0.14 / +0.13 (train/tune/test), so the sign flips. - **Next-day range / |move|: PASS as a predictor, FAIL as a buy.** A 3-day OI-weighted, parity-confirmed "chain cheap vs SVI" reading comes before bigger next-day ranges. After removing a linear vol baseline the partial IC is −0.11 / −0.23 / −0.44 (2026 CI −0.56…−0.26, BH-q<0.001). A price/vol-only LightGBM still forecasts range better than the full model (0.48 vs 0.37 Spearman). Straddles bought on those days lost more than straddles bought every day (−₹785 vs −₹514 per pair in the first hour). - **Breakout (close above the prior day's high): WATCH.** Test AUC is 0.68 vs placebo 95th percentile 0.61, but price/vol-only gets 0.66. The full-minus-price difference is +0.025, 95% CI [−0.014, +0.074]. The main driver is where today closed in its range. Max-OI-strike distance adds a small partial IC (+0.13/+0.29/+0.23, q=0.009). The buy-CE rule built on it lost in train (−₹676/trade) and made money in 2026 (+₹350, CI −620…+1318): inconsistent. For close below the prior low, the accumulation features hurt (−0.051 AUC, CI below 0). - **Next-day first-hour best side (ATM CE vs PE): FAIL.** AUC 0.45. - **Expiry pinning: FAIL.** With 1–3 days to expiry, the expiry close was nearer the max-OI strike than to today's spot only 36/40/41% of the time in 2026 (13–56% across all periods). Max pain ≈ spot. - **Regimes:** a GMM/HMM (forward-filtered) state of "accumulation" means a high OI share at persistently mispriced strikes with low IV. It comes before the quietest next days. Stress states come before the widest. Range differs strongly by regime (Kruskal p 2e-7 / 9e-10 in 2026); direction does not (p 0.45 / 0.47). - **"Manipulation-like" days** (one-sided persistent mispricing plus OI build plus a streak ≥3; 64 days): followed by smaller ranges (2026: 0.72% vs 1.00%) and no reliable direction. The sign of following the one-sided side vs the next 3 days: train −0.52, tune +0.50, test +0.35, so it flips. - **No buy-side rule survives costs.** Every rule was negative in 2026 or inconsistent across periods. ## Data and features - 5-minute SVI fair values for every front- and next-week strike, reused from `option-pricing-outliers/fits/fv_*.parquet` (not recomputed). Tradable and liquid episode counts come from `top-mismatches/`. Real 1-minute ATM premiums come from the local copy of the S3 `options/1m` by-expiry files. Spot is the read-only `nifty50.parquet` 1m file. - Liquid quotes only (traded in the last 5 min, premium ≥1, |log K/F| ≤4%), winsorised per snapshot at 2/98%. Parity-confirmed variant: the put or call at the same strike also traded with a same-sign gap ≥50%. - Aggregation per hour (median per contract), then per day, plus rolling 2/3/5-day sums and a 60-day z-score. OI-weighted CE and PE premium-pt and vol-pt residuals; CE−PE spread; wing residual; persistence (same contract rich/cheap ≥2 days and ≥70% of hours) with OI share, moneyness and OI build; 25Δ RR / BF drift; ATM IV − RV; tradable-gap stress index; max-OI / max-pain distance; pin pressure; DTE; prior returns and range. 117 features in total. - **Truncation test passed:** rebuilding with data cut at 6 random dates gave 0 mismatching feature values on the cut date. - **Structural break:** chain-wide OI-weighted residuals moved from ≈0 (train) to ≈+0.3 pts (tune and test), so fixed train thresholds stop firing in 2026. ## Model verdicts (2026 test) | target | LGBM tune | LGBM test [CI] | placebo mean / 95th | price/vol-only LGBM | full − pv [CI] | verdict | |---|---|---|---|---|---|---| | next-day up (AUC) | 0.52 | 0.48 [0.40, 0.57] | 0.51 / 0.57 | 0.56 | −0.095 [−0.17, −0.04] | FAIL | | 3-day up (AUC) | 0.48 | 0.45 [0.36, 0.56] | 0.51 / 0.60 | 0.51 | −0.112 [−0.23, +0.01] | FAIL | | 5-day up (AUC) | 0.52 | 0.51 [0.40, 0.62] | 0.51 / 0.59 | – | – | FAIL | | close > prior high (AUC) | 0.66 | 0.68 [0.58, 0.77] | 0.52 / 0.61 | 0.66 | +0.025 [−0.01, +0.07] | WATCH | | close < prior low (AUC) | 0.68 | 0.64 [0.54, 0.73] | 0.49 / 0.57 | 0.65 | −0.051 [−0.10, −0.01] | FAIL | | 1st-hour CE beats PE (AUC) | 0.52 | 0.45 [0.37, 0.53] | 0.50 / 0.55 | 0.45 | +0.006 | FAIL | | next-day range (Spearman) | 0.16 | 0.37 [0.15, 0.52] | 0.02 / 0.26 | 0.48 | −0.105 [−0.23, −0.02] | FAIL (vol already explains it) | | abs next-day move (Spearman) | 0.13 | 0.23 [0.06, 0.38] | 0.03 / 0.21 | 0.22 | −0.036 | FAIL | | 3-day return (Spearman) | 0.02 | −0.20 | 0.03 / 0.15 | – | – | FAIL | Baselines: in 2026 Nifty was up on 46% of days, so always-up was right 46% of the time. Prior-day momentum AUC was 0.45. ## Top features (mean |SHAP|, 2026) - Range: 2-day put residual, 25Δ RR drift (5d), prior return, RR level, butterfly drift, ATM IV. These are mostly volatility information. - Breakout up: close location in range (dominant), 5-day put residual, PCR, IV−RV, gap. - Next-day direction: thin and noisy (ATM IV change, butterfly change, PCR, DTE). ## Buy-side backtests (2026, front-week ATM, entry next day 09:16, lot 65, 1 pt slippage/side, ₹50 RT per leg) | rule | exit | trades | avg ₹/trade [CI] | |---|---|---|---| | straddle every day (baseline) | 1h / close | 185 | −514 / −666 | | A2 cheap-chain (trailing rank, post-hoc) straddle | 1h / close | 36 | −785 / −1,937 | | vol-baseline top-20% straddle | 1h / close | 80 | −448 / −831 | | max-OI ≥ train 80th pct above spot → CE | 1h / close | 24 | +350 [−620, +1318] / +70 (train: −676 / −673) | | max-OI ≤ train 20th pct → PE | 1h / close | 39 | −30 / +752 [−1068, +2945] (train: −180 / −149) | | more cheap than rich tradable gaps → CE | 1h / close | 20 | −377 / −664 | | LGBM breakout-up top tercile → CE (Mar–Oct) | 1h / close | 63 | −135 / −345 | | LGBM breakout-down top tercile → PE | 1h / close | 59 | −571 / −576 | | manip-like, follow side (CE / PE) | close | 8 / 26 | +486 / −539 | All FAIL: negative, or positive only in 2026 with wide CIs and a sign flip versus train. Rule A at a fixed train threshold had 0 trades in 2026. ## Multiple testing About 482 tests: 320 univariate, 71 partial ICs, 13 + 24 model fits, 4 regime tests, 52 backtest cells. Roughly 24 hits are expected at p<0.05 by chance. A PASS needed the same sign in train, tune and test plus BH-q<0.05. Only magnitude/range signals and price-location breakout signals passed. ## Limits About 500 sessions (186 in test), enough to rule out a large edge but not a small one (e.g. a 53% hit rate). Prices are 1-minute last trades, not bid/ask. There is a mid-2025 structural break. OI uses liquid strikes within 4%. "Manipulation-like" is a pattern flag, not proof. Only buying was tested. ## Files s1_hourly.py (hourly per-contract residuals), s2_targets.py (spot daily, real 1m ATM premiums), s3_features.py (features, targets, truncation test), s4_models.py (univariate, LGBM, regimes, Isolation Forest, SHAP, pinning), s4b_incremental.py (partial ICs, price/vol-only vs full), s5_backtest.py, build_page.py; CSV outputs listed on the page.