Top-Decile Momentum with Dividend Context
Selects the top decile by a rank-normalised momentum-and-liquidity composite rather than a fixed count, so the portfolio grows and shrinks with the investable universe. Annotates each holding with how recently it went ex-dividend, and caps any name at the lower of 6% or 4× its market-cap weight.
Why this is expected to work
Selecting a fixed number of names embeds a hidden assumption that the universe is constant. It is not — the count of liquid, non-flagged Nifty 500 constituents varies materially with market conditions, and a fixed top-30 is a much more concentrated bet when only 200 names qualify than when 450 do. Percentile selection holds the proportion constant instead, which keeps the strategy's concentration stable across regimes. Rank normalisation is used rather than z-scoring because momentum returns have fat tails: one stock up 900% produces a z-score that dominates the entire composite, whereas its rank is simply first. The relative cap is the NSE factor-index rule — no name may exceed the lower of a fixed percentage or a multiple of its own market-cap weight — which stops a small company with a spectacular signal from taking a position the market could not absorb. The dividend annotation deliberately does not filter anything: it attaches context so you can see whether a drawdown was a real decline or a stock going ex-dividend.
How the pipeline works
NIFTY500 constituent
Keeps rows where nifty500_member == 1
nifty500_member == 1 Liquid: traded > Rs 5 cr/day
Keeps rows where turnover > 50000000
turnover > 50000000 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 Momentum + liquidity composite
Blends 2 factors into momentum_composite
Top 10% by composite
Selects the top 10 by momentum_composite
Days since ex-dividend
Requires a dividend_amount event within 90 days
Rank-proportional sizing
Sizes positions: Rank proportional
Lower of 6% or 4x cap weight
Caps any single position at 6%
What this template teaches
- ranking_type='percentile' — proportional, not fixed-count
- FactorScoreRule method='rank' and 'minmax'
- EventTriggerRule with require_event=False (annotate, do not filter)
- ConstraintsRule max_relative_weight — the NSE 5%-or-5× rule
Top 30 or Top Decile? Why Fixed Counts Hide a Changing Bet
Holding a fixed number of names assumes the universe is constant. It is not — and a top-30 screen is a much more concentrated bet when only 200 stocks qualify than when 450 do.
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