Help needed with steady growth in a rank.

Yes, I agree.
Sales growth does not work well. It is not necessarily directly related to earnings growth.

I beg to differ. The best growth stories are not concerned with earnings. Attached is a four-factor ranking system with 3 of 4 factors specifically targeting sales. The target universe is the constituents of SKYY. RS performance for last 5 years. Note that this is a more recent RS than what I offer with the Cloud Computing DM. https://www.portfolio123.com/app/r2g/summary?id=1439560


I meant Uval’s 7-year trend formula with Sales does not work well.

Possibly because it is a linear trend, not a growth formula. It would be interesting to try on earnings however in order to by-pass the growth-related issues with earnings i.e. companies with no earnings can’t “grow” earnings. The slope may overcome the divide-by-zero issue with earnings growth… just a thought.

SteveA

Captain Obvious (Walter’s) trend formula based on RoE% works well:

LoopSum(“RoE%(3+CTR,ANN)*(-CTR)”,7,-3,1)

Before you get too excited about this, you might want to consider what you are actually testing. Lets start by rewriting the formula to be somewhat more comprehensible. I get dizzy just looking at it as is. I think the following is the same so please correct me if I’m wrong:

LoopSum(“RoE%(CTR,ANN)*(3-CTR)”,7)

7 years is a long time and many of the best opportunities haven’t been around that long. One obvious thing of note is that this formula has age discrimination. Companies with more than 3 years of history get punished. In order to effectively determine whether this formula has any benefit whatsoever, you need to compare stocks of similar age i.e. create a universe of stocks that have been around for 7 years, then test the results. You should really consider changing from an annual (ANN) calculation to a quarterly (QTR or TTM) and shorten the timespan down from 7 years to a few years, which makes the formula more inclusive. Keep in mind that there is still age discrimination so you still need to create a custom universe of stocks that have a complete history for the timespan.

Thanks,
SteveA

LoopSum(“RoE%(3+CTR,ANN)*(-CTR)”,7,-3,1) is proportional to the slope of the linear regression line and it works my shifting the dataset to straddle the x-axis zero point - i.e. the sum(xs)=0 makes some terms dropout. If you want to shift the data points back, you’ll need to add back other terms needed to calculate the L.R. See Yuval’s original post.

As for seven years being a long time, that’s sometimes the point. Some strategies, like Dividend Aristocrats, are based on long-term company characteristics. Exploring that investment space may be profitable.

A practical modification would be to enable noNAs; LoopSum(“RoE%(3+CTR,ANN)*(-CTR)”,7,-3,1,True)

Now companies with less than seven years of data will return NA and one could then use isNA to decide how to best fall-back.

Walter

It is not the same. You are missing the current year: “RoE%(0,ANN)3"
and have additionally "RoE%(7,ANN)
-4”

Also, the assigned x’s have to add up to zero. The x’s in your formula add up to -7; so you are not getting the slope of the linear regression line at all.

If one only wanted to consider 5 years instead of 7 years, then the formula representative of the slope of the regression line is
LoopSum(“RoE%(2+CTR,ANN)*(-CTR)”,5,-2,1,true).
Works very well with the “true” additional term, at least for large cap sim.

Seems like a lot of mathematical gyrations in an effort to help solve a question that lends itself, not to math, but to fundamentals.

First things first: Ranking systems are sorts, so their natural use it to search for the best or worst values. Trying to use a ranking system to search for modest and steady is like trying to sweeten coffee with salt. You should b doing this entirely with screening rules and using ranks for other aspect of the strategy.

Once you realize you’re not trying to rank, the possibilities become clear. At its simplest, you could do something like Between (Sales5Y, 8, 12) or something like that. Or instead of using numbers, you could use relative references so modest can be redefined every year based on business conditions. For example, Between(Sels5Y, FMedian(Sales5Y,Universe) *.8, FMedian(Sales5Y,Universe) *1.2), etc. etc. etc.

Steady is trickier. You could math up and play with slopes, changes in sloes, standard deviations etc. but if you look at companies you uncover, you’re likely to wind up chasing your tail as you constsntlly see patterns you didn’t think of. So let’s step back and start again.

I expect you aren’t REALLY REALLY looking for companies that have track records of slow steady growth but are actually looking for companies that are more likely than not to exhibit slow steady growth in the future. The past may be relevant, or it may not since wierd things always happen; the best we can do is play probabilities.

If you want slow steady growth, you are likely to be building a sector bias into your model since certain kinds of sectors are more likely to have steady moderate growth than others. So perhaps you should give some though to sectors to eliminate or focus on and build a screen or universe based on this. That alone will get you a lot closer to your goal than all the headache producing stuff I’ve seen in other posts.

If you really want to stay sector neutral, you can screen for fundamentals that suggest a steady business. Look for companies for which interest expense, SGA are low as a % of sales. Look for steadiness in ROA and, perhaps ROA that is not extremely high or low relative to industry or sector norms since extremes tend to correct, although over lengthy periods. (I get that the initial post talked in terms of sales and that here, I’m going lower on the income statement: Don’t get hung up on sales vs earnings. I think what you’re really looking for is slow and steady businesses. Use that as a starting point an then pull in whatever data items that can hep you get where you want to go.)

You can even play around with stock price trends to give you clues. Beta is the natural first choice when somebody thinks of steady vs volatile, but don’t underestimate the usefulness of the standard deviation of returns. If you want steadiness, you probably prefer to have steady as a function of the company’s business and don’t necessarily care deeply about covariance to the market. Or use both: The Core: Loe Volatility ranking system was created a while back by Riccardo. It combines Beta dn Stand Dev. I’m not sure how useful it is as a ranking system per se, but it can serve you well as a screening rule: Rating(“Core: Low Volatility”) > X (Higher scores mean a greater history of steadiness). Its even better if you combine that sort of screening rule with others addressed to fundamentals.

Pfff. Ranking is too powerful to leave unused and works perfectly well for finding mid-range values. A well known technique is to make the ranking function a difference to some target value and then rank with “lower is better” on the absolute value of that difference;

abs(Sales5YCGr%-FMedian("Sales5YCGr%",#All)) // Sales5YCGr% near Universe median rank higher

or;

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

or, if want a little more than average sales growth, compare the ZScore to one. That prefers stocks that have sales growth near one standard deviation above average;

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

Try substituting #Industry for #All, too.

No more than high school math is needed.

Walter

Georg - you are incorrect regarding your math. The formula LoopSum(“RoE%(3+CTR,ANN)*(-CTR)”,7,-3,1) starts with CTR=(-3) and ends with CTR=(+3).

Therefore, LoopSum(“RoE%(CTR,ANN)(3-CTR)",7) is the same as LoopSum("RoE%(3+CTR,ANN)(-CTR)”,7,-3,1), only much easier on the eyes.

SteveA

Walter - I believe the formulas are identical. See my previous post.

It still presents age discrimination. As long as you understand that it is not a universal rule, and that there are biases…

Yes Steve is correct. CTR starts at zero. Let’s write down each element of the loop.

Your formula: LoopSum("RoE%(CTR,ANN)(3-CTR)",7)
1.) RoE%(0,ANN)
(3-0) = RoE%(0,ANN)3
2.) RoE%(1,ANN)
(3-1) = RoE%(1,ANN)2
3.) RoE%(2,ANN)
(3-2) = RoE%(2,ANN)1
4.) RoE%(3,ANN)
(3-3) = RoE%(3,ANN)0
5.) RoE%(4,ANN)
(3-4) = RoE%(4,ANN)-1
6.) RoE%(5,ANN)
(3-5) = RoE%(5,ANN)-2
7.) RoE%(6,ANN)
(3-6) = RoE%(6,ANN)*-3
Sum of the x’s = 0

Walter’s formula: LoopSum("RoE%(3+CTR,ANN)(-CTR)",7,-3,1)
1.) RoE%(3-3,ANN)
(3) = RoE%(0,ANN)3
2.) RoE%(3-2,ANN)
(2) = RoE%(1,ANN)2
3.) RoE%(3-1,ANN)
(1) = RoE%(2,ANN)1
4.) RoE%(3-0,ANN)
(0) = RoE%(3,ANN)0
5.) RoE%(3+1,ANN)
(-1) = RoE%(4,ANN)-1
6.) RoE%(3+2,ANN)
(-2) = RoE%(5,ANN)-2
7.) RoE%(3+3,ANN)
(-3) = RoE%(6,ANN)*-3
Sum of the x’s = 0.

Both formulas are representative of the slope of the linear regression line, if one cares to check the original formula for the slope. This is mathematically the only correct way, the x’s must add up to zero, otherwise you get nonsense.

Pfff? Pfff to what? Pfff to trying to solve the guy’s bona fide and quite reasonable investment goal? Or Pfff to refusal to twist one’s self into a pretzel to shove a round peg into a square hole?

Yes, ranking can be used for anything. But just because something can be used in a particular context doesn’t mean it’s always the best solution. Ranking by itself is quite limited and its usefulness is limited to the degree one can be confident that #1 is truly better than #2, that #2 is truly better than #3, that #3 is truly better than #4, etc. When we rank objectively observed phenomenon with the intent to learn what actually is, that’s great. But when we rank as a tool to help us make choices about the unknown future where we cannot be sure the future will replicate the past, then ranking becomes just another approximation the usefulness of which depends on how confident one is in the predictability of the model.

So anything one can do to enhance predictability is for the better. And a great way to do that is via less naive model design. Example: (1) the lowest P/E ratios with a universe, or (2)the lowest P/E ratios in a universe pre-filtered to eliminate shares of companies likely to deserve low ratios (maybe even deserve lower ratios than we now see) due to poor fundamental prospects. This is not a rhetorical question: There is only one correct answer, and it’s #2. A choice to simply apply ranking to a universe asa whole is not even good quant or good statistics . . . sample design is an important area and often the biggest sample is not a good one as there are other techniques.

Portfolio123 certainly can be used to show off one’s rank-creation prowess and one’s proficiency in factor gymnastics. But if one is looking to use Portfolio123 to help find good real-world investment ideas, the biggest mistake I’ve seen users make year after year after year is to go ga-ga over everything they can do with rank creation and neglect the tremendously vital aspect of filtering/screening. That is often the difference between a model that shows up magnificently in backtests versus one that works with real money.

It is wrong to say Pfff when one points out an instance in which a problem that is posed can better be solved by filtering than ranking, especially as here, where the user’s goal is so easily solved by screening rules that limit eligibility to or mandate exclusion of particular sectors. After all, the user did present an extremely reasonable and solvable investment question. He didn’t pose a challenge to a grad school math seminar.

Rank all you want. But you help nobody when you Pfff-off other solutions.

There is nothing wrong with using math. The discussion here is to find the trend of Sales, RoE%, or some other factor over time. For example, if one considers the 7 year history of RoE% of a stock then one can do a linear regression of the variable (RoE%) versus year (x).

For ranking we are only interested in the slope of the linear regression line, steeper is better (rising trend). The math is clear, and it makes perfect sense. Thanks, Yuval and Walter for formulating this in P123.

I don’t see why this lends itself, not to math, but to fundamentals. The formula of the slope of the regression line is not that difficult to understand if one has some basic knowledge of algebra.

Pfff for not recognizing how powerful and appropriate ranking is for this kind of problem.

Isn’t the same true for screening? You set ranges for Sales5Y and doesn’t that imply that values within the range are “better” than those outside? In my experience good results are achievable via very simple screening factors and more comprehensive ranking systems In practice, I only screen out sector/industries within a universe and unless I’m 100% sure I don’t want some characteristic, I use ranking. Ranking is a key and vital P123 component and understanding it is critical for success. Tool proficiency is not a bad thing.

In this case, ranking works and the solution is simple if one recognizes the solution pattern.

Walter

Georg - CTR starts at ZERO (0) not ONE (1). Hence the formulas are the same.
Steve

I’d like to weigh in on this.

I created a screen with a strong focus on sales here: https://www.portfolio123.com/app/screen/summary/232654?st=1&mt=1

This screen has six sales-related rules (the first three rules more or less define the universe). The first of these focuses on the overall 7-year sales trend. I think it’s a good screen, with a lot of helpful material both in the rules and in the “Info” write-up of those rules. If you really want to understand what has worked when looking at sales, this is a good place to start.

One could, if one wanted to, adapt each of these rules into a ranking node.

3Sales(0,Ann) + 2Sales(1,Ann) + Sales(2,Ann) - Sales(4,Ann) - 2Sales(5,Ann) - 3Sales(6,Ann) [higher better]

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

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

(Sales(0,Ann) + Sales(1,Ann) + Sales(2,Ann)) / AstTotTTM [higher better]

Pr2SalesTTM [lower better, in industry]

GMgn%TTM - GMgn%TTMInd [higher better]

That said, many of these rules work better in a screen than in a ranking system. They were designed for a screen, after all.

Personally, I prefer to use ranking over screening in general for reasons I laid out in the following article: https://seekingalpha.com/article/4083828-paradox-of-stock-screening

But while I believe screening has more pitfalls than ranking and that cleverly designed ranking can do almost anything screening can do, screening is far simpler to understand and should definitely be the first thing users should master. Jumping into ranking without trying screening first is like learning to swim in the deep end.

Moreover, there are some things that SHOULD be Boolean (Boolean means either yes or no, no ranking, like screening rules). For example, the “sales trend” rule in my screen probably works much better as a Boolean rule than as a ranking rule, and I wouldn’t be surprised if any of the others do too. It depends on what you’re looking for. You can use Boolean rules in a universe, a screen, or a ranking system.

Lastly, I don’t think we should get too dogmatic about this. Screening alone can work very well–especially if you’re using it as a first step to find stocks to research. Ranking alone can work very well, and the combination can work very well. That flexibility to use whatever system you want is what makes P123 the best web-based service for investor research.

You are correct - my mistake. I have amended my previous post above accordingly.
Thanks.