Inability to use Ranking Systems in Universes

Is there a workaround for the inability to use ranking systems when defining universes?

For example, I want to see how a particular Ranking System (say Price Momentum) works when I eliminate the the bottom 50% of stocks according to another Ranking System (say Earnings Quality). The ideal solution here would be to define a Universe using the statement Ranking(“Earnings Quality”) > 50, and run my Price Momentum Ranking System on that universe. However, I can’t do this. Are there any alternatives? Is it possible to structure a “hierarchical” ranking system that does the same thing?

Thanks!

If your screening requirements are simple you can use FRank(“…”) in the custom universe.
Steve

With “rating” being a command that can only be used in screens and simulations, I believe that there’s no good workaround. I thought perhaps one could create a conditional node in a ranking system to allow you to do this–for instance, you could have the node be “rating(“earnings quality”)>50” and then have the false option go to NA by dividing by 0–but you can’t use “rating” in a ranking system. And, as you point out, putting the rating as a screen or buy rule will not result in a hierarchical re-ranking. You could see if you could use the new “Portfolio()” function as a conditional rule in a ranking system, but I doubt it.

I use certain earnings quality requirement rules in my universe to get around this, but it’s not an ideal solution.

I thought NodeRank was going to be deprecated but I think you could do much of this using NodeRank in a conditional node.

From the Reference:
“NodeRank() can be used to create dynamic ranking based on ranks of other components. For example by using the Conditional node you could select a different set of factors and weights if a component scores high or low. The node being referenced must be defined on top of the node that uses NodeRank().”

So the condition for the conditional node would be NodeRank (“Earnings Quality Rank Node”) > 50

Probably you would also put something like Eval(Rating(“Earnings Quality Rank”) > 50 & ‘Second Criterion’, …,…) in the buy and sell rules to determine which ranking system is operative for a given stock in the sim. But this would have the effect of ranking only a subset of your stocks in each of your conditional nodes: essential determining the universe that is being ranked.

Caution: Steve and Yuval know this stuff very well and I am probably missing something. Example, maybe I am right and NodeRank was deprecated but is still in the reference. I will try this myself when I have more time.

Not sure but maybe this helps.

-Jim

I tried that and I can’t seem to get it to work. See https://www.portfolio123.com/app/ranking-system/297192. The error message says “NodeRank functions must be placed below the referenced node,” but it is below the referenced node.

Thanks Yuval. I will look at this closer too when I get a chance. It would be useful if we could get it to work.
-Jim

NodeRank was not recommended for use with a port/sim as a buy rule. But as far as I know it is not deprecated from use in ranking systems. I hope not at least.

Jim - I have tried your suggestion many a time unsuccessfully. Conditional nodes just don’t work the way you would expect. They sort into a true and false path but the ranking algorithm has its own agenda. You might set everything in the false path to zero but the ranking algorithm might decide it should rank 98. So my advice is to forget that possibility and try to pre-screen at the universe.

Steve

Steve-Yes. I agree. I keep wanting to use conditional ranking systems but I can never quite get there.

I use conditional nodes all the time. They actually work much better for me than using “Eval.” My conditional rules are typically things like “universe($adr) = false” or “curfyepsmean != na” or “gics(40) = false.” So let’s say I want to rank non-financials on return on capital and financials on return on equity, but my formulae aren’t really comparable. If I use eval, one of the two are going to get all the high numbers. If I use the conditional node, though, the weighting is great. Similarly, if I have a ranking system based on volume or short interest, ADRs are going to give me much lower numbers than they should, since the only data we have is the volume or short interest in the US. Conditional nodes are great for these sorts of situations.

Yes Yuval - but they aren’t great for excluding stocks from being ranked. That is where I seem to have the problem.
Steve

Gents,

I found a relatively simple way to implement more complex ranking systems within a universe. Figured I would post it here in case it helps anyone out. Say for example I have a ranking system called Earnings Quality which contains four nodes, I can recreate the results of that ranking system by using 4 Franks and combine their results by Averaging them. The result of this average can be passed through another FRank to get an aggregate ranking. Code is shown below

setvar(@TA2TARank,FRank(“$TotalAccruals2TotalAssets_TTM”,#Previous,#ASC))
setvar(@NOAChgRank,FRank(“$NetOperAssets_PercentChg_TTM”,#Previous,#ASC))
setvar(@TA2AARank,FRank(“$TotalAccruals2AvgAssets_TTM”,#Previous,#ASC))
setvar(@DEX2CEXRank,FRank(“$DepEx2CapEx_TTM”,#Previous,#DESC))
setvar(@AvgRank,Avg(@TA2TARank,@NOAChgRank,@TA2AARank,@DEX2CEXRank))
setvar(@AggRank, FRank(“@AvgRank”,#Previous,#DESC))

This might have been common knowledge for everyone, but was very helpful for me.

Cheers,

Daniel