There is a version of momentum investing that almost works, and the difference between it and the version that does is one month of data.
Rank every stock in the Nifty 500 by its return over the last twelve months, buy the top thirty, rebalance monthly. That is the intuitive construction, and it is worse than the standard academic one, which ranks on the first eleven of those twelve months and discards the most recent. The discarded month is not noise. It is a different, opposing signal that quietly contaminates the first.
Two effects, two horizons, opposite signs
Jegadeesh and Titman’s 1993 paper established the finding that generated the entire momentum literature: portfolios formed on returns over the previous three to twelve months continued to outperform over the following three to twelve months. Buying past winners and selling past losers earned roughly 1% a month over the 1965–1989 US sample. The result has since been replicated across developed and emerging markets, across decades, and out of sample after publication — which is rare enough that momentum is often described as the anomaly most likely to be real.
But at shorter horizons, returns reverse. Over a horizon of days to a few weeks, the stocks that fell hardest tend to bounce and the stocks that rose hardest tend to give some back. This is the short-term reversal effect, and its mechanism is different: it is compensation for supplying liquidity to someone who needed to trade urgently, not compensation for a slow-diffusing information advantage.
So a raw twelve-month return sums two signals that point in opposite directions. Months one through eleven carry the momentum effect. Month twelve — the most recent one — carries the reversal effect. Including it means partly betting against yourself.
The fix is mechanical and is why you will see momentum written as “12-1” almost everywhere in the literature and in index methodology: measure the return from twelve months ago to one month ago, and ignore what happened since.
What that looks like in a pipeline
The awkward part of building 12-1 momentum is that it needs two lagged prices, and most expression languages only let you call one function per expression. The way through is to compute the pieces separately and then combine them with plain arithmetic:
price_1m_ago = @shift(close, 21)
price_12m_ago = @shift(close, 252)
momentum_12_1 = price_1m_ago / price_12m_ago
Each line writes a new column onto the panel that the next line can read by name. This decomposition pattern is worth internalising, because it is how you build anything more complex than a single indicator — rolling z-scores, Bollinger widths, ratio spreads, all of them.
Twenty-one and 252 are trading days, not calendar days. A month is roughly 21 trading sessions and a year roughly 252, which is why those two numbers appear constantly in quantitative finance.
The universe matters more than the signal
A momentum screen run over every listed Indian stock will fill its top ranks with microcaps that went up 400% on 40,000 rupees of daily turnover. The backtest will look spectacular. It will also be untradeable, because the price you would have paid to accumulate a position is not the price the screen ranked on.
Two constraints fix most of this:
Restrict to a real index. The Nifty 500 covers roughly the top 500 companies by full market capitalisation and accounts for the large majority of NSE market cap. Crucially, index membership must be applied as of the rebalance date, not as of today. A backtest that screens the 2015 market using today’s Nifty 500 constituent list has quietly excluded every company that was in the index in 2015 and got dropped — which are exactly the ones that performed badly. That is index-inclusion survivorship bias, and it inflates almost every retail backtest that ignores it.
Filter on rupee turnover, not share volume. Ten lakh shares of a four-rupee stock is forty lakh rupees of liquidity. Ten thousand shares of a four-thousand-rupee stock is four crore. Only one of those is a name you can build a position in. Screening on turnover above a few crore per day removes the bulk of untradeable results.
Sizing: rank-proportional, then capped
Equal weighting a momentum portfolio throws away information — the top-ranked name and the thirtieth-ranked name get identical capital despite very different signal strength. Rank-proportional weighting scales position size with rank, so conviction and allocation move together.
Left alone, that concentrates the book. NSE’s own factor indices solve this with a hard cap: the Nifty200 Momentum 30 methodology caps any single stock’s weight at 5%, redistributing the excess. The cap costs a little expected return and buys a large reduction in single-name risk, which is the right trade for a portfolio you intend to actually hold.
NSE builds its momentum index on a normalised momentum score derived from six- and twelve-month returns adjusted by volatility, rebalanced semi-annually. The construction below is the same family, run monthly on twelve-month returns.
Where this loses money
Momentum’s failure mode is specific and violent. Daniel and Moskowitz documented what they call momentum crashes: in panicked, high-volatility markets, momentum portfolios suffer extreme losses concentrated at the moment the market turns. The loser stocks the strategy is underweight rebound hardest off the bottom, and the winner stocks it holds were defensive names that lag the recovery. The March 2020 rebound and the 2009 recovery both produced this pattern.
This is not a tail you can diversify away inside the strategy, because it is the strategy. If you want to hold momentum through a full cycle, either accept the crash risk, blend momentum with a factor that behaves differently at inflections, or add a market-level trend filter that steps aside when the index itself is in a downtrend.
The second failure mode is more boring and more common: turnover. A monthly momentum rebalance on thirty names will trade a meaningful fraction of the book every month. In India each of those trades pays STT, exchange charges, stamp duty, GST and spread. A backtest run without a realistic cost model can show a comfortable margin that the real cost stack removes entirely.
Try it
The Nifty 500 Momentum 30 template implements this construction: point-in-time Nifty 500 membership, a rupee-turnover floor, a surveillance-flag exclusion, 12-1 momentum built from chained calculators, rank-proportional sizing and a 5% position cap, rebalanced monthly.
Run it against the Nifty 50 as a benchmark and look at the drawdown chart before the return number. Then run it again with the trend-gated variant, which adds an index-level filter, and compare the two worst drawdowns. The difference between those two charts is the entire argument for market-timing overlays, stated more honestly than any backtest summary can.
Further reading
- Why blending factors beats picking one on what happens to a momentum sleeve during its multi-year droughts
- Market-neutral investing: isolating the factor from the market for the long/short version of this same signal
- Top 30 or top decile? on the selection and capping choices this template makes
- Mean reversion: getting paid to provide liquidity for the short-horizon effect the skip month exists to sidestep
Glossary: momentum, rate of change, factor investing, investable universe, quantile sort.