Why usFeaturesTemplatesBlogGlossary

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.

long-shortmarket-neutralhedgedfactor
Universe
NSE Stocks XNSE
Rebalance
Monthly Fixed weights

How the pipeline works

Filter

NIFTY500 constituent

Keeps rows where nifty500_member == 1

nifty500_member == 1
Filter

Liquid: traded > Rs 10 cr/day

Keeps rows where turnover > 100000000

turnover > 100000000
Calculate

Price 1 month ago

Computes price_1m_ago = @shift(close, 21)

@shift(close, 21)
Calculate

Price 12 months ago

Computes price_12m_ago = @shift(close, 252)

@shift(close, 252)
Calculate

12-1 momentum

Computes momentum_12_1 = price_1m_ago / price_12m_ago

price_1m_ago / price_12m_ago
Rank

Top 25 momentum (long)

Selects the top 25 by momentum_12_1

Size

Long arm sizing

Sizes positions: Fixed weights

Filter

NIFTY500 constituent

Keeps rows where nifty500_member == 1

nifty500_member == 1
Filter

Liquid: traded > Rs 10 cr/day

Keeps rows where turnover > 100000000

turnover > 100000000
Calculate

Price 1 month ago

Computes price_1m_ago = @shift(close, 21)

@shift(close, 21)
Calculate

Price 12 months ago

Computes price_12m_ago = @shift(close, 252)

@shift(close, 252)
Calculate

12-1 momentum

Computes momentum_12_1 = price_1m_ago / price_12m_ago

price_1m_ago / price_12m_ago
Rank

Bottom 25 momentum (short)

Selects the bottom 25 by momentum_12_1

Size

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
Read the full write-up

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.