Magic Formula on Indian Stocks: 17.1% CAGR Over 25 Years of NSE Data

We backtested Greenblatt's Magic Formula on NSE stocks from 2000 to 2025. The strategy returned 17.14% annually vs 11.12% for the Sensex. $10,000 became $587K. Both returns in INR, so the 6.0% excess is a clean same-currency comparison.

Growth of $10,000 invested in Magic Formula India (NSE) vs Sensex from 2000 to 2025.

Greenblatt's Magic Formula returned 17.14% annually on Indian stocks (NSE) from 2000 to 2025. That's 6.0% annual alpha over the Sensex's 11.12% CAGR. $10,000 became $587K vs $147K for the benchmark. Both returns are in Indian Rupees, so the excess is a true same-currency comparison. India produced some of the strongest Magic Formula results across all markets we tested.

Contents

  1. The Strategy
  2. Method
  3. The Screen (SQL)
  4. What We Found
  5. 17.14% CAGR over 25 years. 6.0% annual alpha vs the Sensex.
  6. Year-by-Year Returns
  7. Key Observations
  8. 2000-2003: Extended cash period
  9. 2004-2007: The formula finds its footing
  10. 2008: The drawdown
  11. 2009: The snapback
  12. 2014: The Modi rally
  13. 2017: Another strong year
  14. 2018-2019: Two painful years
  15. 2020-2024: Strong recovery
  16. Currency Note
  17. Crisis Performance
  18. When It Works
  19. When It Struggles
  20. Backtest Methodology
  21. Limitations
  22. Takeaway
  23. Part of a Series
  24. Run This Screen Yourself

Data: FMP financial data warehouse, 2000–2025. Updated March 2026.


The Strategy

Joel Greenblatt's Magic Formula ranks every stock by two metrics:

  1. Earnings Yield (EBIT / Enterprise Value) - how cheap is the stock?
  2. Return on Capital Employed (EBIT / Capital Employed) - how efficiently does it use capital?

Each stock gets a rank for Earnings Yield (highest = rank 1) and a rank for ROCE (highest = rank 1). Add the two ranks together. Buy the 30 stocks with the lowest combined rank. These are companies that score well on both cheapness and quality.

Financial Services and Utilities are excluded because ROCE is meaningless for capital-structure-dependent businesses.

For the full methodology and ranking details, see the main US Magic Formula post.


Method

Data source: Ceta Research (FMP financial data warehouse) Universe: India (NSE only), market cap > ₹20B (~$240M USD) Period: 2000-2025 (25.8 years, 103 quarterly periods) Rebalancing: Quarterly (January, April, July, October), equal weight top 30 Transaction costs: Size-tiered (0.1% for >$10B, 0.3% for $2-10B, 0.5% for <$2B, one-way) Benchmark: BSE Sensex (INR) Execution: Next-day close (MOC). Signal generated at rebalance date, trades executed at next trading day's close. Cash rule: Hold cash if fewer than 10 stocks qualify Sector exclusion: Financial Services, Utilities Data lag: Point-in-time financial data (fiscal year end + 45 days)

Note on BSE exclusion: An earlier version of this analysis used BSE + NSE combined, which inflated results due to 38% dual-listing overlap between exchanges. The same stock trading on both BSE and NSE was counted twice, artificially improving diversification metrics. This version uses NSE only, which is the more liquid exchange and eliminates the duplication.

Full methodology: backtests/METHODOLOGY.md


The Screen (SQL)

WITH base AS (
    SELECT
        k.symbol,
        p.companyName,
        p.exchange,
        p.sector,
        k.earningsYieldTTM as earnings_yield,
        k.returnOnCapitalEmployedTTM as roce,
        k.marketCap / 1e9 as market_cap_billions
    FROM key_metrics_ttm k
    JOIN profile p ON k.symbol = p.symbol
    WHERE k.earningsYieldTTM > 0
      AND k.returnOnCapitalEmployedTTM > 0
      AND k.marketCap > 20000000000  -- ₹20B (~$240M USD)
      AND p.sector NOT IN ('Financial Services', 'Utilities')
      AND p.exchange = 'NSE'
),
ranked AS (
    SELECT *,
        RANK() OVER (ORDER BY earnings_yield DESC) AS ey_rank,
        RANK() OVER (ORDER BY roce DESC) AS roce_rank
    FROM base
)
SELECT symbol, companyName, exchange, sector,
       ROUND(earnings_yield * 100, 2) as ey_pct,
       ROUND(roce * 100, 2) as roce_pct,
       ey_rank, roce_rank,
       (ey_rank + roce_rank) as combined_rank,
       ROUND(market_cap_billions, 1) as mcap_bn
FROM ranked
ORDER BY combined_rank ASC
LIMIT 30

Run this query on Ceta Research


What We Found

17.14% CAGR over 25 years. 6.0% annual alpha vs the Sensex.

Growth of $10,000 invested in Magic Formula India (NSE) vs Sensex from 2000 to 2025. Returns in INR.
Growth of $10,000 invested in Magic Formula India (NSE) vs Sensex from 2000 to 2025. Returns in INR.

Metric Magic Formula India (INR) Sensex (INR)
CAGR 17.14% 11.12%
Total Return 5,773% 1,370%
Volatility 28.05% -
Max Drawdown -56.27% -
Sharpe Ratio 0.379 -
Sortino Ratio 0.687 -
Win Rate (quarterly) 61.2% -
Avg Stocks per Period 26.1 -
Cash Periods 17 / 103 -
Beta 0.908 -
Alpha (annualized) 6.44% -

$10,000 turned into $587K. The total return gap is large: 5,773% vs 1,370%. Both in INR, so the comparison is apples-to-apples. Volatility ran at 28.1%. The max drawdown hit -56.3%.

The Sharpe ratio (0.379) is reasonable for a concentrated value portfolio. The Sortino (0.687) is more favorable, meaning the strategy's downside volatility is modest relative to returns. Beta of 0.908 against the Sensex means the portfolio actually carried slightly less market risk. The 6.44% annualized alpha is meaningful. Seventeen cash periods (16%) occurred primarily in the early 2000s when fewer companies cleared the ₹20B (~$240M USD) threshold on the NSE alone.


Year-by-Year Returns

Year Magic Formula India (INR) Sensex (INR) Excess
2000 0.0% (cash) -25.2% +25.2%
2001 0.0% (cash) -18.7% +18.7%
2002 0.0% (cash) +2.9% -2.9%
2003 0.0% (cash) +79.1% -79.1%
2004 +17.3% +10.8% +6.5%
2005 +43.0% +40.6% +2.5%
2006 +38.3% +48.5% -10.2%
2007 +51.4% +46.8% +4.6%
2008 -56.3% -51.3% -4.9%
2009 +144.0% +76.3% +67.6%
2010 +17.2% +17.1% +0.1%
2011 -32.3% -24.5% -7.7%
2012 +32.4% +27.0% +5.3%
2013 +3.8% +6.0% -2.1%
2014 +75.3% +33.5% +41.8%
2015 +25.7% -8.1% +33.8%
2016 +21.5% +3.8% +17.7%
2017 +47.2% +27.1% +20.1%
2018 -26.1% +6.2% -32.2%
2019 -5.4% +16.0% -21.3%
2020 +41.5% +15.7% +25.8%
2021 +39.8% +22.9% +16.9%
2022 +12.1% +3.4% +8.7%
2023 +70.9% +17.5% +53.3%
2024 +32.9% +11.2% +21.7%
2025 +3.4% +1.6% +1.9%

Key Observations

2000-2003: Extended cash period

With the ₹20B threshold on NSE only, fewer than 10 stocks passed the screen for the first four years. The strategy held cash from 2000 through 2003, missing the Sensex's -25.2% drop in 2000 and -18.7% in 2001, but also missing the +79.1% rally in 2003. This reflects genuine market immaturity: the NSE in the early 2000s simply didn't have enough liquid mid-to-large cap companies (ex. Financials/Utilities) to populate the screen.

2004-2007: The formula finds its footing

Once the Indian equity market deepened, the strategy invested starting 2004 with +17.3% vs the Sensex's +10.8%. 2005: +43.0%. 2007: +51.4%. India's economic liberalization created a growing pool of cheap, high-ROCE companies in the ₹20B+ range. 2006 was the exception, lagging the Sensex by 10.2 points.

2008: The drawdown

-56.3%. The Sensex dropped 51.3% the same year. Indian equities took the global financial crisis hard across the board. The ₹20B threshold filtered out micro-caps, keeping the drawdown somewhat contained compared to broader universes.

2009: The snapback

+144.0%. The Magic Formula portfolio, loaded with cheap Indian companies that survived the crisis, caught the full force of the recovery. The Sensex returned +76.3% the same year. The 67.6-point excess return in 2009 is the single best year in the backtest.

2014: The Modi rally

+75.3%. The election of a business-friendly government triggered a re-rating across Indian quality stocks. Foreign institutional investors piled into high-ROCE, reasonably-valued companies. The Magic Formula was fully invested in exactly that universe. The Sensex returned +33.5%.

2017: Another strong year

+47.2%. India's demonetization disruption of late 2016 had cleared, GST implementation was underway, and formalized businesses with strong earnings benefited. The Magic Formula's screen for high earnings yield and high capital efficiency captured the winners. +20 points over the Sensex.

2018-2019: Two painful years

-26.1% in 2018, -5.4% in 2019. The NBFC (non-bank financial company) crisis, IL&FS collapse, and a broader credit squeeze hit Indian markets hard. Value stocks got punished. 2018 was particularly painful because the Sensex gained +6.2% while the Magic Formula fell 26.1%. A 32-point gap in the wrong direction.

2020-2024: Strong recovery

+41.5%, +39.8%, +12.1%, +70.9%, +32.9%. India's post-COVID recovery, domestic consumption growth, manufacturing policy (PLI schemes), and expanding market depth played into the strategy's strengths. 2023 was the standout: +70.9% while the Sensex gained 17.5%. The 2023-2024 stretch together added massive compounding.


Currency Note

Both the strategy and the benchmark (Sensex) are denominated in Indian Rupees. The 6.0% excess CAGR is a same-currency comparison. No currency adjustment needed.

For US-based investors: converting to USD would reduce the absolute CAGR by roughly 2.7% annually (the Rupee's average depreciation rate over this period). But the excess return over the Sensex stays the same regardless of currency, since both sides of the comparison move together.


Crisis Performance

Event Magic Formula India (INR) Sensex (INR) Gap
Dot-com (2000-03) 0.0% (cash) -39.2% (2000-01) Cash protection
Financial crisis (2008) -56.3% -51.3% -4.9%
Post-crisis recovery (2009) +144.0% +76.3% +67.6%
NBFC crisis (2018-19) -30.0% +23.1% -53.1%
COVID & recovery (2020-21) +98.0% +42.1% +55.9%

The pattern is consistent. The Magic Formula on Indian stocks can crash harder than the Sensex in downturns. It recovers harder too. The asymmetry works in the strategy's favor over time, but the drawdowns are punishing. You need to hold through a 56% peak-to-trough decline to capture the 17% CAGR.


When It Works

India's secular growth phases. 2004-2007, 2014-2017, 2020-2024. When India's economy is expanding, high-ROCE companies get re-rated. The Magic Formula's quality filter captures exactly these businesses.

Recovery years. 2009 (+144%), 2014 (+75%), 2020 (+42%). After sell-offs, the cheapest high-quality stocks snap back first. The Magic Formula is always holding them.

Value cycles. When cheap stocks outperform expensive ones, the earnings yield ranking pushes the portfolio toward the biggest winners. India's less efficient market means value signals stay mispriced longer.

When It Struggles

Global risk-off events. 2008, 2011, 2018. When foreign capital exits India, everything sells off. Concentrated value portfolios take disproportionate hits because liquidity dries up first.

Growth-dominated periods. 2018 was the worst single year relative to the Sensex (-32.2% excess). When markets reward growth stocks regardless of current profitability, the Magic Formula's value tilt becomes a liability.


Backtest Methodology

Parameter Choice
Universe NSE, Market Cap > ₹20B (~$240M USD)
Signal Rank(Earnings Yield DESC) + Rank(ROCE DESC), top 30
Portfolio Top 30, equal weight
Rebalancing Quarterly (Jan, Apr, Jul, Oct)
Cash rule Hold cash if < 10 qualify
Benchmark BSE Sensex (INR)
Execution Next-day close (MOC)
Period 2000-2025 (25.8 years, 103 periods)
Transaction costs Size-tiered (0.1-0.5% one-way)
Data Point-in-time FY data with 45-day lag
Sector exclusion Financial Services, Utilities

Limitations

Deep drawdowns. -56.3% max drawdown, -56.3% in a single year (2008). The concentrated value portfolio amplifies market swings.

Cash periods in early years. With NSE only, fewer Indian companies cleared the ₹20B threshold in 2000-2003. Seventeen quarters were held as cash, a significant drag. The strategy missed the 2003 Sensex rally (+79.1%) entirely. This also means the effective invested period is shorter than 25 years.

Volatility. 28.1% annualized. The Sharpe ratio (0.379) is reasonable but not exceptional once you account for the extended cash periods.

Survivorship bias. Exchange membership uses current company profiles, not historical. Delisted Indian companies aren't captured retrospectively.

Liquidity concerns. Some Indian stocks that pass the screen may have thin trading volumes. The backtest assumes execution at closing prices. Real-world slippage on mid-cap Indian stocks can be material, especially during quarterly rebalancing when 30 positions turn over.

ROCE vs ROIC. Greenblatt's original formula uses Return on Invested Capital. We use ROCE (Return on Capital Employed), the closest available metric in FMP data. The two are similar but not identical.

No Indian taxes modeled. India's Securities Transaction Tax (STT), short-term capital gains tax (15%), and long-term capital gains tax (10% above INR 1 lakh) aren't included. These reduce realized returns.


Takeaway

The Magic Formula on Indian stocks (NSE) produced strong results. 17.14% CAGR over 25 years, with 6.0% excess CAGR over the Sensex. Both measured in INR, so the alpha is a clean same-currency comparison.

An earlier version of this analysis used BSE + NSE combined, reporting 24.25% CAGR. That figure was inflated by 38% dual-listing overlap between exchanges. With NSE only, the numbers are more honest and investable.

The ₹20B (~$240M USD) threshold targets liquid mid-caps, not micro-cap noise. The drawdowns are real: -56.3% peak-to-trough. -26.1% in 2018 while the Sensex gained 6.2%. This isn't a smooth compounder. But for investors who can hold through the crashes, the compounding has been strong.


Part of a Series

This analysis is part of our Magic Formula global exchange comparison: - Magic Formula on US Stocks (NYSE + NASDAQ + AMEX) - 9.26% CAGR, the baseline - Magic Formula on Indonesian Stocks (JKT) - Indonesia results - Magic Formula on Brazilian Stocks (SAO) - Brazil results - Magic Formula: Global Comparison - 16-exchange comparison table


Run This Screen Yourself

Via web UI: Run the Magic Formula screen on Ceta Research. The query is pre-loaded with BSE + NSE filters. Hit "Run" and see what passes today.

Via Python:

# Clone the backtest repo
git clone https://github.com/ceta-research/backtests.git
cd backtests

# Run the screen (requires CR_API_KEY)
export CR_API_KEY="your-api-key"
python3 magic-formula/screen.py --exchange NSE

# Run the backtest
python3 magic-formula/backtest.py --preset india --verbose

Get your API key at cetaresearch.com. The full backtest code (Python + DuckDB) is on GitHub.


Data: Ceta Research (FMP financial data warehouse). Universe: NSE, market cap > ₹20B (~$240M USD). Quarterly rebalance, equal weight, 2000-2025. Next-day close (MOC) execution. Size-tiered transaction costs. Returns in INR. Benchmark: BSE Sensex.