Quantitative Momentum

That is the title of the latest book by Wesley Gray and Jack Vogel, of Alpha Architect. A nice review of the momentum field.

Of particular interest is their introduction of the hypothesis that the “path” a stock takes to gain momentum is critical to the return. Is it “smooth” (or continuous) or jerky (discrete). In short, the momentum stocks with more of a smooth path over the past 12 months perform far better than those with a discrete history. (Smooth stocks perform better because of the behavioral “frog in the pan” reaction of investors).

The concept was first published in this paper .

They calculate Information Discreteness (ID) as:

ID=sign(past 12 months return) *[% of negative days - % of positive days]

A stock with positive momentum and a large number of positive days will have a negative ID; vice versa for stocks having a large number of negative days.

So, to do this calculation on P123, we need to know that % of negative and positive days during the test period (12 months in this example).

Is this possible?

For % of +ve day, I think this should work; 100*((LoopSum("Close(CTR)>Close(CTR+1)",100)+ LoopSum("Close(CTR)>Close(CTR+1)",100,100)+ LoopSum("Close(CTR)>Close(CTR+1)",52,200))/252)

Complement the expression for % -ve days.

Walter

Thanks! I’ve not used LoopSum yet.

For the count of positive days during the last year, wouldn’t it just be:

LoopSum(“Close(CTR)>Close(CTR+1)”,252) ?

And the percentage of up days would be: LoopSum(“Close(CTR)>Close(CTR+1)”,252)/252 ?

I guess I’m not following the other components of the expression you provided.

LoopSum is limited to 100 iterations.

Well, alrighty then! Did not see that in the LoopSum reference…

The reference actually specs the iterations range as (2-50) and that’s incorrect.

Walter, I think the start and iterations values in the third part of your formula are swapped. Wouldn’t it be:

LoopSum(“Close(CTR)>Close(CTR+1)”,200,52)
?

I think I had it right. The intention was 52 iterations starting at an offset of 200 to finish the calculation.

Walter

You are right Walter. I misread the loop sum reference. Sorry about that!

I think it should be

100*((LoopSum(“Close(CTR)>Close(CTR+1)”,100,21)+ LoopSum(“Close(CTR)>Close(CTR+1)”,100,121)+ LoopSum(“Close(CTR)>Close(CTR+1)”,31,221))/231)

the paper suggest that the last month shouldn’t be part of the “formation period”.

results are disappointing - it seems to be a weak effect

It is not clear to me how you are testing this rule as my output using it makes to sense. When I use the rule below in the screener:

52wk return * ((LoopSum(“Close(CTR)>Close(CTR+1)”,100)+ LoopSum(“Close(CTR)>Close(CTR+1)”,100,100)+ LoopSum(“Close(CTR)>Close(CTR+1)”,52,200))/252)>52 wk return.

I get 327 stocks as a result yet 52 wk return * fraction(formula above) > 52 wk return should give me an output of zero stocks.

Please let me know how to fix this or if this is a problem with the screener.

Thank you.

Some 52W returns are negative.

Good point that I shouldn’t have overlooked. Thank you for the help.

Sorry my lazyness, could somebody post the results? That would be great, thank you…

I created a public ranking system “quantitative momentum” with the a 50%/50% weight on price performance and path-smoothiniess. The book states that you should first rank according to the 12 month price performance, then take the best 100 stocks and rank those according to the smoothness of the path. I did not know how to do this in P123, so this maybe this might be a factor, which makes this more successful.

Link to Screener: https://www.portfolio123.com/app/screen/summary/176091?st=3&mt=1

The effect does not seem to exist the last 5 years, it had a negative Alpha. This was also mentioned in the book, although they state if you equal-weight the portfolio of 50 (rebalancing every 3 month) you should get a positive Alpha in this time period as well. I was not able to achieve that. A backtest from 1999 confirmed that over the very long run the effect exists / existed.

My take: the screener / ranking system by itself does not help much. But I noticed in other successful ranking systems, that the effect of the last month performance is negative correlated to its future success (reverse engineer shows also that this factor is more valuable). This might be something to consider in the future.

The formula for the ID is (in my opinion):
((Close(21)/Close(273)-1) / Abs((Close(21)/Close(273)-1)))*(((LoopSum(“Close(CTR)<Close(CTR+1)”,100,21)+ LoopSum(“Close(CTR)<Close(CTR+1)”,100,121)+ LoopSum(“Close(CTR)<Close(CTR+1)”,31,221))/231) - ((LoopSum(“Close(CTR)>Close(CTR+1)”,100,21)+ LoopSum(“Close(CTR)>Close(CTR+1)”,100,121)+ LoopSum(“Close(CTR)>Close(CTR+1)”,31,221))/231))

The first part is the sign(12 month return). What is meant by sign is that one must only take the “-” or “+” of the 12 month return. I had to get back to the article to understand what they meant by this :wink:

Let me know if somebody finds something interesting.

Max,

I would not rely too much on such observations. Like many other technical approaches, this one might have worked for a given time or market circumstance. Most importantly you need to combine momentum with other factors, otherwise you will not get a great screener result.


I’m fond of combining high(er) momentum with low(er) volatility. To do that I usually use the quality minus junk strategy. For a buy rule that would look like;

FRank("atrn(20,0)",#All,#Asc)>15

Combining momentum with other technical and fundamental factors does seem to work. Soon you will be building high annalized return models. The real trick after that is getting decent average return per trade. :wink:

Walter