Magic Formula on Indian Stocks: 24% CAGR Over 25 Years of BSE and NSE Data
We backtested Greenblatt's Magic Formula on Indian exchanges from 2000 to 2025. The strategy returned 24.25% annually vs 11.12% for the Sensex. $10,000 became $2.67M. Both returns in INR, so the 13.1% excess is a clean same-currency comparison.
Greenblatt's Magic Formula returned 24.25% annually on Indian stocks (BSE + NSE combined) from 2000 to 2025. That's 13.1% annual alpha over the Sensex's 11.12% CAGR. $10,000 became $2.67M vs $147K for the benchmark. Both returns are in Indian Rupees, so the excess is a true same-currency comparison. India produced the strongest Magic Formula results of any market we tested.
Contents
- The Strategy
- Method
- The Screen (SQL)
- What We Found
- 24.25% CAGR over 25 years. 13.1% annual alpha vs the Sensex.
- Year-by-Year Returns
- Key Observations
- 2000-2001: Protection in early years
- 2002-2007: Six years of massive outperformance
- 2008: The drawdown was brutal
- 2009: The snapback of a lifetime
- 2014: The Modi rally
- 2017: Another big year
- 2018-2019: Two painful years
- 2020-2024: Strong recovery
- Currency Note
- Crisis Performance
- When It Works
- When It Struggles
- Backtest Methodology
- Limitations
- Takeaway
- Part of a Series
- Run This Screen Yourself
The Strategy
Joel Greenblatt's Magic Formula ranks every stock by two metrics:
- Earnings Yield (EBIT / Enterprise Value) - how cheap is the stock?
- 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 (BSE + NSE combined), 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)
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 IN ('BSE', '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
24.25% CAGR over 25 years. 13.1% annual alpha vs the Sensex.

| Metric | Magic Formula India (INR) | Sensex (INR) |
|---|---|---|
| CAGR | 24.25% | 11.12% |
| Total Return | 26,675% | 1,370% |
| Volatility | 33.09% | - |
| Max Drawdown | -61.31% | - |
| Sharpe Ratio | 0.536 | - |
| Sortino Ratio | 1.044 | - |
| Win Rate (quarterly) | 63.1% | - |
| Avg Stocks per Period | 25.6 | - |
| Cash Periods | 7 / 103 | - |
| Beta | 1.167 | - |
| Alpha (annualized) | 12.35% | - |
$10,000 turned into $2.67M. The total return gap is staggering: 26,675% vs 1,370%. Both in INR, so the comparison is apples-to-apples. Volatility ran at 33.1%. The max drawdown hit -61.3%. Severe, but not the -75.5% you'd get capturing ₹1B micro-caps.
The Sharpe ratio (0.536) is solid for a concentrated value portfolio. The Sortino (1.044) is even more favorable, meaning the strategy's downside volatility is low relative to returns. Beta of 1.167 against the Sensex confirms the portfolio runs hotter than the broad market, but the 12.35% annualized alpha more than compensates. Seven cash periods (7%) occurred primarily in the early 2000s when fewer companies cleared the ₹20B (~$240M USD) threshold.
Year-by-Year Returns
| Year | Magic Formula India (INR) | Sensex (INR) | Excess |
|---|---|---|---|
| 2000 | 0.0% (cash) | -25.2% | +25.2% |
| 2001 | +6.5% | -18.7% | +25.2% |
| 2002 | +16.3% | +2.9% | +13.4% |
| 2003 | +131.4% | +79.1% | +52.3% |
| 2004 | +28.8% | +10.8% | +18.0% |
| 2005 | +53.9% | +40.6% | +13.3% |
| 2006 | +17.0% | +48.5% | -31.5% |
| 2007 | +66.5% | +46.8% | +19.7% |
| 2008 | -61.0% | -51.3% | -9.7% |
| 2009 | +155.6% | +76.3% | +79.3% |
| 2010 | +27.1% | +17.1% | +10.0% |
| 2011 | -30.0% | -24.5% | -5.5% |
| 2012 | +27.5% | +27.0% | +0.5% |
| 2013 | -8.7% | +6.0% | -14.7% |
| 2014 | +91.0% | +33.5% | +57.5% |
| 2015 | +29.8% | -8.1% | +37.9% |
| 2016 | +14.6% | +3.8% | +10.8% |
| 2017 | +63.1% | +27.1% | +36.0% |
| 2018 | -27.3% | +6.1% | -33.4% |
| 2019 | -7.6% | +16.0% | -23.6% |
| 2020 | +34.9% | +15.7% | +19.2% |
| 2021 | +60.5% | +22.8% | +37.7% |
| 2022 | +27.9% | +3.4% | +24.5% |
| 2023 | +63.6% | +17.5% | +46.1% |
| 2024 | +63.2% | +11.2% | +52.0% |
| 2025 | +1.7% | +1.6% | +0.1% |
Key Observations
2000-2001: Protection in early years
With the ₹20B threshold, only the most established Indian companies qualified. In 2000, fewer than 10 stocks passed the screen, triggering the cash rule. Zero loss while the Sensex fell 25.2%. In 2001, a small qualifying pool returned +6.5% while the Sensex dropped another 18.7%. The early years show the screening effect clearly: larger, more liquid companies weathered the initial period better.
2002-2007: Six years of massive outperformance
After the early cautious period, the strategy found its footing in 2002 with +16.3% vs the Sensex's +2.9%. Then came the bull run. 2003: +131.4% vs the Sensex's +79.1%. 2005: +53.9%. 2007: +66.5%. India's economic liberalization created a large pool of cheap, high-ROCE companies in the ₹20B+ range. The Magic Formula captured exactly those. 2006 was the one exception, lagging the Sensex by 31.5 points.
2008: The drawdown was brutal
-61.0%. The Sensex dropped 51.3% the same year. Indian equities took the global financial crisis hard across the board. But filtering out micro-caps meant the drawdown was -61.0% instead of the -66% you'd see with a ₹1B threshold. When panic selling hits, small illiquid companies get crushed first. Mid-cap and larger names held up marginally better.
2009: The snapback of a lifetime
+155.6%. 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 79-point excess return in 2009 is extraordinary.
2014: The Modi rally
+91.0%. 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 big year
+63.1%. 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. +36 points over the Sensex.
2018-2019: Two painful years
-27.3% in 2018, -7.6% 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.1% while the Magic Formula fell 27.3%. A 33-point gap in the wrong direction.
2020-2024: Strong recovery
+34.9%, +60.5%, +27.9%, +63.6%, +63.2%. India's post-COVID recovery, domestic consumption growth, manufacturing policy (PLI schemes), and expanding market depth played into the strategy's strengths. 2022 was especially notable: +27.9% while the Sensex gained just 3.4%. The 2023-2024 stretch produced +63% in back-to-back years.
Currency Note
Both the strategy and the benchmark (Sensex) are denominated in Indian Rupees. The 13.1% 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-01) | +6.5% | -39.2% | +45.7% |
| Recovery (2002-07) | +939% | +526% | +413% |
| Financial crisis (2008) | -61.0% | -51.3% | -9.7% |
| Post-crisis recovery (2009) | +155.6% | +76.3% | +79.3% |
| NBFC crisis (2018-19) | -32.8% | +23.1% | -55.9% |
| COVID & recovery (2020-21) | +116.5% | +42.1% | +74.4% |
The pattern is consistent. The Magic Formula on Indian stocks crashes harder than the Sensex in most 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 61% peak-to-trough decline to capture the 24% CAGR.
When It Works
India's secular growth phases. 2002-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 (+156%), 2014 (+91%), 2020 (+35%). 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 (-33.4% excess). When markets reward growth stocks regardless of current profitability, the Magic Formula's value tilt becomes a liability.
Backtest Methodology
| Parameter | Choice |
|---|---|
| Universe | BSE + 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
Extreme drawdowns. -61.3% max drawdown. -61.0% in a single year (2008). This is far worse than the US version's -55.3%. Indian equities are more volatile during global sell-offs. The concentrated value portfolio amplifies this.
Higher volatility than the benchmark. 33.1% annualized. The Sharpe ratio (0.536) looks good because the excess return is so large, but the ride is rough.
Survivorship bias. Exchange membership uses current company profiles, not historical. Delisted Indian companies aren't captured retrospectively. India's exchanges had different compositions in the early 2000s.
Cash periods in early years. Fewer Indian companies cleared the ₹20B threshold in 2000-2003. Seven quarters were held as cash, reducing early exposure. This was a drag in strong market periods but provided protection in the 2000-2001 downturn.
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 produced the highest returns of any market we tested. 24.25% CAGR over 25 years, with 13.1% excess CAGR over the Sensex. Both measured in INR, so the alpha is a clean same-currency comparison.
The ₹20B (~$240M USD) threshold targets liquid mid-caps, not micro-cap noise. That's the right universe for a strategy you could actually trade. The result: better Sharpe (0.54 vs 0.39 with a ₹1B filter), better Sortino (1.04 vs 0.71), and a less severe max drawdown (-61% vs -75%).
The drawdowns are still severe. -61.3% peak-to-trough. -61.0% in 2008. -27.3% in 2018. This isn't a smooth compounder. But for investors who can hold through the crashes, the compounding has been extraordinary.
Part of a Series
This analysis is part of our Magic Formula global exchange comparison: - Magic Formula on US Stocks (NYSE + NASDAQ + AMEX) - 9.53% CAGR, the baseline - Magic Formula on Indonesian Stocks (JKT) - Indonesia results - Magic Formula on Brazilian Stocks (SAO) - Brazil results - Magic Formula: Global Comparison - 18-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 BSE,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: BSE + 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.