These ratios were derived by Joseph Piotroski, who used a linear regression of them to determine the odds of company failure. He, and others, determined that small cap value stocks could outperform if filtered on Piotroski score.
It seems to.
According to Value Investing: The Use of Historical Financial Statement Information to Separate Winners from Losers, 2% of the companies considered in his paper with the highest Piotroski score delisted for performance reasons, while 7-10% of the firms with Piotroski 2 or lower did. That seems a pretty big difference. Equities Lab does not have performance based delisting, so we count the number of firms that lost more than 80% of their value within one year after matching, and call that “faceplanting”. For firms that delisted, the last available price was used as the value.
Your stock faceplanting isn’t the same as being it being delisted, but is still traumatic to endure. You should also check the odds that the stocks will catapult upwards (80% gain in one year), and that they will rocket to new heights (500% gain in one year). If an investor has a portfolio of two stocks, one of which faceplants, and one of which catapults, the investor neither gains nor loses money. If an investor has a one stock portfolio for two years, and it faceplants the first year, it would need to rocket upwards the second year to get the investor back to even.
The next three images answer the question of how predictive the Piotroski score is for faceplanting, catapulting, and rocketing off to new heights. The first image is all investable stocks, regardless of Piotroski score, and shows that 5% catapult, 2.5% faceplant, and about than .08% rocket upwards. The rest didn’t perform exceptionally in either direction.
For high Piotroski score companies, there are many fewer faceplants – only 0.4%. There are also very few rockets — .01%. But there are almost as many catapulting companies (4%). Perhaps it is not surprising how well high Piotroski companies do.
Low Piotroski companies, on the other hand, have more rockets — .16%, but double the number of faceplants that all companies do, at 5%. These companies are no more likely to catapult upwards, as that average is still 5%. Buying them is like buying lottery tickets: possibly fun but not profitable.
The chart below shows the backtest of each Piotroski value, from 0 to 9. It sure looks like the higher values do better, and the lower ones worse. That said, there are lots of little lines there.
The bar chart tells a stark story of improving performance by Piotroski level. In other words, whether presented in a chart or a graph, the higher the Piotroski value, the better the stock does, on average. As an exception, the zero Piotroski value does better than the one value, which probably means that something funky is going on.
WARNING: Piotroski has not been as predictive in recent markets as it was in the past. If you used 2016-2021 as a guide, and ignored any older data, it seems like the 0 and 1 levels are predictive of bad performance, and that’s as far as it goes. The 2 value screen defeats everything else.
Apparently declining Piotroski is good for a stock. Although this seems absurd, this makes sense when you consider the choices available to a stock with a Piotroski score of 9. It can stay the same, go down a little, or go down a lot. Conversely, a Piotroski 0 stock has nowhere to go but up.
An attempt to fix this by weighting the current Piotroski twice as much means that the range goes from -10 to 20. It also makes it much more predictive of future returns.
A final plot where the change is just a 1/10 modifier to the current score allows us to see how each Piotroski score behaves, based on where it came from.
Aside from a few puzzling spikes, the closer both the current Piotroski and prior Piotroski are, the better the performance is, with a small increase being best. And, of course, the higher the score, the better.
Momentum is past stock performance, which is also important in determining future stock price. Separating out performance by Piotroski, and by Momentum, where yearly performance less than -5% gets 0 points, anything between -5% and 15% gets 10 points, and anything over 15% gets 20 points. Using high, medium, and low momentum, we split the Piotroski scores into three groups. Each ten items is a copy of the Piotroski score for that subset.
Apparently more momentum is better, but Piotroski works regardless.
Using the simplest interpretation of value (Price to earnings), and choosing four sets of values: under 5, 5 to 20, 20 to 60, and over 60, it seems that Piotroski works everywhere except when the P/E is over 60.
Morningstar breaks its equites down in to sectors as follows:
Taking on the top level divisions first, with this term:
Piotroski seems to work well with all three types of companies. For the defensive ones, firms with a Piotroski of zero seemed to do surprisingly well, but that’s the only thing of note, other than that the zero Piotroski companies in the sensitive sector managed to lose more than 99% of their value. Ouch!
A summary of how well Piotroski did per sector is below. The concept of swap distance is used to describe how well each sector did. If the values were already in order, then no edits are needed. Otherwise, we count (approximately) how many swaps are required to put the values in order.
We divide the market performance by segments:
Then we test each Piotroski score in each segment, and we get the graph below. Studying it, we see that middling Piotroski was better when the market had recently done badly, but all the higher Piotroskis are pretty good.
Note you can’t use this chart to decide that certain markets are better or worse for stocks overall, as we don’t know how many market days are in each bar.
The Piotroski turns out to be a good scorer. In order to use it for maximum effectiveness, it can be used alongside other scorers such as momentum, market performance, sectors, and stock performance. The score is very robust when used in a wide variety of situations, so get out and Piotroski!
1 Comment
I am trying to add ((close – close as of 1 day ago) + (close as of 1 day ago- close as of 2 day ago)) and get the below error.
Unit_cheat and set its value to true.
Please advise