Nifty 50 Value-Momentum-Size Long-Short Strategy
Overview
Multi-factor investing asks whether observable stock characteristics — cheapness, past performance, and scale — help explain and predict returns beyond a single market beta. This project runs that workflow on Indian large caps: the Nifty 50 universe on the NSE, with prices and fundamentals from Yahoo Finance (*.NS tickers).
The pipeline mirrors a standard quant workflow (factor construction → Fama–MacBeth → IC/IR → long–short backtest), applied to up to fifty Nifty constituents that pass a minimum history filter.
With a broader cross-section, factor ICs and information ratios become more meaningful than in a four-stock demo, and the long–short book holds the top and bottom 20% of names each month (10 long / 10 short when 50 stocks qualify) rather than a fixed pair on each side.
Universe and data
Constituents are listed in nifty50_universe.json (NSE symbols with .NS suffix for yfinance). Daily adjusted closes are downloaded from 2015 onward, resampled to month-end prices, and filtered to names with at least five years of monthly history so 12–1 momentum is well defined.
Value uses trailing earnings yield from Yahoo fundamentals. Size uses each month when share count is available, otherwise log market cap. Momentum is 12–1: . Fundamentals are cached for 24 hours to limit API load.
Methodology
Fama–MacBeth regressions — Each month, a cross-sectional OLS regresses next-month stock returns on Value, Momentum, and Size exposures. The sequence of monthly coefficients estimates factor premia over time; t-statistics accompany each estimate.
Information Coefficient (IC) — For each factor and month, IC is the correlation between the factor score and the subsequent month’s return. Information Ratio (IR) is mean IC divided by the standard deviation of IC, summarising consistency of predictive power.
Long–short portfolio — Predicted return combines lagged Fama–MacBeth betas (prior month, no same-month look-ahead) with current factor scores. Each month the strategy goes long the top 20% and short the bottom 20%, equal-weight within each leg, dollar-neutral (50% long / 50% short notional).
Frictions — Brokerage and slippage applied to estimated one-way turnover; STT on sell legs; monthly short-stock borrow fee; excess returns vs a constant risk-free proxy; cross-sectional winsorisation and ±35% monthly return caps on single names.
Performance — Gross and net (after frictions) cumulative return, Sharpe, drawdown, hit rate, average turnover, and cumulative cost drag.
How to interpret the results
With roughly fifty Nifty names, cross-sectional regressions and IC series are far more stable than in a four-stock US demo. IR magnitudes and signs should be read as descriptive, not as guaranteed live alpha.
The long–short cumulative curve reflects Indian large-cap factor premia and regime shifts (e.g. COVID, rate cycles). Compare summary metrics and drawdowns across refresh dates when yfinance data updates.
Use the Fama–MacBeth and IC time-series panels to see when factor premia or predictive correlations shift. The latest cross-section table shows current factor scores used for ranking.
What you will see in the results
Summary metrics — Cumulative return, annualised Sharpe, and maximum drawdown for the long–short strategy.
Performance charts — Cumulative return and drawdown paths, plus monthly long–short returns.
Factor diagnostics — Information ratios and monthly IC series for Momentum, Size, and Value.
Fama–MacBeth premia — Time series of monthly cross-sectional coefficients and t-statistics.
Friction breakdown — Monthly trading and borrow cost drag stacked by rebalance.
Cross-section snapshot — Latest factor exposures by ticker.
Empirical results
Fama–MacBeth premia, information coefficients, and long–short performance from the latest pipeline run.
| Universe | Nifty 50 · 48 stocks · NSE | ||||||||||||||||||||||||||||||||||||||||||||||||
| Study period | 2015-01-31 → 2026-05-31 | ||||||||||||||||||||||||||||||||||||||||||||||||
| Portfolio rule | Long 10 / Short 10 · β lag 1m | ||||||||||||||||||||||||||||||||||||||||||||||||
| Data source | yfinance (NSE .NS) | ||||||||||||||||||||||||||||||||||||||||||||||||
| Data as of | 2026-05-31 | ||||||||||||||||||||||||||||||||||||||||||||||||
| Constituents |
|
Friction assumptions
Costs are applied each rebalance from estimated one-way turnover (weight changes). Net returns subtract trading costs and a flat monthly short-borrow fee on half the book. These are stylised India cash-market magnitudes — not a broker quote.
| Commission (one-way) | 12 bps + GST |
| Slippage (one-way) | 8 bps |
| STT on sells | 10 bps |
| Short borrow (annual) | 8.00% |
| Risk-free (annual proxy) | 6.50% |
| Avg monthly turnover | 74.10% |
Long–short performance (gross vs net)
Excess-return long–short on Nifty names: top/bottom 10 each side, Fama–MacBeth betas lagged one month, fundamentals lagged one month. Gross is before costs; net deducts turnover-based trading costs and short borrow.
| Metric | Gross | Net |
|---|---|---|
| Cumulative | -13.40% | -65.10% |
| Sharpe | -0.14 | -1.25 |
| Max DD | -20.40% | -64.10% |
| Hit rate | 48.00% | 30.90% |
| Ann. vol | 8.00% | 7.90% |
Cumulative friction drag (trading + borrow): 90.50%
Cumulative return — gross vs net
Purple: net of frictions. Grey: gross paper portfolio. The gap illustrates how turnover and borrow erode a factor strategy in live trading.
Drawdown (net)
Peak-to-trough decline on the friction-adjusted cumulative curve.
Monthly turnover
One-way turnover from weight changes each rebalance. Higher turnover increases commission, slippage, and STT drag.
Monthly net returns
Friction-adjusted long–short return after ranking on lagged factor premia.
Factor information ratios
IC mean / IC std on excess returns with winsorised cross-sections.
| Factor | IR |
|---|---|
| Momentum | 0.072 |
| Size | -0.420 |
| Value | -0.089 |
Monthly information coefficients
Cross-sectional correlation of factor score with next-month excess return.
Fama–MacBeth factor premia (lagged for trading)
Monthly cross-sectional coefficients on excess returns. Portfolio formation uses the prior month’s coefficients to avoid same-month look-ahead.
Fama–MacBeth t-statistics
Cross-sectional significance of factor premia each month (same regressions as the coefficient panel).
Friction drag by month
Trading costs from turnover and flat short-borrow fee applied each rebalance.
Latest cross-sectional factor scores
Most recent month-end scores (value lagged one month). Used with prior-month betas for ranking.
| Ticker | Value (z) | Momentum (z) | Size (z) |
|---|---|---|---|
| ADANIENT | -0.5780 | -1.2880 | -0.2270 |
| ADANIPORTS | -0.3570 | 0.4690 | 0.1770 |
| APOLLOHOSP | -0.9150 | 0.3690 | -1.3350 |
| ASIANPAINT | -0.9470 | -0.5320 | -0.3690 |
| AXISBANK | 0.7440 | -0.1000 | 0.4340 |
| BAJAJ-AUTO | -0.2090 | 0.6730 | -0.1270 |
| BAJAJFINSV | -0.3080 | -0.8930 | -0.0380 |
| BAJFINANCE | -0.3530 | -0.3570 | 0.9010 |
| BEL | -0.7910 | 1.5670 | 0.1300 |
| BHARTIARTL | -0.6530 | -0.1920 | 2.0310 |
| BPCL | 3.8780 | -0.1840 | -1.1630 |
| BRITANNIA | -0.7890 | 0.0610 | -1.0410 |
| CIPLA | -0.3010 | -1.1040 | -1.4450 |
| COALINDIA | 2.3140 | 1.3870 | 0.0520 |
| DRREDDY | -0.1680 | 0.3720 | -1.3650 |
| EICHERMOT | -0.5350 | 1.0970 | -0.5700 |
| GRASIM | -0.6730 | -0.3370 | -0.6300 |
| HCLTECH | 0.3400 | -0.6770 | 0.4140 |
| HDFCBANK | 0.4870 | -1.2570 | 2.0840 |
| HDFCLIFE | -0.9740 | -1.1140 | -1.0770 |
| HEROMOTOCO | 0.5090 | 1.9300 | -1.4100 |
| HINDALCO | 0.4140 | 1.9300 | -0.4390 |
| HINDUNILVR | -0.7590 | -0.5790 | 0.8560 |
| INDUSINDBK | -1.0430 | -0.5580 | -1.8470 |
| INFY | 0.8000 | -0.7730 | 0.9240 |
| ITC | 0.3970 | -1.6300 | 0.4310 |
| JSWSTEEL | 0.9630 | 0.5170 | 0.0330 |
| KOTAKBANK | 0.2290 | -1.0880 | 0.3950 |
| LT | -0.4700 | 0.3280 | 0.8390 |
| M&M | 0.1990 | 0.0990 | 0.4080 |
| MARUTI | -0.2470 | 0.0870 | 0.5340 |
| NESTLEIND | -1.0230 | -0.0310 | -0.2420 |
| NTPC | 0.1240 | 0.4070 | 0.4270 |
| ONGC | 2.1770 | 1.2570 | 0.4220 |
| POWERGRID | 0.8700 | -0.0240 | 0.0410 |
| RELIANCE | 0.0340 | -0.2120 | 2.4530 |
| SBILIFE | -1.0200 | 0.0490 | -0.5900 |
| SBIN | 1.7590 | 1.4730 | 1.7390 |
| SHRIRAMFIN | 0.4340 | 1.9300 | -0.3860 |
| SUNPHARMA | -0.5740 | -0.1680 | 0.6590 |
| TATACONSUM | -1.0140 | -0.6710 | -1.4350 |
| TATASTEEL | -0.2670 | 1.9300 | -0.1630 |
| TCS | 0.5570 | -1.6080 | 1.6620 |
| TECHM | -0.1700 | -0.2830 | -1.1330 |
| TITAN | -0.9940 | 0.9550 | 0.3910 |
| TRENT | -1.0610 | -1.8190 | -1.1990 |
| ULTRACEMCO | -0.6530 | -0.3850 | 0.2410 |
| WIPRO | 0.6160 | -1.0240 | -0.4470 |