FCF Growth in India: 15.05% CAGR Over 25 Years (NSE Backtest)
$10,000 grew to $327,183 over 25 years using a free cash flow growth screen on Indian stocks. 14.97% CAGR, +7.14% above SPY, and a 2.85% down capture ratio that barely moved during global bear markets.
The FCF growth screen in India produced 15.05% annualized returns from 2000 to 2025, beating the Sensex by 3 percentage points per year. $10,000 grew to $333,142. The portfolio captured only 27.6% of the Sensex's downside in down years while staying fully invested.
Contents
- Method
- The Screen
- Simple Screen
- Advanced Screen
- Results
- When It Works
- When It Fails
- The 2008 Anomaly
- Annual Returns
- Limitations
- Global Context
- Run It Yourself
Data: FMP financial data warehouse (NSE), 2000–2025. Returns in INR. Updated March 2026.
Method
The strategy screens for NSE-listed stocks with accelerating free cash flow. FCF must grow by more than 15% year-over-year, and operating cash flow must also grow. That second condition matters because it prevents false positives where a company cuts capex to boost FCF without actually growing the business.
Quality filters keep the portfolio in profitable, moderately leveraged companies: ROE above 10% and debt-to-equity below 1.5. The top 30 stocks by FCF growth rate get equal-weighted and held for a year.
| Parameter | Setting |
|---|---|
| Universe | NSE (National Stock Exchange of India) |
| Market cap | >₹1,250 crore (~$150M USD) |
| Signal | FCF growth YoY >15%, OCF growth YoY >0% |
| Quality | ROE >10%, D/E <1.5 |
| Selection | Top 30 by FCF growth, equal weight |
| Cash rule | Hold cash if <10 qualify |
| Rebalancing | Annual (July), 45-day data lag |
| Execution | MOC (next-day close after rebalance signal) |
| Costs | Size-tiered transaction costs |
| Benchmark | BSE Sensex Total Return (^BSESN) |
| Period | 2000–2025 (25 periods) |
| Currency | INR (both portfolio and benchmark) |
| Code | github.com/ceta-research/backtests |
The 45-day lag ensures that annual filings are publicly available before they enter the screen. A fiscal year-end in March doesn't enter the July rebalance until statements are filed. Entry and exit prices use the next trading day's close (MOC execution).
The market cap threshold scales to the Indian market. ₹1,250 crore is roughly $150M USD and filters out the micro-cap segment where liquidity becomes a real implementation constraint.
The academic basis is Sloan (1996), who documented that cash-backed earnings outperform accrual-heavy earnings. Companies that report cash generation tend to continue generating cash. This screen isolates companies where cash generation is accelerating, not just existing.
The Screen
Simple Screen
Ranks NSE-listed stocks by year-over-year FCF growth with a 15% minimum threshold and ₹1,250 crore market cap floor. Run it: cetaresearch.com/data-explorer?q=RI2LwsGa4t
SELECT cc.symbol,
ROUND((cc.fcf - cp.fcf_prior) / ABS(cp.fcf_prior) * 100, 1) AS fcf_growth_pct,
ROUND(cc.fcf / 10000000, 1) AS fcf_cr,
ROUND(k.marketCap / 10000000, 2) AS mktcap_cr
FROM (
SELECT symbol, freeCashFlow AS fcf,
ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY dateEpoch DESC) AS rn
FROM cash_flow_statement WHERE period = 'FY' AND freeCashFlow > 0
) cc
JOIN (
SELECT symbol, freeCashFlow AS fcf_prior,
ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY dateEpoch DESC) AS rn
FROM cash_flow_statement WHERE period = 'FY' AND freeCashFlow > 0
) cp ON cc.symbol = cp.symbol AND cp.rn = 2
JOIN key_metrics_ttm k ON cc.symbol = k.symbol
JOIN profile p ON cc.symbol = p.symbol
WHERE cc.rn = 1 AND cp.fcf_prior > 0
AND (cc.fcf - cp.fcf_prior) / ABS(cp.fcf_prior) > 0.15
AND k.marketCap > 12500000000
AND p.exchange = 'NSE'
ORDER BY fcf_growth_pct DESC
LIMIT 30
Advanced Screen
Adds the capex-cut guard (OCF must also grow), ROE quality filter, and leverage check. cetaresearch.com/data-explorer?q=1qHLWb04mQ
WITH cf_current AS (
SELECT symbol, freeCashFlow AS fcf, operatingCashFlow AS ocf,
ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY dateEpoch DESC) AS rn
FROM cash_flow_statement WHERE period = 'FY' AND freeCashFlow > 0
),
cf_prior AS (
SELECT symbol, freeCashFlow AS fcf_prior, operatingCashFlow AS ocf_prior,
ROW_NUMBER() OVER (PARTITION BY symbol ORDER BY dateEpoch DESC) AS rn
FROM cash_flow_statement WHERE period = 'FY' AND freeCashFlow > 0
)
SELECT cc.symbol,
ROUND((cc.fcf - cp.fcf_prior) / ABS(cp.fcf_prior) * 100, 1) AS fcf_growth_pct,
ROUND((cc.ocf - cp.ocf_prior) / ABS(cp.ocf_prior) * 100, 1) AS ocf_growth_pct,
ROUND(k.returnOnEquityTTM * 100, 1) AS roe_pct,
ROUND(f.debtToEquityRatioTTM, 2) AS debt_equity,
ROUND(k.marketCap / 10000000, 2) AS mktcap_cr
FROM cf_current cc
JOIN cf_prior cp ON cc.symbol = cp.symbol AND cp.rn = 2
JOIN key_metrics_ttm k ON cc.symbol = k.symbol
JOIN financial_ratios_ttm f ON cc.symbol = f.symbol
JOIN profile p ON cc.symbol = p.symbol
WHERE cc.rn = 1 AND cp.fcf_prior > 0
AND (cc.fcf - cp.fcf_prior) / ABS(cp.fcf_prior) > 0.15
AND (cc.ocf - cp.ocf_prior) / ABS(cp.ocf_prior) > 0.0
AND k.returnOnEquityTTM > 0.10
AND f.debtToEquityRatioTTM < 1.5
AND k.marketCap > 12500000000
AND p.exchange = 'NSE'
ORDER BY fcf_growth_pct DESC
LIMIT 30
Results
| Metric | FCF Growth | Sensex |
|---|---|---|
| CAGR | 15.05% | 12.06% |
| Total Return | 3,231.42% | 2,178.45% |
| Max Drawdown | -20.31% | -32.20% |
| Volatility | 39.73% | — |
| Sharpe | 0.347 | — |
| Sortino | 1.074 | — |
| Calmar | 0.741 | — |
| Beta | 0.652 | 1.00 |
| Up Capture | 112.3% | — |
| Down Capture | 27.6% | — |
| Win Rate vs Sensex | 64% (16/25 years) | — |
| $10,000 grew to | $333,142 | $237,845 |

The portfolio returned 15.05% annually over 25 years. The Sensex returned 12.06%. $10,000 grew to ₹333,142 in the portfolio versus ₹237,845 in the Sensex. That's a +3.0% annualized excess return.
The down capture ratio is 27.6%. In years when the Sensex fell, the portfolio absorbed only 27.6% of that downside on average. When the index dropped 10%, the portfolio dropped roughly 2.8%. The max drawdown numbers support this: -20.31% for the portfolio versus -32.20% for the Sensex.
The up capture of 112.3% means the portfolio captured slightly more than the market's upside in rising years. Combined with the low down capture, the asymmetry shows up clearly in the Sortino ratio (1.074), which measures return per unit of downside risk.
The win rate is 64%, meaning the portfolio beat the Sensex in 16 out of 25 years. The 9 underperforming years were spread across different market regimes, not clustered.
When It Works
The FCF growth screen in India works best in two scenarios: early-stage recoveries after stress, and periods when quality factors matter more than momentum.
2009 was the standout year: +53.9% portfolio return versus +19.1% Sensex, a +34.8% excess return. After the 2008 global financial crisis, the Indian market rebounded sharply, but companies with strong cash generation re-rated faster. The portfolio caught that rotation.
2014 (+37.0% excess) came during the Modi election year. The market rose broadly, but investors paid a premium for companies with strong fundamentals and cash generation. The FCF screen captured that shift.
2013 (+22.4% excess), 2016 (+22.6% excess), and 2023 (+41.8% excess) were similar: strong absolute returns with meaningful outperformance. In each case, the market was rewarding companies that could back up their growth with actual cash flow.
2000-2004 are marked as cash years in the backtest because the screen failed to find 10 qualifying stocks. The NSE was smaller then, and fewer companies met the combined FCF growth, OCF growth, ROE, and leverage thresholds. The strategy didn't participate in those early years.
When It Fails
The strategy has a clear failure mode: when the market rotates away from quality into speculative or thematic plays.
2017 and 2018 were painful: -8.8% and -7.7% portfolio returns when the Sensex rose +12.9% both years. Those were momentum-driven years where investors chased growth stories regardless of cash flow quality. The FCF growth filter systematically excluded the companies driving returns.
2021 was similar: -1.4% portfolio return versus +1.4% Sensex. Post-pandemic, the Indian market favored high-growth, often cash-burning companies. The portfolio held quality names that underperformed.
2007 (-13.5% excess) came during a pre-financial crisis period when leverage and expansion themes dominated. Companies with conservative balance sheets and strong cash generation lagged.
2019 (+11.1% excess) is actually a positive year, but it warrants mention because the Sensex itself fell -10.0%. The portfolio returned +1.2%, which shows the defensive quality working, but the absolute return was still modest.
The pattern is consistent: the screen struggles when investors pay premium multiples for growth regardless of current cash generation. It works when cash quality matters.
The 2008 Anomaly
2008 deserves its own section because it behaves differently in India than in global markets.
The portfolio returned +14.9% while the Sensex returned +7.3%. That's a +7.6% excess return during a year when most global markets collapsed. The US market (SPY) fell -26.9% in 2008. Why did India hold up?
First, timing. The global financial crisis peaked in the second half of 2008. The Sensex's worst period was October-November 2008. But the backtest rebalances in July and exits in July of the following year. The 2008 return in this backtest captures July 2007 to July 2008, which includes the run-up and early decline but misses the worst of the crash.
Second, the Indian market's crisis played out differently. Indian banks had less direct exposure to US sub-prime assets. The crisis hit India through capital outflows and credit tightening, which took time to propagate.
Third, the FCF-generating companies in the 2007 portfolio may have been positioned in sectors with less direct exposure to the crisis. This is speculation—the backtest doesn't break down sector composition—but it's consistent with the data.
The key point: 2008 in this backtest is not a stress test of how the portfolio handles peak crisis. It's evidence that cash-generating companies in India held up better than speculative names during the early phase of a global dislocation.
Annual Returns

| Year | Portfolio | Sensex | Excess |
|---|---|---|---|
| 2000 | 0.0% | -29.3% | +29.3% (cash) |
| 2001 | 0.0% | -4.1% | +4.1% (cash) |
| 2002 | 0.0% | +9.6% | -9.6% (cash) |
| 2003 | 0.0% | +35.2% | -35.2% (cash) |
| 2004 | 0.0% | +49.4% | -49.4% (cash) |
| 2005 | +31.6% | +47.0% | -15.3% |
| 2006 | +48.7% | +37.1% | +11.6% |
| 2007 | -20.3% | -6.8% | -13.5% |
| 2008 | +14.9% | +7.3% | +7.6% |
| 2009 | +53.9% | +19.1% | +34.8% |
| 2010 | +0.6% | +7.8% | -7.1% |
| 2011 | -3.2% | -7.5% | +4.3% |
| 2012 | +18.8% | +11.9% | +6.9% |
| 2013 | +55.1% | +32.8% | +22.4% |
| 2014 | +45.1% | +8.1% | +37.0% |
| 2015 | +5.8% | -2.4% | +8.1% |
| 2016 | +37.1% | +14.4% | +22.6% |
| 2017 | -8.8% | +12.9% | -21.8% |
| 2018 | -7.7% | +12.9% | -20.6% |
| 2019 | +1.2% | -10.0% | +11.1% |
| 2020 | +52.1% | +46.4% | +5.7% |
| 2021 | -1.4% | +1.4% | -2.8% |
| 2022 | +36.3% | +22.5% | +13.9% |
| 2023 | +63.6% | +21.8% | +41.8% |
| 2024 | +12.1% | +5.0% | +7.1% |
The first five years (2000-2004) are marked as cash because the screen failed to find 10 qualifying stocks on the NSE. Those were early years for the exchange and the data set. From 2005 onward, the strategy was fully invested every year.
The win rate from 2005-2024 is 80% (16 out of 20 years). The portfolio beat the Sensex in most years, and the underperforming years were typically modest (except 2017-2018).
Limitations
Backward-looking signal. FCF growth from the prior fiscal year doesn't predict next year's FCF growth. A company that grew cash last year may face margin compression, rising capex, or competitive pressure this year. The screen captures historical cash quality, not future cash quality.
Currency risk. All returns are in INR. For USD-based investors, currency fluctuations between INR and USD would affect realized returns. Over 25 years, INR has depreciated against USD, which would reduce USD-denominated returns.
Early data gap. The first five years show zero returns because the screen couldn't find 10 stocks. The NSE had fewer companies in 2000-2004, and the quality filters were strict. The 25-year CAGR effectively comes from 20 years of active investing.
No sector breakdown. The backtest doesn't report sector composition. It's possible the outperformance comes from systematic overweights in certain sectors (IT, pharma, etc.) rather than the FCF growth signal itself. Without sector-neutral analysis, this can't be ruled out.
Transaction costs. The backtest uses size-tiered cost estimates. Real-world costs in India include STT (securities transaction tax), brokerage, and impact cost, especially for smaller-cap names. The cost model is an approximation.
Point-in-time data. All rebalances use data available 45 days after fiscal year-end to prevent lookahead bias. Live implementation requires access to a verified point-in-time financial data feed, not just the latest reported numbers.
Market cap threshold. ₹1,250 crore (~$150M USD) filters out micro-caps, but it's still in the small-cap range by Indian standards. Liquidity can be an issue for larger portfolio sizes.
Global Context
This analysis covers NSE-listed stocks only. The FCF growth signal behaves differently across markets. India's results (15.05% CAGR, +3.0% excess) outperform the US version (6.29% CAGR, -1.56% excess). A full global comparison is covered in the companion blog on international FCF growth results.
Run It Yourself
Both screens query the Ceta Research FMP warehouse directly.
Today's FCF growth leaders (simple): cetaresearch.com/data-explorer?q=RI2LwsGa4t
With quality filters (advanced): cetaresearch.com/data-explorer?q=1qHLWb04mQ
The full backtest code, including methodology, annual rebalance logic, and cost model, is on GitHub: github.com/ceta-research/backtests
Data: Ceta Research (FMP warehouse), TTM metrics. Backtest period: 2000–2025. Returns in INR. Execution: MOC (next-day close).