← Live dashboard · Research index · generated 2026-10-21 07:15 IST
Moves = swings of 80+ points between turning points of Nifty 1-minute closes, from Upstox exchange candles, with each session split separately. The move start is the turning point. For each move I checked the fusion label in force at the start and the first label in the move's direction afterwards, up to 30 min after the move ended. A move is excluded when fusion was "insufficient-data" for more than half of it. That is a fair exclusion: the engine had no inputs, so it was not wrong.
| Fusion log | moves | scored | excluded (no data) | already aligned before start | flipped after start | median lag (min) | median % of move done at flip | never flipped | individual lags (min) |
|---|---|---|---|---|---|---|---|---|---|
| VPS (shown on /live/), every 2 min | 22 | 11 | 11 | 2 | 4 | 76 | 74% | 5 | 4.5, 126.5, 25.5, 161.5 |
| Box, every ~2.5–5 min | 22 | 14 | 8 | 2 | 7 | 55 | 74% | 5 | 6.8, 122.1, 24.9, 80.2, 54.7, 10.8, 163.7 |
On 8 Oct the 4.5-min "lag" is just the engine's first run (it starts at 09:20). The 2 "aligned" cases were labels already in place 17-48 min before the move, during an existing trend. Fusion versions changed from v1.1 to v1.4 during the window, so this is a short, mixed sample.
Today (21 Oct). Gap-up open 23,016, high 23,120.9 at 09:40, drop to 22,922.45 at 10:20 (about −198 pts). The Upstox token was missing until about 10:41. Fusion showed "insufficient-data" from 09:22 to 10:40, and its first live label (10:44 VPS) was range, after the drop had ended. These moves are excluded from the numbers above. As an anecdote only: on today's exchange candles (fetched after the fact), the opening-range-failure rule would have flagged DOWN at 09:47 (23,072). That rule is not live because it failed the 2026 robustness check.
| date | move (IST) | pts | fusion label at start | result | lag min (negative = lead) | % of move done at flip | share of move with no fusion data |
|---|---|---|---|---|---|---|---|
| 2026-10-08 | 09:16→15:07 | -377 | no-log | flipped after | 4 | 5 | 7% |
| 2026-10-09 | 09:24→11:20 | +226 | insufficient-data | flipped after | 108 | 81 | 95% |
| 2026-10-09 | 11:20→12:01 | -80 | insufficient-data | never | – | – | 0% |
| 2026-10-09 | 12:01→14:18 | +130 | mild_up | aligned before | -40 | – | |
| 2026-10-12 | 09:16→15:09 | -335 | no-log | flipped after | 126 | 77 | 38% |
| 2026-10-13 | 09:15→10:01 | +253 | no-log | flipped after | 26 | 83 | 48% |
| 2026-10-13 | 10:01→11:28 | -91 | strong_up | never | – | – | 9% |
| 2026-10-13 | 11:28→15:28 | +238 | mild_up | aligned before | -18 | – | |
| 2026-10-14 | 09:32→09:48 | +86 | insufficient-data | never | – | – | 100% |
| 2026-10-14 | 09:48→13:14 | -194 | insufficient-data | flipped after | 202 | 92 | 68% |
| 2026-10-14 | 13:14→13:55 | +99 | range | never | – | – | 0% |
| 2026-10-15 | 09:22→13:37 | +367 | insufficient-data | never | – | – | 100% |
| 2026-10-15 | 13:37→15:12 | -126 | insufficient-data | never | – | – | 100% |
| 2026-10-16 | 09:15→09:36 | -132 | no-log | flipped after | 44 | 26 | 100% |
| 2026-10-16 | 09:36→10:36 | +228 | insufficient-data | never | – | – | 33% |
| 2026-10-16 | 10:36→11:10 | -84 | range | never | – | – | 41% |
| 2026-10-16 | 11:10→15:28 | +84 | insufficient-data | never | – | – | 100% |
| 2026-10-19 | 09:18→09:28 | -190 | no-log | never | – | – | 100% |
| 2026-10-19 | 09:28→09:37 | +185 | insufficient-data | never | – | – | 80% |
| 2026-10-19 | 09:37→14:25 | -314 | range | flipped after | 162 | 72 | 19% |
| 2026-10-21 | 09:16→09:35 | +91 | no-log | never | – | – | 100% |
| 2026-10-21 | 09:35→10:12 | -188 | insufficient-data | never | – | – | 100% |
options/1m/by_expiry), nearest expiry, ATM = spot rounded to 50. Synthetic forward = K + CE − PE. Full-chain PCR from OI. Breadth: see the breadth row; it uses today's 50 constituents, so it has survivorship bias.| Signal | test n | per day | hit 40pt/15m | vol-matched base | time-of-day base | opposite dir | hit 40pt/30m | vol-matched base | 80pt/15m hit/base | 80pt/30m hit/base | median min to 40 pts | train 40/15 hit vs base | first hour (09:20-10:15) test hit vs base | verdict |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Fast market: 40+ pt 5-min burst (either way) spot · direction-agnostic | 1323 | 3.0 | 53.4% | 42.1% | 28.7% | – | 76.5% | 65.0% | 12.8% / 8.0% | 26.6% / 19.5% | 10 | 53.7% vs 37.0% | 59.2% vs 47.2% | PASS → live |
| Bank Nifty breaks away from Nifty (either way) Bank Nifty 1m (Upstox hist) · direction-agnostic | 810 | 1.9 | 52.1% | 41.1% | 34.7% | – | 74.2% | 63.2% | 10.4% / 7.5% | 25.1% / 18.4% | 10 | 43.1% vs 31.7% | 58.6% vs 46.7% | PASS → live |
| Day high/low rejection 10:00-13:00 spot · directional | 545 | 1.2 | 18.5% | 14.8% | 10.6% | 13.8% | 31.4% | 26.5% | 4.4% / 2.7% | 8.1% / 6.7% | 13 | 16.9% vs 11.5% | 22.2% vs 18.9% | PASS → live |
| 5-min burst, follow its direction spot · directional | 1536 | 3.5 | 29.0% | 21.9% | 14.7% | 27.6% | 41.8% | 34.9% | 8.4% / 4.1% | 15.4% / 10.1% | 10 | 30.3% vs 19.6% | 30.9% vs 24.2% | fail test hit rate not >=1.2x and +3 pts over the volatility-matched base (p<0.01), or not >=3 pts above the opposite-direction rate |
| VIX rising while Nifty flat (either way) India VIX 1m (Upstox hist) · direction-agnostic | 434 | 1.0 | 28.6% | 28.7% | 24.4% | – | 52.5% | 49.5% | 6.7% / 4.6% | 14.7% / 12.3% | 14 | 25.7% vs 23.4% | 42.2% vs 40.3% | fail test hit rate not >=1.2x and +3 pts over the volatility-matched base (p<0.01); no edge in 2026 alone |
| Bank Nifty leads: follow BN direction Bank Nifty 1m (Upstox hist) · directional | 911 | 2.1 | 27.2% | 21.3% | 17.9% | 26.9% | 41.5% | 33.9% | 6.0% / 3.8% | 14.5% / 9.5% | 12 | 23.9% vs 16.6% | 29.1% vs 24.0% | fail test hit rate not >=1.2x and +3 pts over the volatility-matched base (p<0.01), or not >=3 pts above the opposite-direction rate; 2026: opposite-direction moves as common as signalled ones |
| Opening-range failure (break then back inside) spot · directional | 544 | 1.2 | 23.0% | 16.3% | 16.0% | 18.0% | 35.5% | 28.2% | 4.0% / 2.4% | 9.2% / 6.5% | 12 | 16.0% vs 12.3% | 24.2% vs 18.7% | fail 2026: opposite-direction moves as common as signalled ones |
| ATM straddle jumps while spot flat (IV pop) options (Aug-2024+) · direction-agnostic | 1272 | 2.9 | 22.8% | 22.2% | 22.5% | – | 40.5% | 41.5% | 3.5% / 3.2% | 9.6% / 9.1% | 14 | 27.8% vs 28.3% | 40.0% vs 39.9% | fail test hit rate not >=1.2x and +3 pts over the volatility-matched base (p<0.01); no edge in the training period |
| Options leading index (synthetic-forward vs spot, 5-min change) options (Aug-2024+) · directional | 2814 | 6.5 | 18.7% | 14.9% | 12.6% | 13.6% | 31.5% | 26.5% | 3.8% / 2.4% | 8.7% / 6.5% | 13 | 14.5% vs 14.8% | 26.7% vs 22.6% | fail no edge in the training period |
| PCR (full-chain OI) 15-min change options OI (Aug-2024+) · directional | 1023 | 2.4 | 16.5% | 18.3% | 13.7% | 13.6% | 28.6% | 30.8% | 2.2% / 3.1% | 5.9% / 8.0% | 13 | 23.3% vs 23.3% | 18.3% vs 20.3% | fail test hit rate not >=1.2x and +3 pts over the volatility-matched base (p<0.01), or not >=3 pts above the opposite-direction rate; no edge in the training period |
| Opening-range breakout with gap/trend (first hour) spot · directional | 319 | 0.7 | 16.0% | 17.2% | 17.7% | 16.0% | 29.8% | 29.2% | 1.9% / 2.5% | 6.3% / 6.7% | 14 | 13.3% vs 13.4% | 17.0% vs 18.3% | fail test hit rate not >=1.2x and +3 pts over the volatility-matched base (p<0.01), or not >=3 pts above the opposite-direction rate; no edge in the training period; big moves are LESS likely than at a normal minute of the same time of day (16.0% vs 17.7%) - fails as a warning |
| VIX rising while Nifty flat → down India VIX 1m (Upstox hist) · directional | 434 | 1.0 | 14.7% | 15.2% | 13.0% | 14.3% | 26.0% | 26.7% | 2.8% / 2.5% | 6.9% / 6.5% | 13 | 15.1% vs 13.1% | 24.2% vs 21.3% | fail test hit rate not >=1.2x and +3 pts over the volatility-matched base (p<0.01), or not >=3 pts above the opposite-direction rate |
| Range compression (30-min range vs 20-day norm) spot · direction-agnostic | 1729 | 4.0 | 10.2% | 7.6% | 20.4% | – | 26.1% | 20.8% | 1.0% / 0.5% | 2.9% / 2.1% | 18 | 7.4% vs 4.7% | 20.9% vs 17.0% | fail big moves are LESS likely than at a normal minute of the same time of day (10.2% vs 20.4%) - fails as a warning |
| Breakout of a compressed range spot · directional | 1010 | 2.3 | 5.5% | 4.4% | 10.1% | 4.5% | 14.1% | 11.5% | 0.6% / 0.3% | 2.3% / 1.2% | 18 | 4.6% vs 2.7% | 4.2% vs 8.2% | fail test hit rate not >=1.2x and +3 pts over the volatility-matched base (p<0.01), or not >=3 pts above the opposite-direction rate; big moves are LESS likely than at a normal minute of the same time of day (5.5% vs 10.1%) - fails as a warning |
"Median min to 40 pts" is the lead time: minutes from the alert to the 40-pt touch, among hits. The fusion bias, by contrast, typically flipped about an hour after the move started.
Buy the ATM option at the close of the minute after the alert: CE for up, PE for down, or a CE+PE straddle for either-way alerts. Exit when spot moves 40 pts in favour, 30 pts against (directional only), or after 30 min (15 min for straddles). Cost is 3 pts per leg round trip. Control: random entries at the same times of day on test days, random direction.
| Signal | trade | n | win % | avg P&L per unit (pts, after costs) | random control win % | random control avg |
|---|---|---|---|---|---|---|
| Day high/low rejection 10:00-13:00 | buy ATM CE/PE | 538 | 38% | -2.15 | 35% | -3.42 |
| Options leading index (synthetic-forward vs spot, 5-min change) | buy ATM CE/PE | 2814 | 39% | -3.30 | 38% | -2.58 |
| Opening-range failure (break then back inside) | buy ATM CE/PE | 538 | 41% | -2.81 | 38% | -3.23 |
| Fast market: 40+ pt 5-min burst (either way) | buy ATM straddle | 1302 | 18% | -6.60 | 12% | -6.46 |
| Bank Nifty breaks away from Nifty (either way) | buy ATM straddle | 801 | 18% | -6.16 | 14% | -6.32 |
All are negative. Option prices already move ahead of the index: the "options lead the index" signal is literally the option price having moved first, so the buyer is late by construction. Premium also expands in fast markets. For Satya's style, the practical use is timing and filtering: an either-way alert says the tape is about to move, so a with-trend entry has a better chance of follow-through, and no alert means expect chop. A rejection alert against the trend is a reason not to chase. None of these combinations has been tested as a full strategy yet.
The live bot's code replayed on the logged feeds. This is a tiny, unproven sample, shown only so nobody is surprised. Hit = 40 pts within 15 min.
| signal | alerts | hits |
|---|---|---|
| Bank Nifty breaks away from Nifty (either way) | 14 | 8 (57%) |
| Fast market: 40+ pt 5-min burst (either way) | 24 | 14 (58%) |
| Day high/low rejection 10:00-13:00 | 7 | 0 (0%) |
| Options leading index (synthetic-forward vs spot, 5-min change) | 60 | 11 (18%) |
| Opening-range failure (break then back inside) | 6 | 1 (17%) |
A new box bot bots/early-warning/ recomputes the passing signals every minute from the Upstox feed. It writes feeds/early-warning/latest.json, which is synced to the VPS like the other feeds, and drives the Early warning panel on /live/. Each alert stays active for 15 minutes. The fusion bias is untouched. The failed signals that came closest (options-lead, opening-range failure) are computed as hidden "shadow" alerts and logged so they can be checked live, but they are never shown as warnings.
pct_above_vwap): live only. Historical breadth was rebuilt from constituent candles (see table).Code and data: box /workspace/early-warning/; S3 s3://analyticsdata123/options-ml-platform/data/knowledge/early-warning/. Read-only research. No orders placed. Not investment advice.