Do ROE, Piotroski F-score and margins predict NSE stock returns?
Short answer: On a 1,537-observation panel of SEBI filings, no fundamental metric separated forward returns over the window tested.
Published 2026-10-21 · original backtest on Indian market data by TRINETRA
Date: 2026-10-21 Script: engine/scripts/bench_fundamentals_v2.py Output: data/research/BENCH_fundamentals_v2.json Supersedes: BENCH_fundamentals.json — see "Why the old verdict cannot be carried over"
Verdict
NO METRIC SEPARATED FORWARD RETURNS on this sample. 20 hypotheses (7 metrics × 3
horizons), 1,537 observations across 266 symbols and 6 quarters, with a within-week shuffled
null and Benjamini-Hochberg FDR control. Nothing survived with the predicted sign and a ≥55%
weekly win rate.
This is the answer I expected and the one the section was already written for. It does not mean fundamentals are worthless — it means they do not time entries. No direction field, arrow or rating is earned, and none is shipped.
Why the old verdict could not be carried over
The first bench reported "NO MEASURABLE RELATIONSHIP (−6.3%, −26.5%, +3.0%)". That result was not evidence about this data, for three reasons:
- It tested the 6-signal
profitability_trendproxy — a score built because the income statement was all that was available. It no longer drives anything on the page. - It had one filing date. One cross-section cannot separate "quality does not predict" from "Dec-2024 was an unusual quarter".
- It could not test ROE, ROCE, D/E, FCF, accruals or the real F-score at all — those need the balance sheet the old source did not carry.
So the honest move was to re-run, not to quote the old number about new metrics.
Design
| first bench | this one | |
|---|---|---|
| Observations | 94 (1 per symbol) | 1,537 (1 per symbol-quarter) |
| Filing dates | 1 | 17 filing weeks over 6 quarters |
| Point-in-time | period_end + 45 days (a guess) | the actual broadcast_Date, window opens next trading day |
| Metrics | 1 | 7 |
| Null | shuffle across symbols | shuffle within filing week |
| Clustering | none | test on week means, n = weeks |
| Multiple comparisons | none | Benjamini-Hochberg over all 20 |
Three of those changes exist because of earlier retractions in this project:
- Within-week shuffling (not across) — shuffling across weeks would also scramble which quarter each return came from, making the null too easy to beat. This is the control that retracted Gann R5.
- n = weeks, not observations — Indian results cluster into ~3 weeks a quarter; hundreds of filings share one market move. Pooling inflates n by ~10×.
diag_buy_watchfirst read −3.79% on "n=121" that was really 23 dates, two of them holding 51 observations. - BH across all 20 — at p<0.05, 20 tests expect 1.0 chance hits. Exactly one test came in under 0.05, which is the chance pattern, not a signal.
Results
All figures are mean weekly high-minus-low tercile spread in excess returns, signed so positive = the hypothesis held.
| metric | h=21 | h=63 | h=126 | sign-consistent? |
|---|---|---|---|---|
| ROE | +0.97% (p=.34) | −2.28% (p=.22) | −2.29% (p=.46) | no |
| ROCE | +1.34% (p=.22) | −0.32% (p=.86) | +1.79% (p=.57) | no |
| Debt/equity | −2.29% (p=.041) | −2.30% (p=.28) | −4.14% (p=.21) | yes |
| CFO ÷ PAT | −0.12% (p=.92) | +0.06% (p=.97) | +3.06% (p=.34) | no |
| FCF margin | +0.04% (p=.97) | +0.29% (p=.89) | −4.00% (p=.20) | no |
| Piotroski F-score | −0.39% (p=.84) | −0.44% (p=.91) | n/a | no |
| Capex ÷ depreciation | −0.63% (p=.54) | +1.82% (p=.37) | −4.44% (p=.15) | no |
The one result worth stating carefully
debt_to_equity is the only metric sign-consistent across all three horizons (−2.29%, −2.30%, −4.14%), with weekly win rates of 29%, 29% and 20%. The sign means high-leverage names BEAT low-leverage names on this sample — the opposite of the hypothesis, which was framed lower-is-better per the distress literature.
It is not a finding, and the page says nothing about it:
- It failed Benjamini-Hochberg (p=.041 against a 20-test correction where 1.0 chance hit was expected).
- Only the shortest horizon reached p<0.05 at all.
- Six quarters of 2025-2026 is one broad regime, and a leveraged-beta rally would produce exactly this pattern without any information in the ratio itself.
Recording it because sign-consistency is the pattern that would merit a follow-up on more history — not because it earns anything now. The honest reading is "high-beta names outran low-beta names over this window", which is a statement about the regime, not about leverage as a signal.
Piotroski has the weakest coverage
Only 226 observations across 7 weeks, because the F-score needs four filings (current and year-earlier, each with a balance sheet) and many quarterly filers do not file the sheet every quarter. Its h=126 test was skipped entirely for lack of data. So the F-score here is under-tested rather than tested and cleared.
Limits, stated plainly
- Six quarters is one regime. 2025-03-31 → 2026-06-30. Nothing here speaks to a bear market.
- Banks excluded. They file a different schedule; a mixed panel would be incoherent. Bank metrics are untested.
- Universe is the 611 themed names ∩ price history, sampled to 320. That is the tradeable universe the page is used on, not the whole listed tail — a selection choice, stated.
- Candle-store defects persist (duplicate sessions, unadjusted splits) and are neutralised by
clean(), not fixed at source. - A null result at this n is not proof of no effect. With 17 weeks, a genuine 1-2% quarterly edge would likely not clear this bar. The conclusion is "not demonstrated here", not "demonstrated absent".
What this licenses on the page
| allowed | |
|---|---|
| Report the metrics as business description | ✅ yes — what they are for |
| Show the trailing multiples as facts | ✅ yes — a P/E is arithmetic, not a forecast |
| Rank peers on a metric | ✅ with the peer count shown |
| Score, rate, or sort by "quality" | ❌ nothing earned it |
| A buy/sell/hold or direction arrow | ❌ explicitly not |
| Call a stock cheap or expensive | ❌ that is a judgment this does not support |