Why usFeaturesTemplatesBlogGlossary

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.

percentilemomentumdividendrelative-cap
Universe
NSE Stocks XNSE
Rebalance
Monthly Rank proportional

How the pipeline works

Filter

NIFTY500 constituent

Keeps rows where nifty500_member == 1

nifty500_member == 1
Filter

Liquid: traded > Rs 5 cr/day

Keeps rows where turnover > 50000000

turnover > 50000000
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
Score

Momentum + liquidity composite

Blends 2 factors into momentum_composite

Rank

Top 10% by composite

Selects the top 10 by momentum_composite

Event

Days since ex-dividend

Requires a dividend_amount event within 90 days

Size

Rank-proportional sizing

Sizes positions: Rank proportional

Constrain

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

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.