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:
- Positive net income
- Positive operating cash flows
- Higher return on assets than the previous year
- Operating cash flows greater than net income
- Lower debt than the previous year
- Higher current ratio than the previous year
- Less stock dilution than the previous year
- Higher gross margin than the previous year
- 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:
- 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.
- No ADRs. Fundamental data for foreign American Depositary Receipt can include errors due to currency exchange, different accounting standards, and share count.
- 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.
- 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.
- Price > $1. True penny stocks are excluded due to various information issues and manipulation of these stocks.
- 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
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
* 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.
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?