Piotroski F-Score is a nine-point scoring system that ranks a company's financial strength by evaluating profitability, leverage, liquidity, and operating efficiency. Originally developed by Stanford accounting professor Joseph Piotroski in his 2000 paper "Value Investing: The Use of Historical Financial Statement Information to Separate Winners from Losers," the F-Score provides a systematic, repeatable method for separating financially strong value stocks from deteriorating ones. This guide focuses on the practical side — how to actually calculate each of the nine criteria, how to build a screening spreadsheet in Excel using MarketXLS, and how to use the score to rank and filter stocks for a value-oriented portfolio.
Why the Piotroski F-Score Matters for Stock Screening
Many investors screen for "cheap" stocks using simple valuation ratios — low price-to-earnings, low price-to-book, or high dividend yields. The problem is that cheapness alone does not distinguish between a temporarily undervalued company and a company in financial distress. The Piotroski F-Score solves this by adding a quality overlay on top of valuation screening.
Research has consistently shown that high F-Score stocks (7-9) significantly outperform low F-Score stocks (0-3) over time. Piotroski's original study found that a strategy of buying high-scoring value stocks and shorting low-scoring ones produced a 23% annual return between 1976 and 1996.
F-Score Interpretation
| Score Range | Financial Health | Action |
|---|---|---|
| 8–9 | Excellent — improving on nearly all fronts | Strong candidate for value portfolio |
| 6–7 | Good — majority of criteria met | Worth further analysis |
| 4–5 | Average — mixed signals | Proceed with caution |
| 2–3 | Weak — financial deterioration evident | Avoid or investigate deeply |
| 0–1 | Very weak — failing most criteria | High 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 Net Income
If the company's net income for the most recent fiscal year is greater than zero, score 1.
F1 = 1 if Net Income > 0, else 0
Criterion 2: Positive Return on Assets (ROA)
ROA = Net Income ÷ Total Assets. If ROA is positive, score 1.
F2 = 1 if (Net Income / Total Assets) > 0, else 0
Criterion 3: Positive Operating Cash Flow (CFO)
If cash flow from operations is positive, score 1. This is arguably more important than net income because it is harder to manipulate.
F3 = 1 if Operating Cash Flow > 0, else 0
Criterion 4: Earnings Quality (Accruals)
If operating cash flow exceeds net income, score 1. This tests whether earnings are backed by real 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 average shares outstanding did not increase compared to the prior year, 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 provides a dedicated function that calculates the complete Piotroski F-Score automatically:
=PitrioskiFScore("AAPL")
This function evaluates all nine criteria internally and returns the total score (0-9) for any stock ticker. It is the fastest way to get the F-Score without building the entire calculation from scratch.
“Note: The function name in MarketXLS is
PitrioskiFScore(matching the internal function registry). It accepts a single parameter — the stock symbol.
Quick F-Score Lookup Table
To screen multiple stocks at once, create a table:
| Row | Column A (Ticker) | Column B (F-Score) | Column C (P/E Ratio) | Column D (Revenue) |
|---|---|---|---|---|
| 2 | AAPL | =PitrioskiFScore("AAPL") | =PERatio("AAPL") | =Revenue("AAPL") |
| 3 | MSFT | =PitrioskiFScore("MSFT") | =PERatio("MSFT") | =Revenue("MSFT") |
| 4 | JNJ | =PitrioskiFScore("JNJ") | =PERatio("JNJ") | =Revenue("JNJ") |
| 5 | XOM | =PitrioskiFScore("XOM") | =PERatio("XOM") | =Revenue("XOM") |
| 6 | BRK.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_revenue() to get historical financial data:
=hf_revenue("AAPL", 2024, 4) ' Annual revenue for fiscal year 2024
=hf_revenue("AAPL", 2023, 4) ' Annual revenue for fiscal year 2023
Use =Revenue() for the most recent trailing twelve months:
=Revenue("AAPL")
Use =PERatio() to assess current valuation alongside the F-Score:
=PERatio("AAPL")
Step 2: Calculate Each Criterion
Here is a sample layout for a manual F-Score calculator:
| Row | Criterion | Current Year Data | Prior Year Data | Score Formula |
|---|---|---|---|---|
| 1 | Net Income > 0 | (from financials) | — | =IF(C2>0, 1, 0) |
| 2 | ROA > 0 | =C2/TotalAssets | — | =IF(C3>0, 1, 0) |
| 3 | CFO > 0 | (from financials) | — | =IF(C4>0, 1, 0) |
| 4 | CFO > Net Income | =C4-C2 | — | =IF(C5>0, 1, 0) |
| 5 | LTD/TA decreased | Current ratio | Prior ratio | =IF(C6<D6, 1, 0) |
| 6 | Current Ratio increased | Current CR | Prior CR | =IF(C7>D7, 1, 0) |
| 7 | No dilution | Current shares | Prior shares | =IF(C8<=D8, 1, 0) |
| 8 | Gross Margin up | Current GM | Prior GM | =IF(C9>D9, 1, 0) |
| 9 | Asset Turnover up | Current AT | Prior 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")
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
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
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)
=hf_revenue("AAPL", 2023, 4)
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:
- F-Score (highest first)
- P/E Ratio (lowest first, among tied F-Scores)
- 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
| Method | Speed | Depth | Customization | Best For |
|---|---|---|---|---|
=PitrioskiFScore() one-liner | Instant | Summary only | None — returns total score | Quick screening of many stocks |
| Manual 9-criterion spreadsheet | 15-30 min setup | Full — see each criterion | Complete — adjust thresholds | Understanding why a stock scores well or poorly |
| Combined approach (auto + manual) | Moderate | Full | High | Screening first, then deep-diving into top picks |
| Third-party screener websites | Instant | Varies | Limited | Quick 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 Type | How to Use F-Score | Key Benefit |
|---|---|---|
| Value investors | Primary screening filter on low P/B stocks | Eliminates value traps before they damage your portfolio |
| Dividend investors | Confirm financial health before relying on dividend payments | Companies with high F-Scores are less likely to cut dividends |
| Portfolio managers | Quality overlay across the entire portfolio | Systematic risk reduction through financial health scoring |
| Quantitative analysts | Factor in multi-factor models alongside momentum and value | Proven academic alpha factor with decades of backtested data |
| Individual investors | Quick sanity check on any stock | Instant financial health assessment without reading financial statements |
| Financial advisors | Client-facing analysis and due diligence | Objective, transparent methodology that clients can understand |
Pricing and Access
MarketXLS offers the =PitrioskiFScore() function as part of its Excel add-in. To access this function and the full library of 1,100+ fundamental analysis functions, visit the MarketXLS pricing page to choose the plan that fits your needs. All plans include access to fundamental data functions used throughout this guide.
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
Step 3: Build a scoring matrix:
| Ticker | F-Score | P/E Ratio | Revenue ($B) | Current Price | Action |
|---|---|---|---|---|---|
| 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 systematic workflow removes emotion and bias from the screening process, ensuring every candidate meets objective financial health standards before you commit research time.
Historical Performance of F-Score Strategies
The Piotroski F-Score has one of the strongest academic track records of any stock screening methodology:
- Original study (1976-1996): A long-short strategy buying high F-Score stocks and shorting low F-Score stocks produced approximately 23% annual returns.
- Out-of-sample testing: Multiple independent studies have confirmed the F-Score's effectiveness across different markets and time periods.
- International markets: The F-Score has shown positive results in European, Asian, and emerging markets — not just U.S. stocks.
- Small-cap stocks: The effect is particularly strong among small-cap value stocks, where information asymmetry is greatest and financial health screening adds the most value.
The persistence of the F-Score's performance across decades and geographies suggests it captures a genuine economic relationship — financially improving companies tend to outperform financially deteriorating ones — rather than a temporary statistical anomaly.
Limitations of the Piotroski F-Score
| Limitation | Explanation | Mitigation |
|---|---|---|
| Backward-looking | Based on historical financial statements | Supplement with forward estimates and analyst consensus |
| Binary scoring | Each criterion is pass/fail — no partial credit | Build a weighted version for more nuance |
| Sector bias | Not designed for banks and financials | Exclude or use modified criteria for financial firms |
| Ignores valuation | High F-Score does not mean cheap | Always combine with valuation metrics like P/E |
| No momentum | Does not consider price trends | Add technical indicators or price momentum screens |
| Annual data lag | Financial statements are released quarterly but some items are annual | Use quarterly data where available via =hf_revenue() |
Frequently Asked Questions
What is a good Piotroski F-Score?
A score of 7 to 9 is considered strong, indicating that the company passes most or all of the nine financial health criteria. Scores of 8-9 are often called "high F-Score" stocks and have historically outperformed the broader market. 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, recalculation is instant — the =PitrioskiFScore() function automatically uses the most recent available data.
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 is one of the most practical, well-researched tools available for screening stocks based on financial health. Its nine binary criteria provide a clear, objective framework for evaluating profitability, leverage, liquidity, and operating efficiency — cutting through the noise of complex financial statements.
With MarketXLS, you can calculate the F-Score instantly using =PitrioskiFScore(), or build a fully transparent manual calculator using =Revenue(), =hf_revenue(), and =PERatio() to see exactly how each criterion is evaluated. Combined with valuation screening and other scoring systems, the F-Score gives you a disciplined, evidence-based approach to stock selection.
Whether you are a value investor looking for undervalued gems or a portfolio manager screening for quality, the Piotroski F-Score belongs in your analytical toolkit.
Ready to screen stocks with the Piotroski F-Score? Get started with MarketXLS and access the =PitrioskiFScore() function plus 1,100+ other Excel functions for fundamental analysis.
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.