Piotroski F-Score: How to Calculate and Screen Stocks in Excel

In this article
Piotroski F-Score calculation and stock screening workflow in Excel using MarketXLS fundamental data

The Piotroski F-Score is a 0 to 9 score of a company's financial strength, built from nine pass/fail tests on its annual financial statements: four on profitability (positive ROA, positive operating cash flow, improving ROA, cash flow above net income), three on leverage and liquidity (lower long-term debt ratio, higher current ratio, no new shares issued), and two on efficiency (higher gross margin, higher asset turnover). A score of 8 or 9 signals a financially strong, improving company; 0 to 2 signals deterioration. Accounting professor Joseph Piotroski introduced it in his 2000 paper "Value Investing: The Use of Historical Financial Statement Information to Separate Winners from Losers" to separate strong value stocks from weak ones.

In Excel, MarketXLS returns the total score with =PitrioskiFScore("AAPL") (spelled as in the MarketXLS function registry). This guide shows how each criterion is calculated, how to build a manual calculator and a screening sheet, and the limits of the score.


Why the Piotroski F-Score Matters for Stock Screening

The Piotroski F-Score adds a financial-health check to valuation screens. Low price-to-earnings, low price-to-book or high dividend yield alone cannot tell a temporarily undervalued company from one in financial distress; the F-Score separates the two using the company's own statements.

In Piotroski's original study of high book-to-market (value) stocks from 1976 to 1996, a strategy of buying high-scoring stocks and shorting low-scoring ones returned about 23% a year. That is a historical backtest, not a forecast; results depend on period, market and costs.

F-Score Interpretation

Score RangeFinancial HealthAction
8–9Excellent: improving on nearly all frontsCandidate for further value research
6–7Good: majority of criteria metWorth further analysis
4–5Average: mixed signalsProceed with caution
2–3Weak: financial deterioration evidentInvestigate deeply
0–1Very weak: failing most criteriaHigh risk of continued decline

The 9 Criteria: Detailed Calculation Guide

The F-Score consists of nine binary tests (pass = 1, fail = 0). The total score ranges from 0 to 9. Here is exactly how to calculate each one.

Category 1: Profitability (4 Points)

Criterion 1: Positive Return on Assets (ROA)

ROA = Net Income ÷ Total Assets (Piotroski used beginning-of-year assets). If ROA is positive, which is the same as positive net income, score 1.

F1 = 1 if (Net Income / Total Assets) > 0, else 0

Criterion 2: Positive Operating Cash Flow (CFO)

If cash flow from operations is positive, score 1. Cash flow is harder to shape with accounting choices than net income.

F2 = 1 if Operating Cash Flow > 0, else 0

Criterion 3: Improving ROA

If ROA this year is higher than ROA last year, score 1.

F3 = 1 if ROA(current) > ROA(prior), else 0

Criterion 4: Earnings Quality (Accruals)

If operating cash flow exceeds net income (equivalently, cash flow ROA exceeds ROA), score 1. This tests whether earnings are backed by cash or driven by accounting accruals.

F4 = 1 if Operating Cash Flow > Net Income, else 0

Category 2: Leverage, Liquidity & Source of Funds (3 Points)

Criterion 5: Decreasing Long-Term Debt Ratio

Compare (Long-Term Debt ÷ Total Assets) for the current year versus the prior year. If leverage decreased, score 1.

F5 = 1 if (LTD/TA)current < (LTD/TA)prior, else 0

Criterion 6: Increasing Current Ratio

Compare the current ratio (Current Assets ÷ Current Liabilities) year-over-year. If liquidity improved, score 1.

F6 = 1 if Current Ratio(current) > Current Ratio(prior), else 0

Criterion 7: No New Share Issuance

If the company did not issue new common shares in the past year (shares outstanding did not increase), score 1. Share dilution is a negative signal.

F7 = 1 if Shares Outstanding(current) ≤ Shares Outstanding(prior), else 0

Category 3: Operating Efficiency (2 Points)

Criterion 8: Improving Gross Margin

Compare gross margin (Gross Profit ÷ Revenue) year-over-year. If it increased, score 1.

F8 = 1 if Gross Margin(current) > Gross Margin(prior), else 0

Criterion 9: Improving Asset Turnover

Compare asset turnover (Revenue ÷ Total Assets) year-over-year. If it increased, score 1.

F9 = 1 if Asset Turnover(current) > Asset Turnover(prior), else 0

Total F-Score = F1 + F2 + F3 + F4 + F5 + F6 + F7 + F8 + F9


Calculating the Piotroski F-Score in Excel with MarketXLS

MarketXLS returns the complete Piotroski F-Score with one function:

=PitrioskiFScore("AAPL")

Formula documentation: PitrioskiFScore

=PitrioskiFScore returns the total score (0-9) for a stock ticker, so you do not have to build the nine tests yourself.

Note: The function name in MarketXLS is spelled PitrioskiFScore (matching the function registry). It takes one parameter, the stock symbol. It is listed for the Microsoft 365 add-in (Excel on Mac and Excel for the web), where it is written =mxls.PitrioskiFScore("AAPL"). Function availability differs by platform, so check the formula list for the Windows desktop add-in.

Quick F-Score Lookup Table

To screen multiple stocks at once, create a table:

RowColumn A (Ticker)Column B (F-Score)Column C (P/E Ratio)Column D (Revenue)
2AAPL=PitrioskiFScore("AAPL")=PERatio("AAPL")=Revenue("AAPL")
3MSFT=PitrioskiFScore("MSFT")=PERatio("MSFT")=Revenue("MSFT")
4JNJ=PitrioskiFScore("JNJ")=PERatio("JNJ")=Revenue("JNJ")
5XOM=PitrioskiFScore("XOM")=PERatio("XOM")=Revenue("XOM")
6BRK.B=PitrioskiFScore("BRK.B")=PERatio("BRK.B")=Revenue("BRK.B")

Sorting and Filtering

Once you have the F-Scores populated, use Excel's built-in Sort & Filter to:

  • Sort descending by F-Score to see the strongest companies first
  • Filter to show only stocks with F-Score ≥ 7
  • Add conditional formatting: green for 7-9, yellow for 4-6, red for 0-3

Building a Manual F-Score Calculator in Excel

If you want to understand each criterion and see exactly where a company scores or fails, you can build the full calculation manually using MarketXLS fundamental data functions.

Step 1: Pull Fundamental Data

Use hf_ functions to get historical financial data. With a year and quarter, hf_revenue returns that quarter's revenue; add "TTM" for the trailing twelve months ending in that quarter:

=hf_revenue("AAPL", 2024, 4, "TTM")     ' Trailing 12-month revenue ending calendar Q4 2024
=hf_revenue("AAPL", 2023, 4, "TTM")     ' Trailing 12-month revenue ending calendar Q4 2023

Formula documentation: hf_revenue

Use =Revenue() for the most recent trailing twelve months:

=Revenue("AAPL")

Formula documentation: Revenue

Use =PERatio() to assess current valuation alongside the F-Score:

=PERatio("AAPL")

Formula documentation: PERatio

Step 2: Calculate Each Criterion

Here is a sample layout for a manual F-Score calculator:

RowCriterionCurrent Year DataPrior Year DataScore Formula
1ROA > 0Net income / total assetsn/a=IF(C2>0, 1, 0)
2CFO > 0(from financials)n/a=IF(C3>0, 1, 0)
3ROA improvedCurrent ROAPrior ROA=IF(C4>D4, 1, 0)
4CFO > Net IncomeCFO minus net incomen/a=IF(C5>0, 1, 0)
5LTD/TA decreasedCurrent ratioPrior ratio=IF(C6<D6, 1, 0)
6Current Ratio increasedCurrent CRPrior CR=IF(C7>D7, 1, 0)
7No dilutionCurrent sharesPrior shares=IF(C8<=D8, 1, 0)
8Gross Margin upCurrent GMPrior GM=IF(C9>D9, 1, 0)
9Asset Turnover upCurrent ATPrior AT=IF(C10>D10, 1, 0)
Total=SUM(E2:E10)

Step 3: Validate Against the Built-In Function

Compare your manual calculation against the MarketXLS function:

=PitrioskiFScore("AAPL")

Formula documentation: PitrioskiFScore

If they match, your spreadsheet is correctly built. If they differ, check which criterion is calculated differently and investigate the data source.


Stock Screening Workflow Using the F-Score

Here is a practical, step-by-step workflow for using the Piotroski F-Score to screen stocks:

Step 1: Start with a Value Universe

Begin with stocks that already meet basic value criteria:

=PERatio("AAPL")        ' Filter for P/E < 15 or your preferred threshold

Formula documentation: PERatio

Create a list of 50-100 stocks from a value screen (low P/E, low P/B, high dividend yield, etc.).

Step 2: Apply the F-Score Filter

For each stock in your value universe, calculate the F-Score:

=PitrioskiFScore(A2)     ' Where A2 contains the ticker symbol

Formula documentation: PitrioskiFScore

Filter to keep only stocks scoring 7 or higher.

Step 3: Add Revenue and Earnings Growth

Supplement the F-Score with growth metrics:

=Revenue("AAPL")
=hf_revenue("AAPL", 2024, 4, "TTM")
=hf_revenue("AAPL", 2023, 4, "TTM")

Formula documentation: Revenue, hf_revenue

Calculate year-over-year revenue growth to ensure the company is not just financially strong but also growing.

Step 4: Rank and Prioritize

Sort your filtered list by:

  1. F-Score (highest first)
  2. P/E Ratio (lowest first, among tied F-Scores)
  3. Revenue growth (highest first, as a tiebreaker)

This gives you a ranked list of financially strong, undervalued companies with growth momentum.


Comparison: F-Score Screening Methods

MethodSpeedDepthCustomizationBest For
=PitrioskiFScore() one-linerInstantSummary onlyNone — returns total scoreQuick screening of many stocks
Manual 9-criterion spreadsheet15-30 min setupFull — see each criterionComplete — adjust thresholdsUnderstanding why a stock scores well or poorly
Combined approach (auto + manual)ModerateFullHighScreening first, then deep-diving into top picks
Third-party screener websitesInstantVariesLimitedQuick checks without Excel

Practical Tips for F-Score Screening

Tip 1: Combine with Sector Analysis

The F-Score works across all sectors, but some criteria may be more relevant in certain industries. For example, the share issuance criterion (F7) is particularly important in sectors like biotech where dilution is common.

Tip 2: Use Historical F-Scores for Trend Analysis

A company that improved from F-Score 4 to F-Score 7 over two years is showing a positive trajectory — potentially more attractive than a company that dropped from 9 to 7.

Tip 3: Be Cautious with Financial Sector Stocks

The Piotroski F-Score was designed for non-financial companies. Banks, insurance companies, and REITs have different financial structures that may not be well-captured by the nine criteria. Exercise caution when screening financials.

Tip 4: Combine F-Score with Other Scoring Systems

The F-Score works well in combination with:

  • Altman Z-Score — for bankruptcy risk assessment
  • Beneish M-Score — for earnings manipulation detection
  • Magic Formula — for combined quality and value ranking

Using multiple scoring systems reduces the risk of any single model's blind spots.

Tip 5: Rebalance Quarterly

F-Scores change as new financial statements are released. Rescreen your portfolio quarterly after earnings season to catch companies whose financial health is improving or deteriorating.


Who Should Use the Piotroski F-Score?

Investor TypeHow to Use F-ScoreKey Benefit
Value investorsPrimary screening filter on low P/B stocksFlags likely value traps (weak, deteriorating companies)
Dividend investorsConfirm financial health before relying on dividend paymentsChecks cash flow, leverage and liquidity behind the payout
Portfolio managersQuality overlay across the entire portfolioSystematic risk reduction through financial health scoring
Quantitative analystsFactor in multi-factor models alongside momentum and valuePublished academic factor with a transparent definition
Individual investorsQuick sanity check on any stockInstant financial health assessment without reading financial statements
Financial advisorsClient-facing analysis and due diligenceObjective, transparent methodology that clients can understand

Pricing and Access

=PitrioskiFScore() and the fundamental functions in this guide are part of MarketXLS, which has a library of 1000+ functions. US plans start at $70/month billed annually (Standard), with Advanced at $125/month and Business at $200/month billed annually. See the MarketXLS pricing page for details.

Real-World Screening Example

Let us walk through a complete screening exercise using the Piotroski F-Score.

Step 1: Create a list of 20 large-cap stocks across different sectors.

Step 2: For each stock, pull the F-Score and key valuation metrics:

=PitrioskiFScore("AAPL")    ' Financial health score
=PERatio("AAPL")            ' Current valuation
=Revenue("AAPL")            ' Revenue scale
=Last("AAPL")               ' Current stock price

Formula documentation: PitrioskiFScore, PERatio, Revenue, Last

Step 3: Build a scoring matrix:

TickerF-ScoreP/E RatioRevenue ($B)Current PriceAction
AAPL=PitrioskiFScore("AAPL")=PERatio("AAPL")=Revenue("AAPL")=Last("AAPL")Review if F≥7
MSFT=PitrioskiFScore("MSFT")=PERatio("MSFT")=Revenue("MSFT")=Last("MSFT")Review if F≥7
WMT=PitrioskiFScore("WMT")=PERatio("WMT")=Revenue("WMT")=Last("WMT")Review if F≥7

Step 4: Filter the table to show only stocks where:

  • F-Score ≥ 7 (strong financial health)
  • P/E Ratio < 20 (reasonable valuation)

Step 5: For the remaining stocks, do a deep dive into each of the 9 criteria to understand specifically where the company excels and where it falls short.

This workflow applies the same financial-health rules to every candidate before you commit research time.

Historical Performance of F-Score Strategies

The main published evidence for the F-Score is Piotroski's original study:

  • Original study (1976-1996): Among high book-to-market US stocks, a long-short strategy buying high F-Score stocks and shorting low F-Score stocks returned approximately 23% a year.
  • Where the effect was strongest: Piotroski reported the benefit was concentrated in smaller companies with less analyst coverage, where financial statement analysis adds the most information.

Later studies have tested the score in other periods and markets with mixed strength. Treat the backtest as evidence that the nine tests carry information, not as an expected return. This article is educational and not investment advice.

Limitations of the Piotroski F-Score

LimitationExplanationMitigation
Backward-lookingBased on historical financial statementsSupplement with forward estimates and analyst consensus
Binary scoringEach criterion is pass/fail — no partial creditBuild a weighted version for more nuance
Sector biasNot designed for banks and financialsExclude or use modified criteria for financial firms
Ignores valuationHigh F-Score does not mean cheapAlways combine with valuation metrics like P/E
No momentumDoes not consider price trendsAdd technical indicators or price momentum screens
Annual data lagFinancial statements are released quarterly but some items are annualUse quarterly data where available via =hf_revenue()

Frequently Asked Questions

What is a good Piotroski F-Score?

A Piotroski F-Score of 8 or 9 is strong and 7 is good: the company passes most or all of the nine financial health tests. In Piotroski's study, high-score value stocks outperformed low-score value stocks. Scores below 3 indicate significant financial weakness.

How often should I recalculate the Piotroski F-Score?

The F-Score should be recalculated after each quarterly earnings release, as the underlying financial data changes. Many investors do a full rescreen once per quarter. With MarketXLS, the =PitrioskiFScore() function uses the most recent available data each time it recalculates.

Can the Piotroski F-Score be used for growth stocks?

The F-Score was designed for value stocks — companies with low price-to-book ratios. It can be applied to growth stocks, but some criteria (like the share issuance test) may penalize high-growth companies that legitimately raise capital for expansion. Use it as one of several inputs rather than the sole filter for growth investing.

How is the Piotroski F-Score different from the Altman Z-Score?

The Piotroski F-Score measures financial health and improvement (is the company getting stronger?), while the Altman Z-Score specifically predicts bankruptcy risk (is the company at risk of failure?). They are complementary — a stock with a high F-Score and a safe Z-Score is in strong financial shape.

Does MarketXLS calculate the F-Score automatically?

Yes. MarketXLS provides the =PitrioskiFScore("TICKER") function that returns the complete F-Score (0-9) for any stock. You can also pull individual fundamental data points using functions like =Revenue(), =PERatio(), and =hf_revenue() to build a manual calculation if you want full visibility into each criterion.

Should I use the F-Score alone to make investment decisions?

No. The F-Score is one tool among many. It excels at identifying financially strong companies, but it does not account for valuation, industry dynamics, competitive positioning, management quality, or macroeconomic factors. Use it as a screening filter in combination with valuation analysis and qualitative research.


Conclusion

The Piotroski F-Score turns nine pass/fail tests on profitability, leverage, liquidity and operating efficiency into one 0 to 9 financial-health score.

With MarketXLS, you can get the total with =PitrioskiFScore(), or build a manual calculator from hf_ fundamental functions to see how each criterion is evaluated. Combine it with valuation screening and qualitative research rather than using it alone.

Ready to screen stocks with the Piotroski F-Score? See MarketXLS plans to use =PitrioskiFScore() and the rest of the 1000+ function library in Excel.


Disclaimer

None of the content published on marketxls.com constitutes a recommendation that any particular security, portfolio of securities, transaction, or investment strategy is suitable for any specific person. The author is not offering any professional advice of any kind. The reader should consult a professional financial advisor to determine their suitability for any strategies discussed herein. The article is written for educational purposes only. Past performance does not guarantee future results.

Related posts

Important Disclaimer

The information provided in this article is for educational and informational purposes only and should not be construed as investment advice, a recommendation, or an offer to buy or sell any securities. MarketXLS is a financial data platform and is not a registered investment advisor, broker-dealer, or financial planner. Always conduct your own research and consult with a qualified financial professional before making any investment decisions. Past performance is not indicative of future results. Trading and investing involve substantial risk of loss.

Explore MarketXLS in Excel
Download a free sample workbook (.xlsx). MarketXLS is a paid subscription.
I agree to the MarketXLS Terms and Conditions

See MarketXLS in action

Bring this workflow into Excel.

Book a demo with our team to see how MarketXLS supports your market research.

Ankur
AnkurFounder & CEO, MarketXLS
Book a demo