Price-to-Sales Below 1 in India: 11.44% CAGR on NSE, Barely Beats the Sensex
A quality-filtered P/S value screen on NSE returned 11.44% CAGR from 2000 to 2025, against a Sensex that returned 11.12%. The strategy beats the local index by just 0.32%. India's market itself rose strongly. The screen adds little beyond owning the index.
We ran a P/S value screen on NSE from 2000 to 2025. The strategy requires P/S below 1.0, gross margin above 20%, operating margin above 5%, and ROE above 10%, with the top 30 by lowest P/S selected each quarter. The result: 11.44% CAGR against a Sensex benchmark that returned 11.12%. The strategy beats the local index by just 0.32%. India's bull market explains most of the return. The screen adds very little on top.
Contents
- Method
- The Screen
- P/S Value Screen (SQL, India)
- What We Found
- 11.44% CAGR. Against a Sensex benchmark that returned 11.12%.
- Year-by-year returns
- 2005-2007: the opening run
- 2008-2009: the crash and the bounce
- The recurring pattern: overshoot in both directions
- 2018-2019: the domestic credit crisis
- Win rate vs the Sensex
- Backtest Methodology
- Limitations
- Takeaway
- Part of a Series
- References
- Run This Screen Yourself
Data: FMP financial data warehouse, 2000–2025. Updated March 2026.
Method
Data source: Ceta Research (FMP financial data warehouse) Universe: NSE only, market cap > ₹20B INR (approximately $240M USD) Period: 2000-2025 (25 years, 103 quarterly periods; first qualifying stocks appear in 2005) Rebalancing: Quarterly (January, April, July, October), equal weight, top 30 by lowest P/S Benchmark: Sensex (BSE 30 index), INR terms Cash rule: Hold cash if fewer than 10 stocks qualify
BSE was removed from the universe because 38% of stocks are dual-listed on both exchanges. Including both would double-count those positions and inflate returns. NSE is the larger, more liquid exchange and the cleaner dataset.
Financial data sourced from financial_ratios (FY) for P/S ratio and margins, key_metrics (FY) for ROE and market cap. 45-day lag on all financial statements to prevent look-ahead bias. Returns are in INR terms.
The Screen
The same four-filter screen as the US version, adjusted for the Indian market cap threshold.
Valuation:
| Criterion | Metric | Threshold |
|---|---|---|
| Cheap on sales | Price-to-Sales (FY) | < 1.0 |
Quality Filters:
| Criterion | Metric | Threshold |
|---|---|---|
| Margin quality | Gross Margin | > 20% |
| Operational efficiency | Operating Margin | > 5% |
| Capital returns | Return on Equity | > 10% |
Size:
| Criterion | Metric | Threshold |
|---|---|---|
| Mid-cap and above | Market Cap | > ₹20B INR |
The ₹20B threshold targets the mid-cap and large-cap segment where FMP data coverage is reliable. At current exchange rates it's roughly $240M USD, capturing a different size tier than the US screen's $1B USD cutoff. This matters for interpretation: the Indian screen includes smaller companies with more room to re-rate.
P/S Value Screen (SQL, India)
SELECT
f.symbol,
p.companyName,
p.exchange,
p.sector,
ROUND(f.priceToSalesRatioTTM, 3) AS ps_ratio,
ROUND(f.grossProfitMarginTTM * 100, 1) AS gross_margin_pct,
ROUND(f.operatingProfitMarginTTM * 100, 1) AS op_margin_pct,
ROUND(k.returnOnEquityTTM * 100, 1) AS roe_pct,
ROUND(k.marketCap / 1e9, 2) AS mktcap_b
FROM financial_ratios_ttm f
JOIN key_metrics_ttm k ON f.symbol = k.symbol
JOIN profile p ON f.symbol = p.symbol
WHERE f.priceToSalesRatioTTM > 0
AND f.priceToSalesRatioTTM < 1
AND f.grossProfitMarginTTM > 0.20
AND f.operatingProfitMarginTTM > 0.05
AND k.returnOnEquityTTM > 0.10
AND k.marketCap > 20000000000
AND p.exchange IN ('BSE', 'NSE')
QUALIFY ROW_NUMBER() OVER (PARTITION BY f.symbol ORDER BY f.priceToSalesRatioTTM ASC) = 1
ORDER BY f.priceToSalesRatioTTM ASC
LIMIT 30
Run this query on Ceta Research
What We Found

11.44% CAGR. Against a Sensex benchmark that returned 11.12%.
| Metric | P/S Screen (NSE) | Sensex |
|---|---|---|
| CAGR | 11.44% | 11.12% |
| Excess Return | +0.32% | - |
| Sharpe Ratio | 0.132 | - |
| Max Drawdown | -76.48% | - |
| Avg Stocks per Period | 28.1 (when invested) | - |
| Cash Periods | 22 of 103 | - |
The Sensex itself compounded at 11.12% over this period. The strategy added 0.32% on top. That's the honest headline. A Sharpe of 0.132 is weak, meaning you're taking on substantial volatility for returns barely above the index. The risk-adjusted case doesn't hold up against simply buying an index fund.
The cash periods (22 of 103) are concentrated in 2000-2004. FY financial data for Indian companies didn't arrive in sufficient volume until 2005, so the early quarters show no qualifying stocks. The effective investment period is roughly 20 years. The 11.44% CAGR is computed over the full 25-year window including those cash years.
India's risk-free rate runs around 6.5% (10-year government bond yield). The strategy clears that threshold. But it barely clears the Sensex, and it does so with a max drawdown of -76.48%.
Year-by-year returns

| Year | P/S Screen (NSE) | Sensex | Excess |
|---|---|---|---|
| 2000 | 0.0% (cash) | -25.23% | - |
| 2001 | 0.0% (cash) | -18.65% | - |
| 2002 | 0.0% (cash) | +2.93% | - |
| 2003 | 0.0% (cash) | +79.09% | - |
| 2004 | 0.0% (cash) | +10.83% | - |
| 2005 | +44.05% | +40.59% | +3.46% |
| 2006 | +60.25% | +48.48% | +11.78% |
| 2007 | +84.44% | +46.79% | +37.66% |
| 2008 | -71.65% | -51.34% | -20.31% |
| 2009 | +158.82% | +76.32% | +82.50% |
| 2010 | +18.19% | +17.10% | +1.09% |
| 2011 | -44.62% | -24.53% | -20.09% |
| 2012 | +43.61% | +27.04% | +16.57% |
| 2013 | -1.93% | +5.96% | -7.89% |
| 2014 | +65.24% | +33.51% | +31.73% |
| 2015 | +6.31% | -8.12% | +14.43% |
| 2016 | +10.06% | +3.79% | +6.26% |
| 2017 | +50.14% | +27.14% | +23.01% |
| 2018 | -41.63% | +6.15% | -47.78% |
| 2019 | -23.86% | +15.98% | -39.84% |
| 2020 | +30.69% | +15.74% | +14.95% |
| 2021 | +77.69% | +22.85% | +54.84% |
| 2022 | +14.70% | +3.35% | +11.34% |
| 2023 | +65.86% | +17.53% | +48.33% |
| 2024 | +17.52% | +11.20% | +6.32% |
| 2025 | -15.72% | +1.58% | -17.30% |
2005-2007: the opening run
The first three years of active investment were strong. The screen captured India's mid-cap expansion in the pre-crisis boom. Companies with P/S below 1 and decent margins re-rated sharply as the Sensex climbed. The 2007 return of +84.44% reflects concentrated exposure to stocks that nearly doubled in a single year. The Sensex itself gained 46.79% that year, so the screen did add value. But the starting point was a bull market doing most of the heavy lifting.
2008-2009: the crash and the bounce
2008 was the defining risk event: -71.65%, against the Sensex at -51.34%. Indian mid-cap stocks with illiquid ownership structures collapsed further than the large-cap Sensex during the global credit freeze. Quality filters don't protect against a market-wide liquidity crisis.
2009 reversed it: +158.82%, against the Sensex at +76.32%. If you held through 2008, the recovery looked complete within the year. But the practical challenge is that a -71% drawdown is severe enough to force selling at the worst moment for many investors.
The recurring pattern: overshoot in both directions
| Cycle | Strong years | Crash | Recovery |
|---|---|---|---|
| 2005-2007 / 2008 / 2009 | +44% to +84% per year | -71.65% | +158.82% |
| 2012-2017 | +43% to +65% in good years | 2018: -41.63%, 2019: -23.86% | 2020-2023 run |
| 2020-2023 / 2025 | +30% to +77% per year | -15.72% (2025) | TBD |
The strategy overshoots on both sides relative to the Sensex. Strong years are genuinely strong. Bad years are worse than the index. The long-run compounding produces a result barely above the benchmark because losses in bad years erode the gains from good ones.
2018-2019: the domestic credit crisis
Two consecutive years of underperformance vs the Sensex: -41.63% in 2018 (Sensex +6.15%), -23.86% in 2019 (Sensex +15.98%). That's a two-year period where the strategy lost roughly 56% while the Sensex gained 23.3%. The IL&FS collapse triggered a domestic credit crunch that hit mid-cap and small-cap stocks disproportionately. Quality filters didn't help. The companies that passed the screen still saw their prices fall sharply when liquidity dried up across the market.
Win rate vs the Sensex
The strategy beats the Sensex in 55.3% of periods where it was invested. That's slightly better than a coin flip. It doesn't mean the strategy is useless. It does mean the outperformance is concentrated in a handful of exceptional years (2007, 2009, 2014, 2021, 2023) rather than consistent quarterly edge.
Backtest Methodology
| Parameter | Choice |
|---|---|
| Universe | NSE only, Market Cap > ₹20B INR |
| Signal | P/S < 1.0, Gross Margin > 20%, Op. Margin > 5%, ROE > 10% |
| Portfolio | Top 30 by lowest P/S, equal weight |
| Rebalancing | Quarterly (January, April, July, October) |
| Cash rule | Hold cash if < 10 qualify |
| Benchmark | Sensex (BSE 30 index) |
| Period | 2000-2025 (25 years, 103 quarterly periods) |
| Data | Point-in-time (45-day lag on FY financial statements) |
| Returns | INR terms |
Limitations
Extreme drawdown risk. -76.48% max drawdown. Investors need to hold conviction through crashes of that magnitude. Most won't.
Weak Sharpe ratio. 0.132 means the risk-adjusted case is poor. The screen barely beats the Sensex on raw return and does so with far more volatility. An index fund is the simpler alternative.
Currency risk. Returns are in INR. USD-based investors face additional FX exposure. The INR has depreciated against the USD over this period, which would reduce returns in USD terms.
Cash drag in early years. Twenty-two cash periods, mostly 2000-2004, reflect data availability rather than any signal. The strategy missed the Sensex's 79.09% gain in 2003 entirely due to insufficient coverage.
Survivorship bias. Exchange membership uses current profiles, not historical. Delistings and corporate failures are not tracked over time.
Transaction costs not included. Indian mid-cap stocks can carry higher bid-ask spreads than US large-caps. Quarterly rebalancing of 30 names at 0.3-0.8% one-way transaction costs is approximately 0.8-2.0% annual drag depending on portfolio size and execution quality.
Data coverage. FMP's Indian data depth improves substantially after 2005. The early backtest years may have coverage gaps that affect stock selection at the margin.
BSE excluded. The live screen SQL above shows IN ('BSE', 'NSE') for practical use. The backtest uses NSE only to avoid double-counting the 38% of stocks dual-listed on both exchanges.
Takeaway
The headline of the old BSE+NSE analysis was 15.53% CAGR vs SPY's 8.01%. That looked impressive. The problem was the benchmark. Comparing Indian stocks to the S&P 500 in USD terms mixes currency movements and different economic cycles. When you measure against the Sensex in INR terms, the picture changes completely.
NSE-only P/S screen: 11.44% CAGR. Sensex: 11.12% CAGR. The strategy adds 0.32%.
The quality filters (gross margin > 20%, operating margin > 5%, ROE > 10%) do real work. They exclude pass-through traders, commodity middlemen, and capital-light distribution businesses with structurally thin margins. The universe of profitable, asset-light NSE companies with P/S below 1 does exist. But after 20 years, that selection produces returns nearly identical to the index.
India's bull market is the story. The Sensex itself compounded at 11.12% over this period, one of the stronger long-run returns of any major market. Beating that benchmark by a fraction of a percent is not a compelling argument for running the screen.
If you're investing in India for the long run, the simpler option is a Sensex or Nifty 50 index fund. The P/S screen reduces diversification, adds volatility, increases drawdown, and delivers almost no additional return in exchange.
Part of a Series
This analysis is part of our global P/S value screen comparison. We tested the same screen across 14 exchanges worldwide: - P/S Value Screen on US Stocks (NYSE + NASDAQ + AMEX) - 11.10% CAGR, the flagship analysis - P/S Value Screen on German Stocks (XETRA) - P/S Value Screen on Canadian Stocks (TSX) - P/S Value Screen on Swedish Stocks (STO) - P/S Value Screen on South African Stocks (JNB) - P/S Value Screen on Japanese Stocks (JPX) - P/S Value Screen: Global Exchange Comparison
References
- Fisher, K. (1984). Super Stocks. Dow Jones-Irwin.
- Barbee, W., Mukherji, S. & Raines, G. (1996). "Do Sales-Price and Debt-Equity Explain Stock Returns Better than Book-Market and Firm Size?" Financial Analysts Journal, 52(2), 56-60.
- Gray, W. & Vogel, J. (2012). "Analyzing Valuation Measures: A Performance Horse-Race over the Past 40 Years." Journal of Portfolio Management, 39(1), 112-121.
- Novy-Marx, R. (2013). "The Other Side of Value: The Gross Profitability Premium." Journal of Financial Economics, 108(1), 1-28.
Run This Screen Yourself
Via web UI: Run the India P/S value screen on Ceta Research. The query is pre-loaded. Hit "Run" and see what qualifies today.
Via Python:
import requests, time
API_KEY = "your_api_key" # get one at cetaresearch.com
BASE = "https://tradingstudio.finance/api/v1"
resp = requests.post(f"{BASE}/data-explorer/execute", headers={
"X-API-Key": API_KEY, "Content-Type": "application/json"
}, json={
"query": """
SELECT f.symbol, p.companyName, p.sector,
ROUND(f.priceToSalesRatioTTM, 3) AS ps_ratio,
ROUND(f.grossProfitMarginTTM * 100, 1) AS gross_margin_pct,
ROUND(f.operatingProfitMarginTTM * 100, 1) AS op_margin_pct,
ROUND(k.returnOnEquityTTM * 100, 1) AS roe_pct,
ROUND(k.marketCap / 1e9, 2) AS mktcap_b
FROM financial_ratios_ttm f
JOIN key_metrics_ttm k ON f.symbol = k.symbol
JOIN profile p ON f.symbol = p.symbol
WHERE f.priceToSalesRatioTTM > 0
AND f.priceToSalesRatioTTM < 1
AND f.grossProfitMarginTTM > 0.20
AND f.operatingProfitMarginTTM > 0.05
AND k.returnOnEquityTTM > 0.10
AND k.marketCap > 20000000000
AND p.exchange IN ('NSE')
QUALIFY ROW_NUMBER() OVER (PARTITION BY f.symbol ORDER BY f.priceToSalesRatioTTM ASC) = 1
ORDER BY f.priceToSalesRatioTTM ASC
LIMIT 30
""",
"options": {"format": "json", "limit": 100}
})
task_id = resp.json()["taskId"]
while True:
result = requests.get(f"{BASE}/tasks/data-query/{task_id}",
headers={"X-API-Key": API_KEY}).json()
if result["status"] in ("completed", "failed"):
break
time.sleep(2)
for r in result["result"]["rows"][:10]:
print(f"{r['symbol']:12s} P/S={r['ps_ratio']:.3f} GM={r['gross_margin_pct']:.1f}% ROE={r['roe_pct']:.1f}%")
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 only. Returns in INR. Quarterly rebalance, equal weight, 2000-2025.