# Do ROE, Piotroski F-score and margins predict NSE stock returns?

> On a 1,537-observation panel of SEBI filings, no fundamental metric separated forward returns over the window tested.

Published 2026-10-21 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:

1. It tested the 6-signal `profitability_trend` proxy — a score built because the income
   statement was all that was available. It no longer drives anything on the page.
2. It had **one filing date**. One cross-section cannot separate "quality does not predict"
   from "Dec-2024 was an unusual quarter".
3. 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_watch` first 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 |


_TRINETRA is a research and education tool. Nothing on this site is investment advice or a recommendation to buy or sell any security. Markets carry risk; do your own research and consult a SEBI-registered adviser before investing._
