Market-Neutral Momentum (Long/Short)
Buys the 25 strongest momentum names in the Nifty 500 and shorts the 25 weakest, sized so the two arms carry equal gross exposure and the book is roughly market neutral. Monthly. Isolates the momentum factor from the direction of the market.
Why this is expected to work
A long-only momentum portfolio earns two things at once: the momentum premium, and the equity risk premium. The second dominates — in a year when the Nifty falls 20%, a long-only momentum book falls with it regardless of how well the factor ranked. Going long the winners and short the losers cancels the shared market exposure and leaves the spread, which is how the academic momentum factor is actually defined (Jegadeesh and Titman construct it as a zero-cost winner-minus-loser portfolio). Two things to understand before treating this as lower risk. First, market-neutral is not risk-free: Daniel and Moskowitz showed momentum crashes hardest precisely when a bear market turns, because the short leg of losers rebounds violently — the hedge becomes the loss. Second, in India the short leg is the binding constraint. Retail cash-market shorts must be squared off intraday, and stock-borrow through SLB is thin and expensive outside the largest names. The engine drops shorts it could not place, so a shrinking short book in the results is information, not a bug.
How the pipeline works
NIFTY500 constituent
Keeps rows where nifty500_member == 1
nifty500_member == 1 Liquid: traded > Rs 10 cr/day
Keeps rows where turnover > 100000000
turnover > 100000000 Price 1 month ago
Computes price_1m_ago = @shift(close, 21)
@shift(close, 21) Price 12 months ago
Computes price_12m_ago = @shift(close, 252)
@shift(close, 252) 12-1 momentum
Computes momentum_12_1 = price_1m_ago / price_12m_ago
price_1m_ago / price_12m_ago Top 25 momentum (long)
Selects the top 25 by momentum_12_1
Long arm sizing
Sizes positions: Fixed weights
NIFTY500 constituent
Keeps rows where nifty500_member == 1
nifty500_member == 1 Liquid: traded > Rs 10 cr/day
Keeps rows where turnover > 100000000
turnover > 100000000 Price 1 month ago
Computes price_1m_ago = @shift(close, 21)
@shift(close, 21) Price 12 months ago
Computes price_12m_ago = @shift(close, 252)
@shift(close, 252) 12-1 momentum
Computes momentum_12_1 = price_1m_ago / price_12m_ago
price_1m_ago / price_12m_ago Bottom 25 momentum (short)
Selects the bottom 25 by momentum_12_1
Short arm sizing
Sizes positions: Fixed weights
What this template teaches
- direction='both' — signed weights net into one book
- Allocator blending a positive and a NEGATIVE sleeve
- FixedWeighting with a negative fraction
- Gross-exposure normalisation preserving sign
- The capability gate dropping shorts it cannot place
Market-Neutral Investing: Isolating the Factor From the Market
A long-only momentum portfolio earns two things at once, and the market leg dominates. Going long winners and short losers cancels it — but in India the short leg is the binding constraint.
Related strategy templates
Find the right starting point for your next trading thesis.
Blank Canvas
An empty pipeline on the NSE equity universe with monthly rebalancing and equal weighting. Nothing is screened or ranked — start here when you want to build the whole thesis yourself.
View detailsLow Volatility 30
Holds the 30 calmest large- and mid-caps by realised annualised volatility, sized inversely to that volatility so the quietest names carry the most capital. The construction NSE uses for its Nifty100 Low Volatility 30 index, on the exchange's own published volatility series.
View detailsWatchlist: Select Monthly, Re-Risk Weekly
Two schedules on one canvas. Once a month it picks the eight strongest names from a fixed twelve-stock watchlist; every week it re-sizes what it already holds to equal risk contribution without changing the constituents. Costed against Zerodha's real charge stack, with an in-app alert on every order.
View details