Research, not advice. This is a read-only study of historical data. No orders were placed. Built 2026-10-18 (IST). Data runs from 2024-09-27 to 2026-10-01: 498 sessions of real 1-minute Upstox Nifty weekly option chains.
Every 5 minutes, a smooth SVI volatility smile was fitted through the whole front- and next-week chain (from the earlier option-pricing-outliers study). Each option's residual is its market price minus the smile's fair price. One residual on its own closes within minutes. The question here is whether the tilt of the whole chain builds up over hours and days, and whether that build-up tells you where Nifty goes next.
The chart shows a structural break. In train (Sep 2024–Jun 2025) the OI-weighted residuals hovered around 0. From mid-2025 calls and puts at high-OI strikes sit about +0.3 pts rich, around the time of mid-2025 market-structure changes such as the SEBI F&O rules and the move to Tuesday expiries. The cause has not been established. Fixed train thresholds therefore stop firing in 2026, and only within-period ranks or z-scores carry over.
Splits: train 2024-09-27 → 2025-06-30 (186 days), tune 2025-07 → 2025-12 (126), test 2026-01 → 2026-10-01 (186), with the test looked at once. Models: (a) decile and Spearman-IC checks with thresholds set on train, 5-day block-bootstrap CIs and Benjamini–Hochberg control; (b) LightGBM (depth 2, 4 leaves, min 25 per leaf, L2 = 10, 50% feature subsampling), walk-forward with monthly refits, purging of the target horizon plus a 2-day embargo, and the number of rounds chosen on the tune months only; (c) a 3-state GMM and a 3-state Gaussian HMM using forward-filtered probabilities only (no smoothing look-ahead), fitted on train; (d) an Isolation Forest fitted on train; (e) TreeSHAP contributions. Baselines: always-up, prior-day momentum, a vol-only score, a price/vol-only LightGBM (same pipeline without any accumulation features), and a placebo of 30 refits on date-shuffled feature rows. Tests counted: about 484 (320 univariate, 71 partial ICs, 13+24 model fits, 4 regime tests, 52 backtest cells), so at p<0.05 roughly 24 "hits" are expected by chance.
The left panel is the core hypothesis: calls richer than puts over 3 days → Nifty drifts up over the next 3 days. The quintile lines do not agree across periods. The IC with next-day return is −0.09 (train), −0.14 (tune) and +0.13 (test), so the sign flips. The right panel shows the one robust pattern: a cheaper chain comes before a bigger next-day range in every period.
Out of 320 feature×target tests, 58 had test p<0.05 (about 16 expected by chance). After requiring the same sign in train, tune and test plus BH-q<0.05, 11 PASS, and every one is about range/magnitude or breakouts. None is a 1–5-day direction target.
| feature | target | ic_train | ic_tune | ic_test | ic_test_lo | ic_test_hi | p_test | q_test | verdict |
|---|---|---|---|---|---|---|---|---|---|
| ce_px_r3 | rng1 | -0.080 | -0.172 | -0.487 | -0.604 | -0.311 | 0.000 | 0.000 | PASS |
| ce_px_r3 | absr1 | -0.104 | -0.133 | -0.233 | -0.419 | -0.015 | 0.022 | 0.136 | WATCH |
| pe_px_r3 | rng1 | -0.180 | -0.062 | -0.457 | -0.618 | -0.266 | 0.000 | 0.000 | PASS |
| pe_px_r3 | absr1 | -0.213 | -0.106 | -0.245 | -0.423 | -0.053 | 0.009 | 0.067 | WATCH |
| ce_pxpar_r3 | rng1 | -0.097 | -0.184 | -0.497 | -0.612 | -0.337 | 0.000 | 0.000 | PASS |
| ce_pxpar_r3 | absr1 | -0.141 | -0.163 | -0.233 | -0.402 | -0.050 | 0.014 | 0.094 | WATCH |
| pe_pxpar_r3 | rng1 | -0.133 | -0.058 | -0.443 | -0.592 | -0.232 | 0.000 | 0.000 | PASS |
| pe_pxpar_r3 | absr1 | -0.170 | -0.117 | -0.276 | -0.433 | -0.079 | 0.005 | 0.043 | PASS |
| onesided_ce | absr1 | 0.024 | 0.072 | 0.229 | 0.038 | 0.389 | 0.012 | 0.081 | WATCH |
| onesided_ce_r3 | rng1 | 0.024 | 0.122 | 0.469 | 0.286 | 0.585 | 0.000 | 0.000 | PASS |
| onesided_ce_r3 | absr1 | 0.021 | 0.127 | 0.234 | 0.047 | 0.381 | 0.007 | 0.052 | WATCH |
| ivrv5 | rng1 | 0.116 | 0.016 | 0.423 | 0.227 | 0.601 | 0.000 | 0.000 | PASS |
| ivrv5 | absr1 | 0.200 | 0.018 | 0.314 | 0.129 | 0.475 | 0.000 | 0.004 | PASS |
| ivrv5 | fh_best_move | 0.047 | 0.093 | 0.230 | 0.059 | 0.379 | 0.007 | 0.051 | WATCH |
| stress | rng1 | 0.005 | 0.016 | 0.363 | 0.182 | 0.526 | 0.000 | 0.000 | PASS |
| n_trad_cheap_minus_rich | r1 | 0.063 | 0.112 | 0.165 | 0.019 | 0.306 | 0.018 | 0.112 | WATCH |
| n_trad_cheap_minus_rich | bo_up | 0.039 | 0.181 | 0.186 | 0.024 | 0.292 | 0.007 | 0.051 | WATCH |
| n_trad_cheap_minus_rich | bo_dn | -0.064 | -0.019 | -0.159 | -0.282 | -0.014 | 0.027 | 0.158 | WATCH |
| maxoi_tot_dist | rng1 | 0.061 | 0.094 | 0.195 | 0.040 | 0.345 | 0.015 | 0.098 | WATCH |
| maxpain_dist | rng1 | 0.127 | 0.230 | 0.205 | 0.034 | 0.358 | 0.010 | 0.070 | WATCH |
| maxpain_dist | bo_up | -0.259 | -0.233 | -0.157 | -0.283 | -0.011 | 0.029 | 0.165 | WATCH |
| maxpain_dist | bo_dn | 0.111 | 0.179 | 0.144 | -0.001 | 0.258 | 0.032 | 0.182 | WATCH |
| pcr | bo_up | 0.276 | 0.256 | 0.258 | 0.112 | 0.382 | 0.000 | 0.005 | PASS |
| pcr | bo_dn | -0.204 | -0.213 | -0.229 | -0.331 | -0.109 | 0.000 | 0.001 | PASS |
Incremental check (partial ICs). The target is first residualised on a train-fitted baseline: vol (ATM IV, 5-day RV, today's range, 5-day range) for magnitude targets, and price location (close-in-range, 1- and 5-day return, range, gap) for direction and breakout targets. Survivors:
| kind | feature | target | ic_train | ic_tune | ic_test | lo | hi | p | q | verdict |
|---|---|---|---|---|---|---|---|---|---|---|
| partial_vs_vol | ce_px_r3 | rng1 | -0.090 | -0.217 | -0.441 | -0.562 | -0.259 | 0.000 | 0.000 | PASS |
| partial_vs_vol | pe_px_r3 | rng1 | -0.216 | -0.076 | -0.386 | -0.526 | -0.192 | 0.000 | 0.000 | PASS |
| partial_vs_vol | ce_pxpar_r3 | rng1 | -0.113 | -0.230 | -0.444 | -0.565 | -0.253 | 0.000 | 0.000 | PASS |
| partial_vs_vol | pe_pxpar_r3 | rng1 | -0.156 | -0.071 | -0.368 | -0.504 | -0.178 | 0.000 | 0.000 | PASS |
| partial_vs_vol | onesided_ce | rng1 | 0.000 | 0.079 | 0.403 | 0.253 | 0.531 | 0.000 | 0.000 | PASS |
| partial_vs_vol | onesided_ce_r3 | rng1 | 0.039 | 0.138 | 0.413 | 0.232 | 0.539 | 0.000 | 0.000 | PASS |
| partial_vs_vol | maxoi_tot_dist | rng1 | 0.083 | 0.085 | 0.191 | 0.001 | 0.341 | 0.022 | 0.066 | WATCH |
| partial_vs_vol | maxpain_dist | rng1 | 0.144 | 0.201 | 0.163 | 0.001 | 0.286 | 0.027 | 0.072 | WATCH |
| partial_vs_vol | ce_px_r3 | fh_best_move | -0.115 | -0.024 | -0.373 | -0.509 | -0.245 | 0.000 | 0.000 | PASS |
| partial_vs_vol | ce_pxpar_r3 | fh_best_move | -0.137 | -0.007 | -0.329 | -0.461 | -0.216 | 0.000 | 0.000 | PASS |
| partial_vs_price | pcr | bo_up | -0.053 | -0.212 | -0.195 | -0.362 | -0.021 | 0.024 | 0.066 | WATCH |
| partial_vs_price | maxpain_dist | bo_up | 0.169 | 0.194 | 0.207 | 0.045 | 0.348 | 0.006 | 0.020 | PASS |
| partial_vs_price | maxoi_tot_dist | bo_up | 0.128 | 0.294 | 0.233 | 0.089 | 0.373 | 0.002 | 0.009 | PASS |
| partial_vs_price | onesided_ce_r3 | bo_dn | 0.095 | 0.029 | 0.181 | 0.035 | 0.297 | 0.006 | 0.020 | PASS |
| partial_vs_price | n_trad_cheap_minus_rich | r1 | 0.050 | 0.153 | 0.140 | -0.002 | 0.266 | 0.041 | 0.101 | WATCH |
| target (metric) | tune (walk-fwd) | 2026 test | test CI lo | test CI hi | placebo mean | placebo 95th | momentum baseline | vol-only baseline | price/vol-only LGBM test | full − price/vol (95% CI) | verdict |
|---|---|---|---|---|---|---|---|---|---|---|---|
| next-day up (AUC) | 0.522 | 0.479 | 0.398 | 0.574 | 0.513 | 0.567 | 0.447 | – | 0.562 | -0.095 [-0.166, -0.036] | FAIL |
| next 2-day up (AUC) | 0.460 | 0.407 | 0.313 | 0.489 | 0.511 | 0.612 | 0.490 | – | – | – | FAIL |
| next 3-day up (AUC) | 0.479 | 0.451 | 0.359 | 0.556 | 0.509 | 0.604 | 0.486 | – | 0.510 | -0.112 [-0.229, +0.007] | FAIL |
| next 5-day up (AUC) | 0.521 | 0.513 | 0.399 | 0.625 | 0.505 | 0.595 | 0.481 | – | – | – | FAIL |
| close > prior high (AUC) | 0.664 | 0.685 | 0.585 | 0.771 | 0.516 | 0.615 | – | – | 0.658 | +0.025 [-0.014, +0.074] | WATCH |
| close < prior low (AUC) | 0.682 | 0.641 | 0.537 | 0.729 | 0.494 | 0.570 | – | – | 0.653 | -0.051 [-0.097, -0.008] | FAIL |
| 1st-hour CE beats PE (AUC) | 0.521 | 0.446 | 0.369 | 0.530 | 0.495 | 0.546 | 0.516 | – | 0.450 | +0.006 [-0.093, +0.098] | FAIL |
| next-day return (Spearman) | 0.021 | 0.030 | -0.103 | 0.177 | -0.001 | 0.096 | -0.063 | – | – | – | FAIL |
| 3-day return (Spearman) | 0.023 | -0.200 | -0.376 | 0.007 | 0.029 | 0.152 | -0.068 | – | – | – | FAIL |
| 5-day return (Spearman) | 0.080 | -0.125 | -0.369 | 0.128 | 0.000 | 0.162 | -0.027 | – | – | – | FAIL |
| |next-day move| (Spearman) | 0.128 | 0.228 | 0.060 | 0.382 | 0.032 | 0.208 | – | 0.330 | 0.220 | -0.036 [-0.133, +0.047] | FAIL (vol already explains it) |
| next-day range (Spearman) | 0.164 | 0.373 | 0.154 | 0.517 | 0.017 | 0.256 | – | 0.558 | 0.478 | -0.105 [-0.225, -0.016] | FAIL (worse than vol-only) |
| best ATM 1st-hr move (Spearman) | -0.090 | 0.168 | 0.014 | 0.321 | -0.040 | 0.167 | – | 0.258 | 0.200 | +0.013 [-0.135, +0.156] | FAIL |
AUC 0.5 = coin flip. 2026 base rates: up days 46%, so always-up was right 46% of the time; close above the prior high 24%. The breakout models beat the shuffled-date placebo, but the price/vol-only model does about as well, so the "edge" is price location, not accumulation.
For range, the top features are smile-shape changes (25Δ RR and butterfly drift), 2-day put residuals and ATM IV, which are mostly volatility information. For breakouts it is overwhelmingly clv (where today closed in its range), then put residuals, PCR and IV−RV. For next-day direction the importances are spread thin across noise-level features, as expected when nothing predicts.
States are named by their mean stress. GMM centres (z-scores): {"stress": {"calm": -0.99, "accumulation": 0.06, "stress": 0.58}, "pers_any_oish_r3": {"calm": -0.11, "accumulation": 2.33, "stress": -0.86}, "atm_nx": {"calm": -0.85, "accumulation": -0.54, "stress": 3.04}, "ivrv5": {"calm": -0.27, "accumulation": 0.12, "stress": 2.56}, "acc_mag": {"calm": -0.26, "accumulation": 1.28, "stress": -0.45}}. "Accumulation" = high OI share at persistently mispriced strikes with low IV. In 2026 the regimes separate the next-day range clearly (Kruskal p: GMM 1.9e-07, HMM 9.4e-10) but not the direction (p 0.45 / 0.47). Accumulation days come before the quietest next sessions; stress days come before the widest.
| model | split | state | n | r1 | up1 | absr1 | rng1 | r5 | fh_best |
|---|---|---|---|---|---|---|---|---|---|
| gmm | test | accumulation | 55 | 0.043 | 0.436 | 0.523 | 0.821 | -0.333 | 14.592 |
| gmm | test | calm | 86 | -0.167 | 0.477 | 0.609 | 0.950 | -0.601 | 23.275 |
| gmm | test | stress | 45 | -0.061 | 0.467 | 1.086 | 1.311 | -0.121 | 37.073 |
| gmm | train | accumulation | 48 | 0.096 | 0.479 | 0.770 | 1.185 | 0.288 | 37.301 |
| gmm | train | calm | 124 | -0.101 | 0.419 | 0.581 | 1.042 | -0.312 | 32.971 |
| gmm | train | stress | 12 | 0.678 | 0.750 | 0.932 | 1.004 | 2.572 | 19.631 |
| gmm | tune | accumulation | 31 | 0.004 | 0.419 | 0.400 | 0.692 | 0.119 | 27.176 |
| gmm | tune | calm | 95 | 0.023 | 0.516 | 0.422 | 0.708 | 0.114 | 22.276 |
| hmm | test | accumulation | 93 | -0.086 | 0.462 | 0.526 | 0.789 | -0.324 | 18.312 |
| hmm | test | calm | 31 | -0.178 | 0.452 | 0.742 | 1.199 | -1.013 | 25.022 |
| hmm | test | stress | 62 | -0.020 | 0.468 | 0.937 | 1.215 | -0.244 | 32.185 |
| hmm | train | accumulation | 84 | -0.073 | 0.405 | 0.642 | 1.151 | -0.204 | 33.559 |
| hmm | train | calm | 69 | -0.058 | 0.449 | 0.575 | 0.975 | -0.311 | 30.363 |
| hmm | train | stress | 31 | 0.333 | 0.613 | 0.859 | 1.101 | 1.439 | 38.512 |
| hmm | tune | accumulation | 72 | 0.002 | 0.472 | 0.441 | 0.720 | -0.080 | 26.663 |
| hmm | tune | calm | 50 | 0.037 | 0.520 | 0.392 | 0.692 | 0.345 | 19.703 |
| hmm | tune | stress | 4 | 0.089 | 0.500 | 0.280 | 0.565 | 0.754 | 12.790 |
Manipulation-like (flag) = one-sidedness ≥ train 90th percentile, OI build at persistent strikes ≥ train 67th percentile, and a mispricing streak ≥ 3 days. This is a pattern flag for a human to inspect, not evidence of manipulation. The red line in each mini chart marks the anomaly day; the chart shows Nifty daily closes from 5 sessions before to 5 after.
| date | period | anomaly pct | manip-like | CE one-sided | PE one-sided | OI build at persistent strikes | max streak (days) | CE−PE 3d | DTE | next-day % | next 3d % | next 5d % | next-day range % | next-day best ATM 1st-hr move (pts) | chart (D−5…D+5) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2024-12-31 | train | 1.000 | YES | -0.168 | -0.077 | 0.043 | 5 | -0.348 | 2 | 0.379 | 1.349 | 0.109 | 1.098 | 3.150 | |
| 2025-01-01 | train | 0.998 | YES | -0.099 | -0.097 | 0.055 | 6 | -0.065 | 1 | 1.708 | -0.545 | -0.352 | 2.000 | 12.190 | |
| 2025-06-03 | train | 0.996 | YES | -0.203 | -0.030 | 0.066 | 4 | 0.359 | 2 | 0.299 | 1.865 | 2.229 | 0.464 | -19.850 | |
| 2025-05-08 | train | 0.994 | YES | -0.123 | -0.053 | 0.152 | 3 | 0.097 | 0 | -0.973 | 1.247 | 3.089 | 0.941 | -17.460 | |
| 2025-12-05 | tune | 0.992 | YES | -0.152 | -0.077 | 0.053 | 8 | -0.065 | 2 | -0.936 | -1.672 | -0.512 | 1.094 | 20.050 | |
| 2026-08-10 | test | 0.990 | YES | -0.141 | -0.008 | 0.079 | 9 | -0.380 | 1 | -0.457 | -0.767 | -1.212 | 0.600 | 11.550 | |
| 2026-08-07 | test | 0.988 | YES | -0.141 | -0.054 | 0.050 | 8 | -0.243 | 2 | 0.054 | -0.550 | -0.836 | 0.447 | -1.350 | |
| 2025-12-11 | tune | 0.986 | YES | -0.187 | -0.110 | 0.039 | 7 | -0.272 | 3 | 0.557 | -0.182 | -0.320 | 0.460 | 8.650 | |
| 2026-07-02 | test | 0.984 | YES | -0.106 | -0.136 | 0.061 | 5 | 0.504 | 3 | 0.429 | 0.774 | -0.770 | 0.521 | 5.300 | |
| 2025-12-03 | tune | 0.982 | YES | -0.142 | -0.071 | 0.087 | 6 | -0.258 | 4 | 0.123 | -0.201 | -0.937 | 0.613 | 54.050 | |
| 2026-07-30 | test | 0.980 | YES | -0.115 | -0.113 | 0.054 | 4 | -0.298 | 3 | 0.288 | 1.302 | 1.387 | 0.534 | 12.150 | |
| 2026-01-01 | test | 0.978 | -0.060 | 0.019 | 0.110 | 6 | -0.247 | 3 | 0.745 | 0.132 | -1.043 | 0.848 | 61.100 | ||
| 2025-11-28 | tune | 0.976 | YES | -0.111 | -0.111 | 0.026 | 6 | -0.288 | 2 | -0.109 | -0.841 | -0.107 | 0.769 | 5.000 | |
| 2025-12-24 | tune | 0.974 | 0.030 | 0.017 | 0.130 | 6 | -0.003 | 3 | -0.360 | -0.657 | -0.005 | 0.519 | 6.000 | ||
| 2025-07-17 | tune | 0.972 | YES | -0.161 | -0.062 | 0.191 | 3 | 0.060 | 0 | -0.567 | -0.178 | -0.230 | 0.900 | 55.250 | |
| 2025-12-31 | tune | 0.970 | YES | -0.104 | 0.028 | 0.139 | 5 | -0.221 | 4 | -0.006 | 0.392 | 0.004 | 0.322 | 16.100 | |
| 2026-08-06 | test | 0.968 | YES | -0.130 | -0.114 | 0.019 | 7 | -0.087 | 3 | -0.266 | -0.669 | -0.980 | 0.437 | 8.300 | |
| 2025-12-08 | tune | 0.966 | YES | -0.071 | -0.082 | 0.030 | 9 | -0.186 | 1 | -0.352 | -0.133 | 0.313 | 0.754 | 25.700 | |
| 2025-12-15 | tune | 0.964 | 0.005 | -0.002 | 0.105 | 5 | 0.100 | 1 | -0.627 | -0.765 | 0.570 | 0.563 | 19.200 | ||
| 2025-11-21 | tune | 0.962 | YES | -0.106 | -0.063 | 0.026 | 5 | -0.007 | 2 | -0.464 | 0.534 | 0.538 | 0.885 | 7.050 | |
| 2025-11-24 | tune | 0.960 | 0.081 | -0.049 | 0.066 | 4 | 0.045 | 1 | -0.321 | 1.060 | 0.893 | 0.675 | 48.950 | ||
| 2025-11-19 | tune | 0.958 | YES | -0.143 | -0.117 | 0.067 | 3 | -0.030 | 4 | 0.554 | -0.421 | 0.577 | 0.704 | 4.700 | |
| 2025-12-10 | tune | 0.956 | YES | -0.063 | -0.103 | 0.082 | 6 | -0.391 | 4 | 0.603 | 1.049 | 0.307 | 0.892 | 48.950 | |
| 2025-12-04 | tune | 0.954 | YES | -0.138 | -0.045 | 0.027 | 7 | -0.191 | 3 | 0.611 | -0.676 | -0.457 | 0.835 | 44.550 | |
| 2025-12-17 | tune | 0.952 | -0.002 | -0.039 | 0.104 | 6 | 0.061 | 4 | -0.024 | 1.312 | 1.231 | 0.682 | 4.500 |
What followed (means):
| set | split | n | r1 | absr1 | r3 | abs_r3 | rng1 | up1 | fh_best |
|---|---|---|---|---|---|---|---|---|---|
| top5pct_anomaly | train | 4 | 0.353 | 0.840 | 0.979 | 1.251 | 1.126 | 0.750 | -5.493 |
| top5pct_anomaly | tune | 15 | -0.088 | 0.414 | -0.092 | 0.672 | 0.711 | 0.333 | 24.580 |
| top5pct_anomaly | test | 6 | 0.132 | 0.373 | 0.037 | 0.699 | 0.564 | 0.667 | 16.175 |
| top5pct_anomaly | all | 25 | 0.036 | 0.473 | 0.110 | 0.771 | 0.742 | 0.480 | 17.751 |
| manip_like | train | 9 | 0.049 | 0.491 | 0.587 | 0.941 | 1.057 | 0.444 | 29.298 |
| manip_like | tune | 21 | -0.032 | 0.370 | -0.219 | 0.677 | 0.681 | 0.429 | 19.048 |
| manip_like | test | 34 | 0.033 | 0.515 | -0.099 | 0.903 | 0.716 | 0.559 | 16.418 |
| manip_like | all | 64 | 0.014 | 0.464 | -0.042 | 0.834 | 0.753 | 0.500 | 19.092 |
| all | train | 186 | -0.006 | 0.654 | -0.034 | 1.202 | 1.076 | 0.452 | 33.357 |
| all | tune | 126 | 0.019 | 0.417 | 0.072 | 0.785 | 0.704 | 0.492 | 23.491 |
| all | test | 186 | -0.079 | 0.699 | -0.243 | 1.205 | 0.999 | 0.462 | 24.050 |
| all | all | 498 | -0.027 | 0.611 | -0.085 | 1.097 | 0.953 | 0.466 | 27.338 |
Direction of one-sidedness vs the next 3-day return on manipulation-like days, Spearman by period: {"test": 0.35, "train": -0.52, "tune": 0.5}. The sign flips, so it is FAIL.
Top manipulation-like days:
| date | split | onesided_ce | onesided_pe | pers_oibuild | pers_maxstreak | r1 | r3 | r5 | rng1 | chart |
|---|---|---|---|---|---|---|---|---|---|---|
| 2024-12-31 | train | -0.168 | -0.077 | 0.043 | 5 | 0.379 | 1.349 | 0.109 | 1.098 | |
| 2025-01-01 | train | -0.099 | -0.097 | 0.055 | 6 | 1.708 | -0.545 | -0.352 | 2.000 | |
| 2025-06-03 | train | -0.203 | -0.030 | 0.066 | 4 | 0.299 | 1.865 | 2.229 | 0.464 | |
| 2025-05-08 | train | -0.123 | -0.053 | 0.152 | 3 | -0.973 | 1.247 | 3.089 | 0.941 | |
| 2025-12-05 | tune | -0.152 | -0.077 | 0.053 | 8 | -0.936 | -1.672 | -0.512 | 1.094 | |
| 2026-08-10 | test | -0.141 | -0.008 | 0.079 | 9 | -0.457 | -0.767 | -1.212 | 0.600 | |
| 2026-08-07 | test | -0.141 | -0.054 | 0.050 | 8 | 0.054 | -0.550 | -0.836 | 0.447 | |
| 2025-12-11 | tune | -0.187 | -0.110 | 0.039 | 7 | 0.557 | -0.182 | -0.320 | 0.460 | |
| 2026-07-02 | test | -0.106 | -0.136 | 0.061 | 5 | 0.429 | 0.774 | -0.770 | 0.521 | |
| 2025-12-03 | tune | -0.142 | -0.071 | 0.087 | 6 | 0.123 | -0.201 | -0.937 | 0.613 | |
| 2026-07-30 | test | -0.115 | -0.113 | 0.054 | 4 | 0.288 | 1.302 | 1.387 | 0.534 | |
| 2025-11-28 | tune | -0.111 | -0.111 | 0.026 | 6 | -0.109 | -0.841 | -0.107 | 0.769 | |
| 2025-07-17 | tune | -0.161 | -0.062 | 0.191 | 3 | -0.567 | -0.178 | -0.230 | 0.900 | |
| 2025-12-31 | tune | -0.104 | 0.028 | 0.139 | 5 | -0.006 | 0.392 | 0.004 | 0.322 | |
| 2026-08-06 | test | -0.130 | -0.114 | 0.019 | 7 | -0.266 | -0.669 | -0.980 | 0.437 |
| split | dte | n | dist_maxoi | dist_maxpain | dist_spot | maxoi_closer_rate | maxpain_closer_rate | p_wilcoxon |
|---|---|---|---|---|---|---|---|---|
| train | 1 | 38 | 1.152 | 0.758 | 0.665 | 0.316 | 0.316 | 0.004 |
| train | 2 | 38 | 1.855 | 0.894 | 0.813 | 0.132 | 0.421 | 0.000 |
| train | 3 | 38 | 1.788 | 1.304 | 1.299 | 0.342 | 0.474 | 0.038 |
| tune | 1 | 27 | 0.649 | 0.544 | 0.346 | 0.333 | 0.333 | 0.025 |
| tune | 2 | 27 | 0.632 | 0.627 | 0.606 | 0.556 | 0.481 | 0.859 |
| tune | 3 | 25 | 0.825 | 0.700 | 0.710 | 0.400 | 0.560 | 0.275 |
| test | 1 | 39 | 1.009 | 0.734 | 0.739 | 0.359 | 0.513 | 0.012 |
| test | 2 | 40 | 1.249 | 1.087 | 1.052 | 0.400 | 0.350 | 0.307 |
| test | 3 | 39 | 1.559 | 1.102 | 1.024 | 0.410 | 0.487 | 0.012 |
Distances are in % of spot, from the close of day D (1–3 trading days before expiry) to the expiry close. The max-OI strike is usually farther from the expiry close than today's spot (Wilcoxon p<0.05 against it in 6 of 9 cells), and max pain is about the same as spot. FAIL: no exploitable pin.
Entry is the next session's 09:16 1-minute close of the ATM strike. Exit is 10:15 ("1h") or 15:25 ("close"). Two instruments: the front-week contract, and the nearest contract with ≥4 trading days left. Costs: lot 65, 1 pt slippage per side, ₹50 per round trip per leg. Thresholds come from train. Rule A had zero 2026 trades because of the level shift, so a trailing-120-day-rank version (A2) was added afterwards and is labelled post-hoc. E uses the 2026 Jan–Feb predictions to set its threshold and trades Mar–Oct only.
| rule | instrument | exit | trades | avg ₹/trade | CI lo | CI hi | win rate | total ₹ |
|---|---|---|---|---|---|---|---|---|
| A_cheap_accum_straddle | front-week ATM | 1h | 0 | – | – | – | – | – |
| A_cheap_accum_straddle | front-week ATM | close | 0 | – | – | – | – | – |
| A_cheap_accum_straddle | next(>=4d) ATM | 1h | 0 | – | – | – | – | – |
| A_cheap_accum_straddle | next(>=4d) ATM | close | 0 | – | – | – | – | – |
| A2_cheap_accum_trailing120rank_straddle(post-hoc) | front-week ATM | 1h | 36 | -784.757 | -1,386.646 | -195.676 | 0.306 | -28,251.250 |
| A2_cheap_accum_trailing120rank_straddle(post-hoc) | front-week ATM | close | 36 | -1,937.153 | -3,636.005 | -266.292 | 0.222 | -69,737.500 |
| A2_cheap_accum_trailing120rank_straddle(post-hoc) | next(>=4d) ATM | 1h | 34 | -263.838 | -821.505 | 365.465 | 0.294 | -8,970.500 |
| A2_cheap_accum_trailing120rank_straddle(post-hoc) | next(>=4d) ATM | close | 34 | -894.338 | -1,957.922 | 369.811 | 0.324 | -30,407.500 |
| A0_vol_baseline_straddle | front-week ATM | 1h | 80 | -447.945 | -726.975 | -168.883 | 0.300 | -35,835.600 |
| A0_vol_baseline_straddle | front-week ATM | close | 80 | -831.364 | -1,686.238 | 66.625 | 0.312 | -66,509.100 |
| A0_vol_baseline_straddle | next(>=4d) ATM | 1h | 78 | -495.867 | -854.710 | -146.694 | 0.308 | -38,677.600 |
| A0_vol_baseline_straddle | next(>=4d) ATM | close | 78 | -1,037.492 | -1,604.670 | -493.847 | 0.321 | -80,924.350 |
| A00_every_day_straddle | front-week ATM | 1h | 185 | -513.980 | -689.219 | -341.518 | 0.303 | -95,086.250 |
| A00_every_day_straddle | front-week ATM | close | 185 | -666.421 | -1,261.090 | -23.488 | 0.297 | -123,287.800 |
| A00_every_day_straddle | next(>=4d) ATM | 1h | 183 | -439.861 | -595.307 | -272.674 | 0.284 | -80,494.600 |
| A00_every_day_straddle | next(>=4d) ATM | close | 183 | -604.993 | -997.583 | -175.024 | 0.311 | -110,713.750 |
| B_maxOI_above_buy_CE | front-week ATM | 1h | 24 | 349.615 | -620.517 | 1,318.280 | 0.500 | 8,390.750 |
| B_maxOI_above_buy_CE | front-week ATM | close | 24 | 69.708 | -2,346.910 | 2,509.751 | 0.542 | 1,673.000 |
| B_maxOI_above_buy_CE | next(>=4d) ATM | 1h | 24 | 459.438 | -421.279 | 1,291.197 | 0.542 | 11,026.500 |
| B_maxOI_above_buy_CE | next(>=4d) ATM | close | 24 | 575.625 | -1,896.193 | 2,865.277 | 0.667 | 13,815.000 |
| B_maxOI_below_buy_PE | front-week ATM | 1h | 39 | -30.250 | -726.860 | 808.223 | 0.410 | -1,179.750 |
| B_maxOI_below_buy_PE | front-week ATM | close | 39 | 751.917 | -1,067.901 | 2,945.162 | 0.385 | 29,324.750 |
| B_maxOI_below_buy_PE | next(>=4d) ATM | 1h | 39 | 59.917 | -684.292 | 934.279 | 0.462 | 2,336.750 |
| B_maxOI_below_buy_PE | next(>=4d) ATM | close | 39 | 847.417 | -891.438 | 2,788.188 | 0.487 | 33,049.250 |
| B00_every_day_CE | front-week ATM | 1h | 185 | -246.103 | -549.195 | 47.565 | 0.405 | -45,529.100 |
| B00_every_day_CE | front-week ATM | close | 185 | -602.511 | -1,271.000 | 33.779 | 0.384 | -111,464.450 |
| B00_every_day_CE | next(>=4d) ATM | 1h | 183 | -224.608 | -533.223 | 73.112 | 0.426 | -41,103.350 |
| B00_every_day_CE | next(>=4d) ATM | close | 183 | -487.773 | -1,095.468 | 178.332 | 0.426 | -89,262.500 |
| B00_every_day_PE | front-week ATM | 1h | 185 | -267.876 | -568.557 | 34.159 | 0.389 | -49,557.150 |
| B00_every_day_PE | front-week ATM | close | 185 | -63.910 | -862.212 | 834.181 | 0.368 | -11,823.350 |
| B00_every_day_PE | next(>=4d) ATM | 1h | 183 | -215.253 | -527.267 | 127.897 | 0.415 | -39,391.250 |
| B00_every_day_PE | next(>=4d) ATM | close | 183 | -117.220 | -892.329 | 648.926 | 0.404 | -21,451.250 |
| C_more_cheap_gaps_buy_CE | front-week ATM | 1h | 20 | -376.950 | -1,215.812 | 609.888 | 0.400 | -7,539.000 |
| C_more_cheap_gaps_buy_CE | front-week ATM | close | 20 | -664.087 | -2,347.640 | 1,335.520 | 0.300 | -13,281.750 |
| C_more_cheap_gaps_buy_CE | next(>=4d) ATM | 1h | 20 | -325.925 | -1,130.158 | 639.719 | 0.400 | -6,518.500 |
| C_more_cheap_gaps_buy_CE | next(>=4d) ATM | close | 20 | -342.045 | -1,963.550 | 1,578.778 | 0.350 | -6,840.900 |
| E_gbm_breakout_up_buy_CE(Mar-Oct26) | front-week ATM | 1h | 63 | -134.964 | -597.466 | 337.497 | 0.397 | -8,502.750 |
| E_gbm_breakout_up_buy_CE(Mar-Oct26) | front-week ATM | close | 63 | -344.502 | -1,473.838 | 866.183 | 0.397 | -21,703.600 |
| E_gbm_breakout_up_buy_CE(Mar-Oct26) | next(>=4d) ATM | 1h | 62 | -186.081 | -638.317 | 272.451 | 0.387 | -11,537.000 |
| E_gbm_breakout_up_buy_CE(Mar-Oct26) | next(>=4d) ATM | close | 62 | -315.347 | -1,371.353 | 772.314 | 0.452 | -19,551.500 |
| E_gbm_breakout_dn_buy_PE(Mar-Oct26) | front-week ATM | 1h | 59 | -570.661 | -956.900 | -103.558 | 0.339 | -33,669.000 |
| E_gbm_breakout_dn_buy_PE(Mar-Oct26) | front-week ATM | close | 59 | -576.158 | -1,782.624 | 881.326 | 0.288 | -33,993.350 |
| E_gbm_breakout_dn_buy_PE(Mar-Oct26) | next(>=4d) ATM | 1h | 58 | -650.118 | -1,127.714 | -159.884 | 0.345 | -37,706.850 |
| E_gbm_breakout_dn_buy_PE(Mar-Oct26) | next(>=4d) ATM | close | 58 | -889.733 | -2,102.720 | 379.755 | 0.310 | -51,604.500 |
| D_manip_like_follow_CE | front-week ATM | 1h | 8 | -176.750 | -1,201.384 | 922.156 | 0.625 | -1,414.000 |
| D_manip_like_follow_CE | front-week ATM | close | 8 | 486.250 | -2,743.468 | 3,747.848 | 0.500 | 3,890.000 |
| D_manip_like_follow_CE | next(>=4d) ATM | 1h | 8 | -237.281 | -1,462.887 | 1,022.957 | 0.625 | -1,898.250 |
| D_manip_like_follow_CE | next(>=4d) ATM | close | 8 | 222.594 | -3,276.062 | 3,671.159 | 0.500 | 1,780.750 |
| D_manip_like_follow_PE | front-week ATM | 1h | 26 | -286.375 | -834.756 | 295.756 | 0.385 | -7,445.750 |
| D_manip_like_follow_PE | front-week ATM | close | 26 | -538.750 | -1,704.763 | 751.738 | 0.231 | -14,007.500 |
| D_manip_like_follow_PE | next(>=4d) ATM | 1h | 26 | -276.225 | -838.212 | 348.925 | 0.423 | -7,181.850 |
| D_manip_like_follow_PE | next(>=4d) ATM | close | 26 | -480.100 | -1,589.142 | 793.356 | 0.269 | -12,482.600 |
Across all periods (front-week):
| rule | exit | split | n | avg | win |
|---|---|---|---|---|---|
| A2_cheap_accum_trailing120rank_straddle(post-hoc) | 1h | train | 29 | -1,391.752 | 0.207 |
| A2_cheap_accum_trailing120rank_straddle(post-hoc) | 1h | tune | 4 | -120.313 | 0.500 |
| A2_cheap_accum_trailing120rank_straddle(post-hoc) | 1h | test | 36 | -784.757 | 0.306 |
| A2_cheap_accum_trailing120rank_straddle(post-hoc) | close | train | 29 | -1,417.819 | 0.379 |
| A2_cheap_accum_trailing120rank_straddle(post-hoc) | close | tune | 4 | 669.437 | 0.750 |
| A2_cheap_accum_trailing120rank_straddle(post-hoc) | close | test | 36 | -1,937.153 | 0.222 |
| A00_every_day_straddle | 1h | train | 181 | -693.062 | 0.282 |
| A00_every_day_straddle | 1h | tune | 125 | -251.341 | 0.320 |
| A00_every_day_straddle | 1h | test | 185 | -513.980 | 0.303 |
| A00_every_day_straddle | close | train | 181 | -971.650 | 0.337 |
| A00_every_day_straddle | close | tune | 125 | -846.548 | 0.272 |
| A00_every_day_straddle | close | test | 185 | -666.421 | 0.297 |
| B_maxOI_above_buy_CE | 1h | train | 38 | -676.053 | 0.474 |
| B_maxOI_above_buy_CE | 1h | tune | 0 | – | – |
| B_maxOI_above_buy_CE | 1h | test | 24 | 349.615 | 0.500 |
| B_maxOI_above_buy_CE | close | train | 38 | -673.487 | 0.368 |
| B_maxOI_above_buy_CE | close | tune | 0 | – | – |
| B_maxOI_above_buy_CE | close | test | 24 | 69.708 | 0.542 |
| B_maxOI_below_buy_PE | 1h | train | 38 | -179.795 | 0.395 |
| B_maxOI_below_buy_PE | 1h | tune | 24 | -195.952 | 0.458 |
| B_maxOI_below_buy_PE | 1h | test | 39 | -30.250 | 0.410 |
| B_maxOI_below_buy_PE | close | train | 38 | -148.509 | 0.342 |
| B_maxOI_below_buy_PE | close | tune | 24 | 941.683 | 0.542 |
| B_maxOI_below_buy_PE | close | test | 39 | 751.917 | 0.385 |
| C_more_cheap_gaps_buy_CE | 1h | train | 20 | -2,271.408 | 0.250 |
| C_more_cheap_gaps_buy_CE | 1h | tune | 21 | -679.262 | 0.333 |
| C_more_cheap_gaps_buy_CE | 1h | test | 20 | -376.950 | 0.400 |
| C_more_cheap_gaps_buy_CE | close | train | 20 | -405.030 | 0.350 |
| C_more_cheap_gaps_buy_CE | close | tune | 21 | -1,478.143 | 0.286 |
| C_more_cheap_gaps_buy_CE | close | test | 20 | -664.087 | 0.300 |
| D_manip_like_follow_PE | 1h | train | 7 | -297.000 | 0.429 |
| D_manip_like_follow_PE | 1h | tune | 15 | -262.117 | 0.467 |
| D_manip_like_follow_PE | 1h | test | 26 | -286.375 | 0.385 |
| D_manip_like_follow_PE | close | train | 7 | -3,047.429 | 0.143 |
| D_manip_like_follow_PE | close | tune | 15 | 269.583 | 0.467 |
| D_manip_like_follow_PE | close | test | 26 | -538.750 | 0.231 |
Range-based straddles lost more than straddles bought every day (A2: −₹785 per trade at 1h in 2026 vs −₹514 every day) because the extra movement is already in the premium. The max-OI "pull" rule B was positive in 2026 but negative in train, with confidence intervals spanning roughly ±₹2,000. That is FAIL, not an edge.
| Hypothesis | Verdict | Key number (2026 test) |
|---|---|---|
| Accumulation predicts 1–5 day direction | FAIL | LGBM AUC up1 0.48, up3 0.45, up5 0.51 vs placebo ≈0.51; 1/128 univariate p<0.05 |
| Accumulation predicts next-day range / |move| | PASS (predictor) | Partial IC of chain cheapness vs range −0.44 [−0.56, −0.26], same sign in train, tune and test; tree model no better than price/vol-only |
| Breakout above prior high / below prior low | WATCH | / FAIL: AUC 0.69 / 0.64, but price/vol-only gives 0.66 / 0.65 |
| Next-day first-hour best side (CE vs PE) | FAIL | AUC 0.45 |
| Expiry pin to max-OI strike | FAIL | Max-OI nearer than spot in 36/40/41% (DTE 1/2/3) |
| Regimes (HMM/GMM) | PASS for range | / FAIL for direction: range p≈1e-7–1e-9; direction p≈0.45 |
| Manipulation-like days → direction | FAIL | Sign flips between periods; followed by quieter days |
| Any buy-side rule after costs | FAIL | All 2026 rules negative or inconsistent across periods |
Files: RESULTS.md, univariate.csv, partial_ic.csv, gbm_results.csv, gbm_incremental.csv, regimes.csv, anomaly_days.csv, pinning.csv, backtest.csv, shap_mean_abs.csv. Research, not advice.