Momentum barometer (blended flavours): pre-registered specification
Written 2026-10-02, before any result below was computed; the commit is the freeze. Changes after results are logged at the bottom with the date and reason. Brief: docs/briefs/barometers.md. The earlier sector-momentum test (trend_momentum_spec.md) did not beat equal weight; this is a stock-level, cross-sectional study.
Universe (point-in-time, survivorship-free)
At each month-end t: NSE main-board equities (EQ/BE/BZ; ETFs and SME excluded) that pass compute/breadth.py’s liquidity rule on that day (median traded value over the last 60 bars at least ₹1 crore in latest-CPI rupees, and at least 45 bars in the last 60 sessions), with at least 273 sessions of adjusted-price history. Prices are bhavcopy closes adjusted for corporate actions (equity_prices_adjusted). Stocks that later delist are in the universe while they traded. Used from the first month-end with 300 or more eligible stocks.
Flavours (all computed from data up to t)
| Code | Flavour | Definition | Source |
|---|---|---|---|
r12_1 | 12-1 price momentum | Return from month-end t−12 to t−1 | Jegadeesh and Titman (1993) |
r6_1 | 6-1 price momentum | Return from t−6 to t−1 | Jegadeesh and Titman (1993) |
voladj | Volatility-adjusted | r12_1 / annualised std of daily log returns over the last 252 sessions | Barroso and Santa-Clara (2015), stock-level form |
resid | Residual momentum | Regress the stock’s monthly returns on Nifty 500’s over months t−36…t−1 (at least 24); sum of residuals over t−12…t−2 divided by the residuals’ std over the window | Blitz, Huij and Martens (2011), market model only |
hi52 | Distance from the 52-week high | Close at t / highest adjusted high of the last 252 sessions | George and Hwang (2004) |
nse | NSE’s normalised score | 50% z(12-month return / σ) + 50% z(6-month return / σ), returns to t−1 with no skip, σ as voladj | NSE methodology for Nifty200 Momentum 30 (Sept 2026 document) |
- Industry momentum is left out: there is no point-in-time industry map for stocks in the warehouse. Industry-level momentum is shown on the trend barometer through sector indices.
- Earnings momentum needs company financials, which are on hold.
The blend
On each month-end: z-score each flavour across the universe; winsorise at ±3; re-standardise; average with equal weights over the flavours available (at least 4 of 6); rank to a 0–100 percentile. No fitted weights. Reported alongside: the time-averaged cross-sectional Spearman correlation between every pair of flavours.
Portfolios used to test it
- Quintiles by each flavour and by the blend, equally weighted, formed at month-end t and held to t+1 (returns to the last trade if a stock stops trading in the month; it is then held in cash).
- Long-short = Q5 − Q1 (gross, a factor measure, not an investable product). Long-only = Q5 against the universe’s equal weight, with 0.25% of value traded each way (stock trading cost) and turnover reported.
- Tranched version: 3 overlapping sleeves, each formed in its own month and held 3 months (Jegadeesh and Titman’s overlapping portfolios), against the 1-month version: turnover and the spread of outcomes.
Hypotheses and measurements (α = 0.05/3 = 0.0167 for the tested ones)
- MO-H1, the premium exists (tested). Blend long-short mean monthly return > 0. One-sided, Newey-West t with 6 lags. Passes if p < α, the same sign in both halves, and the deflated Sharpe of the long-only Q5 against the universe (trials: 7 signals × 2 holding schemes = 14, plus the 2 sector-momentum trials of the first run) is above 0.95.
- MO-H2, blending helps (pass bar fixed). The blend’s long-short Sharpe is at or above the median single flavour’s, and its maximum drawdown is no deeper than the median flavour’s. Descriptive bar, no p-value.
- MO-H3, crash risk (tested). Daniel and Moskowitz (2016): momentum crashes come in “panic states”, after market falls, when the market rebounds. Flag = Nifty 500 total return over the last 24 months below zero at t. Hypothesis: the blend long-short mean return in flagged months is below its mean in other months. One-sided, Welch test on monthly returns with a block-bootstrap check (block 6 months). Passes if p < α and at least 24 flagged months exist. Reported with it: the blend’s worst 10 months and how many were flagged.
- MO-H4, which flavours diversify (measurement). Expected from the literature:
residandhi52have the lowest average correlation withr12_1. Reported, not tested.
The barometer readings (published)
- Momentum factor now: the blend long-short return over the last 12 months and its percentile in its own expanding history. Is momentum being rewarded?
- Momentum breadth: share of the universe with positive
r12_1; percentile in its own history. - Crash-risk flag: the MO-H3 flag, with the market’s last-month return beside it.
- Leaders: the 30 highest blended scores among the 200 most-traded stocks (median traded value, last 60 sessions), and every flavour’s rank for them. A description of what has momentum, not a recommendation; the page says the long-only test result next to it.
Original study: rebalance timing luck in Nifty200 Momentum 30
- NSE’s rules (methodology document, Sept 2026, section 17): Nifty 200 members with one year of listing and F&O availability; momentum ratio = price return / σ (annualised std of daily log returns over a year) for 12 and 6 months, prices to the last trading day of the month before the rebalance month; z-scores within the universe; weighted average z = 50/50; normalised score = 1 + z if z ≥ 0, else 1/(1 − z); top 30; weight = free-float market value × score, capped at the lower of 5% and 5 × the market-value weight; buffer: top 15 always in, members ranked beyond 45 always out; semi-annual, June and December.
- Our replica, and what it cannot copy: there is no point-in-time Nifty 200 membership or free-float market value in the warehouse. The replica’s universe is the 200 most-traded eligible stocks (median traded value over the last 126 sessions), F&O availability is not applied, and weights are score-only with a 5% cap. The buffer is applied as NSE writes it. The replica takes effect at the close of the rebalance month’s last session.
- Validation gate: monthly returns of the June/December replica against the actual Nifty200 Momentum 30 total-return index. If the correlation is at least 0.90, the study is published as a study of that index’s schedule; below 0.90, it is published as a study of “a 30-stock momentum portfolio built on NSE’s scoring”, without attributing results to the index.
- Measurement: run the replica on all six semi-annual schedules (Jan/Jul … Jun/Dec). Report the spread (max − min) of CAGR, the range of calendar-year returns, and the largest single-year gap; and the tranched replica (six sleeves, one per schedule). Expected, not tested: a CAGR spread above 1 point a year (Hoffstein, Faber and Braun found >100 bp for US factor indices).
Not tested, stated in advance
No other flavour definitions, windows, weightings, quantile counts or universes. Anything tried later is exploratory.
Addendum 1: index momentum (pre-registered 2026-10-02, before any index result was computed)
Owner decision, 2026-10-02: the site stays indices-only, so the published list of 30 leading stocks is replaced by an index momentum table. The stock panel stays as the measuring instrument for MO-H1 to MO-H4, because those tests need a wide cross-section.
The index momentum table (description)
- Universe: every live NSE equity index in the broad, sectoral, thematic and strategy groups (total-return series from
index_tri; an index is live if it printed in the last 10 days), with at least 13 completed month-ends of history. - Flavours: the same six as for stocks, computed on each index’s total-return series at completed month-ends:
r12_1andr6_1;voladj(r12_1over the annualised std of daily log returns over 252 sessions);resid(a market model against Nifty 500 over the 36 monthly returns ending t−1, at least 24; residuals of the 11 months ofr12_1, summed, over the residuals’ std);hi52(the last month-end close over the highest close of the last 252 sessions; total-return series have no intraday highs);nse(50/50 z of the 12- and 6-month return over σ, no skip).
- Blend: z-score each flavour across all eligible indices, winsorise at ±3, re-standardise, average the available flavours (at least 4). Ranks are shown overall and within each family.
- Broad indices are in the table for reference. Overlapping indices (Bank, Private Bank, PSU Bank) mean ranks are not independent; the page says so.
MO-H5, tested: blended momentum across de-duplicated sectors
- Universe, fixed now, one index per overlapping group of NSE’s sectoral group: Nifty Bank, Financial Services Ex-Bank, IT, Pharma, Auto, FMCG, Metal, Realty, Media, Oil & Gas, Consumer Durables, Cement, Chemicals (13).
- Left out: Private Bank, PSU Bank, Financial Services and 25/50 (overlap Bank), Healthcare, Nifty500 Healthcare and MidSmall Healthcare (overlap Pharma), the MidSmall Financial Services and IT & Telecom variants, and REITs & Realty (overlaps Realty, and history only from 2021).
- Rule: at each completed month-end, the sectors with at least 13 month-ends of history are eligible, and at least 6 must be. Rank them by the blend computed within that set. Hold the top 3 equally weighted for the next month.
- Benchmark: equal weight of all eligible de-duplicated sectors, rebalanced monthly.
- Costs: as
trend_momentum_spec.md: 0.10% of value traded each way; 0.15% a year fund cost on both legs. - Pass bar:
- the deflated Sharpe ratio of the monthly excess over the benchmark is above 0.95, with trials = 3 (the two earlier sector-momentum rules plus this one);
- and the mean excess is positive in both halves of the sample.
- Reported alongside: CAGR, worst fall, hit rate and turnover. Expected from the earlier sector results: fail.
- Known bias: NSE back-calculates sector indices before their launch dates.
Trend barometer display (no new test)
The trend grid is extended from sectors to every live thematic and strategy index, for description only. The trend environment reading is unchanged (it still uses the median sector). The trend page shows each index’s blended momentum rank beside its trend score.
Results log (addendum 1)
2026-10-02: first run (2005-02 to 2026-09, 260 months)
Ran as specified; nothing changed after results were seen.
- MO-H5: fail. Top three de-duplicated sectors by the blend: 16.0% a year, against 14.6% for all of them equally weighted, after costs.
- Worst fall -55% against -64%; ahead in 49% of months; turnover 2.5× a year.
- Mean monthly excess +0.21% in the first half and -0.01% in the second.
- Deflated Sharpe 0.56 with 3 trials.
- Like the two earlier sector rules, the gap is within luck.
- Index table: 114 of 120 live indices had 13 completed month-ends at the end of Sept 2026. Pharma ranks first; Railways PSU is last.
- Trend grid extended to 41 thematic and 32 strategy indices. The Nifty 500 tests, timing luck and environment reading are unchanged (checked: environment 73.3, TR-H1 worst rank 0.24, DSR 0.016).
Results log
Implementation notes, 2026-10-02 (written before the first run unless marked)
- Month-end prices are each stock’s last adjusted close on or before the month’s last NSE session; after a stock’s last trade its price stays flat (zero return, as cash). A stock is eligible only if it traded on the month-end session.
- Residual momentum uses the 36 monthly returns ending at t−1 for the regression and the 11 residuals ending t−11…t−1 (the same months as
r12_1), with at least 8 of them present. - NSE score flavour z-scores within our liquid universe, not within Nifty 200.
- Replica: the universe is the 200 eligible stocks with the highest median traded value over 126 sessions, among those with 252 sessions of history; the tranched replica averages the six schedules’ monthly returns (sleeves reset to equal size each month).
- Found on the first run and fixed (no rule changed): the latest month-end is the latest data date (1 Oct 2026), so a one-day “month” entered the tests. Returns ending at a partial month are now excluded from every test; that month is used only for today’s readings.
2026-10-02: first run (formation months 2004-11 to Aug 2026)
- MO-H1, the premium: pass. Blend long-short (top minus bottom quintile, gross) 1.83% a month, Newey-West t 4.7; 1.88% and 1.77% in the two halves. Long-only top quintile net of costs 25.7% a year against the universe’s equal weight 13.7% (price returns); deflated Sharpe 0.978 with 16 trials.
- MO-H2, blending: fail. The blend’s Sharpe (1.01) beat the median flavour’s (0.93) but its worst fall (-59%) was deeper than the median flavour’s (-55%). Residual momentum had the best Sharpe and the shallowest fall on its own.
- MO-H3, crash flag: fail. In the 28 months after the market’s 24-month return turned negative, long-short averaged -2.01% a month against 2.29% otherwise; Welch p = 0.035 (bar 0.0167), block bootstrap p = 0.011. The four worst months (May 2009, Jan 2012, Jun 2020, Dec 2008; corrected 2026-10-03, see below) were all flagged. Directionally strong; not significant at the pre-registered bar.
- MO-H4, correlations (measured). Lowest average cross-sectional correlation with 12-1: 52-week high (0.52), then 6-1 (0.67), residual (0.73). Residual and 52-week high are the least correlated pair (0.36).
- Nifty200 Momentum 30 timing luck. The June/December replica’s monthly returns correlate 0.912 with the index (257 months), above the 0.90 gate, though its level trails the index (price returns, approximated universe and weights). Across the six semi-annual schedules the replica’s CAGR ranged over 8.3 points a year (2005-06 to 2026-09); the largest gap in one calendar year was 70 points (2009). NSE’s own June/December schedule was the lowest of the six in the replica; that ranking is luck, which is the point.
2026-10-03: correction to the month labels (no result changed)
The worst-months list named each month one too early (Apr 2009 instead of May 2009). A return formed on a month’s last session was dated with + MonthEnd(1), which rolls to the same month’s end when that session falls before the calendar month-end. The returns, flags and test statistics were correct; only the labels were wrong. They are now dated by the month the return is earned (+ MonthBegin(1)). The long-short growth curves on the site were shifted the same way and are corrected.
2026-10-03: audit corrections (register rows R1, R4, R5); no test verdict changes
- R1, attribution of the timing-luck study to Nifty200 Momentum 30: withdrawn.
- Why the gate failed: the 0.90 gate on raw monthly correlation could not tell the replica from the market. Nifty 500 alone correlates 0.89 with the index, and the five wrong-schedule replicas 0.889–0.906, against the June/December replica’s 0.912.
- The added bar (amendment made after results were seen, logged as such): the same 0.90 bar on returns above the parent Nifty 200, which is what a momentum replica has to reproduce. Result: correlation of excess returns 0.57, tracking error 11.2% a year, CAGR 5.1 points below the index over 257 months.
attributed_to_indexis now false. - What may still be said: the study stands as one of “a 30-stock momentum portfolio built on NSE’s scoring rules”. Its finding (an 8.3-point CAGR spread across the six half-yearly calendars; 70 points in 2009) is about the rules’ calendar, not about the index. The sentence that NSE’s calendar “came out lowest” describes the replica only.
- R4, MO-H1 long-only: two partial months had been booked as 0% for the top quintile. Matched months now: 26.0% against 13.7% a year, 258 months (logged as 25.7% against 13.7%). Newey-West t 4.74, DSR 0.978: pass, unchanged.
- R5, partial-month rule: a month whose last weekday is an NSE holiday now counts once the calendar has moved past it. No result changed on this run.
- Calendar time (T3): annualisation in the shared trend metrics now uses calendar time; MO-H5 is unchanged (16.0% vs 14.6%, DSR 0.57).