New to these reports? Start here
  • Dotted-underlined words have a plain-English definition — hover or tap them. Every term is also on the glossary page.
  • "Null" means we found nothing, not that something broke. Most reports here are negative results, on purpose — knowing an idea doesn't work is the point.
  • Two questions get asked separately. First, is the effect real? Second, is it already priced into the betting odds? An effect can be completely real and still useless to bet on.
  • A "calibration" row is a self-check. It runs the same method on something already known to be true. If that fails, the whole report is unreliable — so it's reported alongside the findings.
  • If a confidence interval includes zero, the real effect might be nothing at all, so no claim gets made.

Strategy 004: Piotroski F-Score

Source

Joseph Piotroski, Value Investing: The Use of Historical Financial Statement Information to Separate Winners from Losers (Journal of Accounting Research, 2000).

Thesis

Cheap stocks (bottom P/B decile) outperform on average, but the average masks huge dispersion — most cheap stocks are cheap for a reason. Piotroski's insight: a simple 9-point fundamental health score separates the "cheap and getting better" from the "cheap and dying." Top scorers in the value bucket outperform; bottom scorers underperform.

This is the canonical "quality filter on value" strategy. Complements Magic Formula (which combines value + quality differently).

The 9 criteria

Award 1 point for each of:

Profitability (4 points) 1. ROA > 0 in current year 2. Operating cash flow > 0 3. ROA improved from prior year 4. Operating cash flow > Net income (earnings quality)

Leverage / Liquidity (3 points) 5. Long-term debt / Total assets decreased year over year 6. Current ratio increased year over year 7. No new share issuance (shares outstanding stayed flat or decreased)

Operating efficiency (2 points) 8. Gross margin increased year over year 9. Asset turnover (Revenue / Total Assets) increased year over year

Score is 0-9. Higher is better.

Implementation

  • Universe: sp500
  • Filter: bottom 50 by P/B ratio (cheap value bucket, ~10% of universe)
  • Hold: top scorers from filter (F-Score ≥ 7), equal-weight, max 30 names
  • Rebalance: annual (matches Piotroski's original design)

Why it might still work in 2025

  • Decades of out-of-sampleout-of-sampleTested on data that was not used to build or tune the idea. This is the honest test; results on the data you built with are almost always flattering. replication (academic literature 2000-2020+)
  • Mechanism is fundamental (good businesses surfacing in cheap bucket)
  • Less crowded than Magic Formula despite being similar in spirit

Why it might NOT work

  • Same value-vs-growth headwind that killed Magic Formula recently
  • Universe filtering by P/B may select small caps with worse data quality and higher transaction costs
  • yfinance fundamental data is sometimes missing year-over-year comparison data we need (esp. for older periods)

Data requirements

  • Total Assets, Total Liabilities (balance sheet, current + prior year)
  • Net Income, Revenue, Gross Profit (income, current + prior)
  • Operating Cash Flow (cashflow, current)
  • Long-term Debt, Current Assets, Current Liabilities (balance, both years)
  • Shares Outstanding (current + prior)
  • Market Cap (for P/B calc)

yfinance gives us most; some line items vary by name.

Expected outcome

Piotroski's original (1976-1996): mean return of high-F-score value stocks outpaced market by ~7.5%/yr. Decade-by-decade tests since then have varied but generally positive (+3-6%/yr).

In our 2015-2026 window — same value headwind as Magic Formula. Expect modest result, may underperform SPY but likely beat Magic Formula due to the quality filter.

Pass/fail criteria

  • Pass: CAGR >= SPY, OR beats Magic Formula by 3pp+ (proves quality filter adds value to deep-value approach)
  • Marginal: CAGR within ±2% of SPY
  • Fail: CAGR < SPY by 5+ pp