Piotroski F-Score Backtest

The Piotroski F-Score is an advanced compound fundamental analysis strategy developed by Joseph D. Piotroski. Piotroski detailed this strategy in his 2002 academic paper, “Value Investing: The Use of Historical Financial Statement Information to Separate Winners from Losers.”  The F-Score gives stocks one point for passing each of the following simple accounting-based fundamental tests:

  1. Positive net income
  2. Positive operating cash flows
  3. Higher return on assets than the previous year
  4. Operating cash flows greater than net income
  5. Lower debt than the previous year
  6. Higher current ratio than the previous year
  7. Less stock dilution than the previous year
  8. Higher gross margin than the previous year
  9. Higher asset turnover than the previous year

As you can see from this list, the highest F-Score a stock can receive is 9 if it passes all the above tests. The use of previous year data actual refers to comparing the current trailing twelve months versus the year ago trailing twelve months data from the income statement or statement of cash flows. If it was a balance sheet item, the F-Score compares the current quarter number to the previous year quarterly number.

A major difference in how I am testing the F-Score and how Piotroski designed his strategy is that I’m not testing how the F-Score works for low price-to-book value stocks versus high price-to-book value stocks. I will likely test that combination of F-Score and P/B ratio in a future backtest, but I want to just stick to looking at the F-Score alone in this backtest.

Let’s take a look at a backtest of Piotroski F-Score to see how it works. I used the data and backtesting tool provided by Portfolio123. The Portfolio123 backtesting eliminates the problem of survivorship bias by using point-in-time and retaining data on stocks that have gone to zero. This backtest uses the same filtered universe of stocks as my recent Price to Sales Ratio Backtest. I’ve designed the filtering criteria for this backtest specifically for individual investors and with a focus on enhancing data quality. The filters include the following criteria:

  1. No OTC stocks. Stocks not traded on the New York Stock Exchange, NASDAQ, or American Stock Exchange markets are excluded. The quality of fundamental stock data for OTC can be somewhat lower and less timely that that for stocks traded on major exchanges.
  2. No ADRs. Fundamental data for foreign American Depositary Receipt can include errors due to currency exchange, different accounting standards, and share count.
  3. Liquidity test. The average daily total amount traded over the past 60 trading days must be larger than $100,000.  This amount was selected so that a $1 million dollar portfolio could hold 100 positions and that each new $10,000 position would not exceed 10 percent of a day’s trading volume. The liquidity test also ensures that the backtest has reliable market price information for any of the stocks that are being tested.
  4. Market Cap > $50 million. Nano cap stocks are excluded to help improve data quality. This filter also ensures that positions in a modest sized portfolio never exceed one percent of shares outstanding or the available float for a company.
  5. Price > $1. True penny stocks are excluded due to various information issues and manipulation of these stocks.
  6. F-Score  != NA. This filter insures we are looking at stocks that actually have valid Piotroski F-Score.

After these filters are applied, we are left with approximately 3,300 to 4,400 stocks. These stocks are then ranked by the criteria being tested; in this case, we are testing the Piotroski F-Score. The lowest 20 percent of stocks ranked by F-Score are placed in the first quintile and the next 20 percent in the second quintile and so forth until we have five portfolios of stocks. The portfolios are rebalanced every 12-months and compounded annually to more realistically replicate what an individual investor might be expected to do to avoid higher short-term capital gains tax and trading costs. The following 5 charts display the quintile returns for the Piotroski F-Score in red and the S&P 500 Equal Weight Index in blue.  The first quintile includes the companies that had the lowest F-Score and the 5th quintile includes the companies that had the highest F-Score.

Piotroski F-Score Quintile Returns – 2000 – 2014

Piotroski F-Score 1st Quintile
Piotroski F-Score 1st Quintile


Piotroski F-Score 2nd Quintile
Piotroski F-Score 2nd Quintile


Piotroski F-Score 3rd Quintile
Piotroski F-Score 3rd Quintile


Piotroski F-Score 4th Quintile
Piotroski F-Score 4th Quintile


Piotroski F-Score 5th Quintile
Piotroski F-Score 5th Quintile

I noticed there was a strange issue with the 3rd quintile backtest for the F-Score.  There appears there weren’t any stocks in that bin for 2013. I’m think that was some sort of glitch that I’ll have to look into further.

Summary of Results for the Piotroski F-Score Backtest

Backtest Results for Piotroski F-Score (2000 - 2014)
15-year Backtest Results for Piotroski F-Score

* Average excess returns were analyzed starting in each month with 12-month holding periods (197 sample periods). This avoids the potential for seasonal reporting bias.

Piotroski F-Score Excess Returns by Quintile chart
Average annual excess returns from 2000 to 2015 for the Piotroski F-Score

This backtest for Piotroski F-Score reveals that the first quintile underperforms the S&P 500 Equal Weight Index benchmark. These companies typically weak balance sheets and weak earnings performance so it is not surprising that stock returns for these companies would underperform. The second through fifth quintiles have higher than average annual excess returns than each of the previous quintiles. I like that there was a consistent linear trend upwards from the 1st to 5th quintiles. The Piotroski F-Score does appear to be a powerful fundamental predictor of 1-year stock performance.

It would also be interesting to see how the results of the 5th quintile break out.  The median F-score for the 5th quintile is 7 and that quintile had average annual excess returns of 4.75% as compared to the S&P 500 equal weight index.  If I just look at F-Score 9 stocks, the average annual excess returns jumps to 9.07%, but the average portfolio size is only 34 stocks. Nevertheless, the results are impressive. Combining this quality score with a stock valuation fundamental, such as PE or EBIT/EV ratio, would likely result in even higher average annual excess returns.

What are your thoughts the Piotroski F-Score? Do you use the Piotroski F-Score or some variation of it in your own stock analysis?

15 thoughts on “Piotroski F-Score Backtest

  • February 6, 2015 at 8:33 pm

    Since there are only ten discrete values of Piotroski scores, I’m not sure quintiles are a very good way to break up the data. What type of distribution do the values have? Certainly not equal counts of stocks at each of the ten values. Are there few 0’s and 9’s, but a lot of 5’s?

    What will make sure the same stocks end up in the same quintile on each backtest run?

    Without any other filters, I find the current distribution on P123 to be almost a normal distribution (bump in the middle with fewer outliers):

    9 = 31
    8 = 248
    7 = 646
    6 = 927
    5 = 1142
    4 = 1082
    3 = 890
    2 = 771
    1 = 569
    0 = 398
    All 6704

    I would suggest grouping them as 0, 1, 2&3, 4&5, 6&7, 8, and 9. That separates out the outliers and groups together the more or less homogenous (and neutral?) middle groups.

    Another thing that might be of interest is how each of the nine individual scoring factors performs.

    Did you find any stocks with invalid F-Scores? I didn’t see any on a screen of current data. That concerns me, because I wonder how they dealt with invalid data that goes into its computation.

  • February 6, 2015 at 10:35 pm

    Seeing performance by each score makes sense for strategy evaluation purposes but targeting a quintile is a better representation of how a portfolio would be executed. Portfolio size is likely to be a constant over the life of a strategy.

    Top Decile – Bottom Decile looks like an excellent long-short strategy (or top 30 – bottom 30). Would be interesting to see that – it’s interesting that volatility is more or less uniform across the distribution.

    Also, it was mentioned invalid F-Scores are discarded.

  • February 7, 2015 at 4:34 pm


    Thanks for sharing your insights. I use the F-Score a lot and I think it is a great tool for building a portfolio and “timing” positions. I have a few stocks I would like to own, they trade at attractive multiples but have weak F-Scores. Those I wait and follow up each quarter to see if the F-Score has gotten stronger.

  • February 9, 2015 at 11:55 am

    Would it be possible to do a forward test? Based on F-score of the stocks back in 2000, and see how that ends up?

  • February 9, 2015 at 12:01 pm

    Brian – The backtest looks at what a stock’s F-Score was on 1/2/2000 and determines that stocks return as of the end of 1-year, approximately 12/31/2000. Then a new portfolio of stocks are bought on 12/31/2000 and they are sold 1- year later until we get to 12/31/2014. That’s the only way I think I can properly test the fundamental I’m examining.

  • February 13, 2015 at 1:32 am

    Interesting backtest George.

    The Piotroski F-Score indeed seems to work not only with low PB companies, we tester in on European companies here:

    In a masters paper a freind tested it on growth companies also with good results. A summary and copy of the research paper is available here:

  • August 17, 2015 at 3:26 am

    I have not done any scientific back test but i have personally experienced benefit of paying to this score while investing in Indian stock market. For last few years i do pay attention to this score. I often invest in deep value stocks which are experiencing some glitch. The price is usually fallen like 40-50% minimum from high. Often these are small caps. I want to make sure I am not buying into value traps. F-score happens to be one of the checks I use.

  • November 10, 2015 at 8:56 pm

    So, can you use the F-score to see when to sell?

  • April 13, 2016 at 3:45 am

    Deborah a subscriber recently suggested that you can use the Piotroski F-Score as a fundamental stop loss indicator.

    He got the idea from an article where Warren Buffett mentioned that he did not care what happened to a company’s share price as long as operationally the company was still doing well.

    You can thus use the F-Score to see if a company is deteriorating fundamentally. For example sell when the F-Score falls below 5.

    You can read the whole article here: Ever thought of using a fundamental stop-loss?

  • August 28, 2021 at 9:13 pm

    Very interesting backtest on the piotroski number. I saw you also did a backtest fir the price to free cash flow. I was wondering what the outcome would be to screen the piotroski 8 & 9 stocks for the smallest price to free cash flow ratio.
    What are your thoughts?

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.