Help needed with steady growth in a rank.

Ok, I think I see what you’re saying; the “benefit” of a factor may not be linear to the value of the factor. In the ranker, if higher is better, higher factor values may not always work as well as lower values.

I think a good example of that would be PayRatio. To avoid the consequences of a dividend cut, many investors avoid companies with high payout ratios. But, if one believes that one of the benefits of a dividend policy is to instill corporate fiscal discipline, then the payout ration shouldn’t be too low. So some middling value seems appropriate. That kind of setup is easily expressed in the ranking systems as;

abs(Yield-FMedian("Yield",#Industry)) // rank as lower is better

This looks like a 2nd order kind of solution to me. So we can use factors with both 1st order (linear) and 2nd order outcomes for ranking.

Adding to Yuval’s screen two rules based on linear regression slope improves return by a lot:
LoopSum(“RoE%(CTR,ANN)(2-CTR)",5,0,1,1) < LoopSum("RoE%(CTR,ANN)(3-CTR)”,7,0,1,1)
LoopSum(“Sales(CTR,ANN)(2-CTR)",5,0,1,1) < LoopSum("Sales(CTR,ANN)(4-CTR)”,9,0,1,1)

Backtest from 1/1/2004:
Original screen: annualized return= 19.75%, Sharpe= 0.83
Adding 2 rules : annualized return= 24.15%, Sharpe= 0.96

So I have to make an objection here. Let’s start with rule #1:

3Sales(0,Ann) + 2Sales(1,Ann) + Sales(2,Ann) - Sales(4,Ann) - 2Sales(5,Ann) - 3Sales(6,Ann)

This rule is improper because it is not normalized. Higher sales wins. PERIOD. This is a serious problem unto itself. And then as I said before, this formula has age-bias. Either stocks with more than 4 years of data are punished, or stocks with less than 7 years of data are N/A’ed. In either case, it is problematic for a general screen.

Rule #2:

Abs (FRank (“Sales%ChgTTM”, #Sector) -50) [lower better]

High level of sales is punished, along with low level of sales. The original intent of this thread was smoothness. I’m not sure why the highest sales are punished? Why is that??

Rule #3:

LoopAvg(“Abs(Sales(Ctr,Qtr)-Sales(Ctr+1,Qtr))/Sales(Ctr,TTM)”,10,0) [lower better]

High level of change in sales is punished. Again, why is that?

Rule #4:

Pr2SalesTTM [lower better, in industry]

This is applicable to value screens only. Smooth growth is most applicable to SaaS or other high growth industries with stocks typically having high P/S ratio, not value stocks with low P/S ratio.

Rule #5

GMgn%TTM - GMgn%TTMInd [higher better]

While this is generally a reasonable rule, it is not universal. There are some exceptional stocks with low level of gross margin.

So instead of all this gobbledy-gook, you could just apply the rule as I provided it: LoopStdDev(“Sales(CTR,TTM)/Sales(CTR+4,TTM)”,12). This rule delivers the desired result. You do want to add a growth rule to block negative growth stocks.

Take care all
SteveA

I’m not denying that ranking CAN be used to solve this kind of problem (and stop humiliating yourself by Pffing me for supposedly not knowing what ranking can do; I’ve been working with stock ranking for 40 years now and have a very sharp BS radar), and you folks are working hard to show that it can be done.

Nor am I denying that one can travel from Las Vegas to Los Angeles by heading east (head toward the Atlantic coast, cross the Atlantic Ocean, pick a route that crosses Europe or Africa, and then traverse Asia and catch a flight from Hong Kong (if the airport is functional) or Tokyo or Seoul to LAX. Yes, it can be done. Personally, though, I’d rather head south and then west on I-15 and get to LA in just a few hours, or tke a westbound flight and get there even faster.

Yes, ranking is powerful (but not nearly as powerful as it can br if you can ditch the dogma long enough to run it against better-conditioned universes). And yes, you can do all sort of neat stuff. So my message is, that as you metaphorically travel from Las Vegas to LA, enjoy the view as you prepare to land in NY to catch a connecting flight to Rome and beyond . . .

Getting back to a constructive discussion, I just wanted to mention that if you’re going to explore rankings like;

abs(ZScore("Sales5YCGr%",#All,5)-1) // Sales5YCGr% near Universe mean+1stddev rank higher, outlier trim is 5%

Please goto Research->Data Views and inspect the data distribution. It should look approximately Gaussian with a single mode and tails; Sales5YCGr% is a good example, Yield is not.

Walter