The last 9-12 month would have been a good environment for trend following. I missed it as my trading strategies are heavily focused on mean reversion.
This post is about traditional trend following strategies and how to outperform those by looking at the global stock market health for timing entries and exits.
.
Background
So let’s start by looking at traditional trend following strategies first
- Buy and hold: the baseline to compare initial results
- Golden Cross: MA50 is crossing above MA200 and exit when MA50 < MA200
- Tripple MA: enter when MA5 and MA10 above MA20, exit when situation changes
- ROC200: Enter when ROC200>0 and exit when ROC200<0
My Dax data goes back as much as 1990, so my first day of trading is 01.01.91. All trades are done close/close without commission and slippage. Be aware that DAX is a performance index, meaning all dividends are reinvested.
Trend following in its purest form
.
Buy&hold performs almost as good as any of the strategies. However one would need to take some severe punches, e.g. up to a 72.7% draw down. Among the strategies chosen there isn’t a clear winner as you can see. In average all return about 8% in annual return in a risk adjusted base it’s about around 13.5 The main difference is in the amount of trades a given strategies needs to make the returns. So far there aren’t any big news.
.
.
Let’s take a different twist to trend following
Let me first explain my thoughts: I’m a firm believer that the global stock markets have become increasingly correlated:
” It’s all ONE trade “
If so, can we measure the healthiness of the world’s stock markets in order to time a trend following strategy? For simplicity reasons I’m not looking at every single stock market in the world: I’m looking at the most important ones and the ones I’ve got the data for. So I decided to look at the following indices
Asia
- Japan: Nikkei
- Australia: ASX
Europe
- Euro Stoxx 50
US
- SP500
- NASDAQ 100
For the entire test I did use the official cash index data (no ETFs). Unfortunately I don’t have historical data for emerging markets going back as much as 1990. Please let me know if you have! The simplest ( and commonly accepted) way to measure if a given index is in a bull market or not is the 200 days moving average. For simplicity we will measure this with the Rate of change (200) . A ROC(200) greater is positive and bellow 0 is negative. ROC(200) of the vehicle we trade (DAX) isn’t even considered, just the ROC(200) of the “other” indices.
- Entry: Enter when 4 (or more) out of the 5 indices a rate of change (200) > 0 have
- Exit: When 3 (or less) have a rate of change (200) < 0.
The result looks pretty good and there is very little to none curve fitting in it. All metrics are better compared to buy + hold as well as traditional trend following strategies. Of course many of the typical mean reversion strategies perform way better, but’s not the point. The point is to diversify into a set of VERY different strategies and this looks like a promising idea. Actually i wanted to finish the post at this point in time, but i couldn’t resist to continue my research and sharing this with you here and now.
..
.
.
Version 2: Improving risk adjusted returns
Looking at the metrics of version 1 (v1) you might have noticed the severe draw down of 30.7%. This is still better than buy&hold or any of the other traditional trend following methods, but severe enough to continue my research. In order to address the draw-down i decided to add a second shorter term filter: rate of change (50) for a faster entry / exit. Now the system is entering the trade when the majority of indices have a ROC(200)>0 and/or ROC(50)>0. The exit takes ROC(200) as well as ROC(50) into consideration. If you want to have the exact details you can check out the AFL – code bellow.
Adding ROC(50) helps to improve ALL risk adjusted returns, of course absolute returns (CAR%) take a hit. However i would prefer to trade V2.
.
.
.
.
Final thoughts
With this post i wanted to present a very simple idea to improve trend following results on a risk adjusted as well as absolute base. Here are some suggestions how to further improve the strategy:
- Add a short term mean reversion filter to delay entry in order to buy into short term weakness and sell into strength aka RSI(2).
- Less binary view on when to go long.
- More indices: Data is a big issue testing trend following strategies for non US markets. I wish i could have added more indices, e.g. Hang-Seng and Bovespa or EEM as a proxy for all emerging markets.
.
Amibroker AFL Code
#include <Cbt_statistic.afl>;SetPositionSize( 100, spsPercentOfEquity );idx1 = IIf(ROC(Foreign("$NK","Close"),200)>0,2,0); //Nikkeiidx2 = IIf(ROC(Foreign("$SX","Close"),200)>0,2,0); //Euro Stoxx 50idx3 = IIf(ROC(Foreign("$NQ","Close"),200)>0,2,0); //Nasdaq 100idx4 = IIf(ROC(Foreign("$XI","Close"),200)>0,2,0); //Australiaidx5 = IIf(ROC(Foreign("$SP","Close"),200)>0,2,0); //SP500idx1b = IIf(ROC(Foreign("$NK","Close"),50)>0,1,0); //Nikkeiidx2b = IIf(ROC(Foreign("$SX","Close"),50)>0,1,0); //Euro Stoxx 50idx3b = IIf(ROC(Foreign("$NQ","Close"),50)>0,1,0); //Nasdaq 100idx4b = IIf(ROC(Foreign("$XI","Close"),50)>0,1,0); //Australiaidx5b = IIf(ROC(Foreign("$SP","Close"),50)>0,1,0); //SP500IdxSum= idx1 + idx2 + idx3 + idx4 + idx5 + idx1b + idx2b + idx3b + idx4b + idx5b;Buy = idxsum >= 13 AND Year()>1990;Sell = idxsum < 11;




This is a very interesting idea. Just to make sure that I understand the rules, are you saying:
To clarify the rules, you buy whenever the ROC(200) or ROC(50) of the majority of indexes are above 0, correct? Have you considered the following?
1) Never buy when the ROC(200) of the majority of indexes is 0 and ROC(50) of _those_ indexes is also > 0
3) Sell when the majority of indexes no longer have a ROC(50) > 0.
4) Re-enter when the majority of indexes have a ROC(50) above 0, so long as they also have a ROC(200) > 0.
Does that make sense? I naively assume that this would help with drawdowns and reduce the time in market, though it may also have an unacceptable impact on total returns.
Hello Jacob,
Entry: indices have to have ROC(200)>0 and the majority have to have ROC(50)>0 as well.
Exit: As soon as the majority of indices drop bellow ROC(50)<0 or some have a drop ROC(200)0 counting 2 points and ROC(50)>0 counting 1 point. This all together is summed. If this sum reaches 13 i enter, if this sum is bellow 11 is exit. This is now very sophisticated, but one can come up with some kind of “dimmer” (might be an idea for a next post).
Forgot to respond to the question regarding performance. A buy+hold approach would have returned 7.7% per year. Some of the trend following strategies return up to 8.8% per year. The model i presented returns somewhere between 10.7 to 12.0% while reducing draw-downs as well.
Hi Frank,
just sent you an email you may find useful with Emerging market data.
Great post,
Paolo
Frank,
I like the concept you are working on. It is something that I have personally utilized in my trading for some time. Utilizing the derivative of the moving average i.e. the rate of change would improve overall risk adjusted returns.
I encourage you to take it a step further using the rate of change of the rate of change (acceleration) to provide a “dimmer” to the strategy. It could also be used in a binary approach as an additional filter to version 2 above. I’m curious as to your thoughts on the matter.
~Freeman
Hi,
How do you know that there is very little curve fitting in version 1?
best regards
Hello Geir,
V1 has one trend filter (ROC200) only.
I did not even optimize for the value:200. I would assume the model doesn’t brake if you choose to replace 200 with any other value in the area between 150 – 300.
Well, it seems that 2009 was a fairly bad year for most Trend Followers…
At least in the list of the 18 large Trend Following funds that I follow… They all finished in the red except 4:
http://www.automated-trading-system.com/trend-following-wizards-december-09/
2008 was “awesome” though…
Hi Frank,
I’m joining this discussion a bit late I see, but better late than never.
This system is good in that it has proven siblings.
NDR (Ned Davis Research, a strong research group in Florida) has a similar trend system for the S&P which is based on tracking 12 indices in the US market. Nelson Freeburg of Formula Research tested this NDR model and found that from 1969 – 1995 it produced a CAR of 14.7% vs 11.6% for the S&P, and a had a drawdown of 16% vs 46% for the S&P. BTW, the 12 indices each have different and significantly optimized cross-over rules compared to your rules.
Also, Nelson Freeburg of Formula Research developed a simpler price-only trend system called PENTAD using 5 indices (domestic US). His simplified model used the S&P500, Weekly Advance/Decline line, DJ Transports, DJ Utilities, Dow Jones 20 Bonds. He tested from 1969 to 1995 and acheived a CAR of 15.1% VS 11.6% for the S&P, with a drawdown of 12% vs 46%.
In both cases Nelson optimized the cross overs using the middle two thirds of the data (1972 -1993). So your un-optimized results are very good.
I like your idea of using international indices. It is more fitting now that we are all more correlated.
I would add another idea for further thought. In addition to markets turning at the same time, we know that when markets turn negative in a serious manner, such as for a true bear market, that there is negative semi-correlation across all markets. It would be interesting to see if tracking the average of the cross-correlations of the markets used for this system could be a useful filter. I would expect the average correlations to turn higher as the market prepared to drop. The average of the correlations may turn higher and cross a moving average, or the average may turn higher and cross above a certain level on an oscillator (may be worth trying a DV oscillator). Anyway, food for thought.
Good work on the model. This is a very low drawdown for a price-only trend model. Again, very good work.
Carl