Autocorrelation is the correlation of the market with a delayed copy of itself. Usually calculated for a one day time-shift, it is a valuable indicator of the trendiness of the market.
If today is up and tomorrow is also up this would constitute a positive autocorrelation. If tomorrows market move is always in the opposite of today’s direction, the autocorrelation would be negative.
Autocorrelation and trendiness of markets
If autocorrelation is high it just means that yesterdays market direction is basically today’s market direction. And if the market has got the same direction every day we can call it a trend. The opposite would be true in a sideway market. Without an existing trend today’s direction will most probably not be tomorrows direction, thus we can speak about a sideway market.
Autocorrelation in German Power
But best to have a look at a chart. It shows a backward adjusted daily time series of German Power.
The indicator shows the close to close autocorrelation coefficient, calculated over 250 days. You will notice that it is always fluctuating around the zero line, never reaching +1 or -1, but let`s see if we can design a profitable trading strategy even with this little bit of autocorrelation.
The direction of autocorrelation
Waiting for an autocorrelation of +1 would be useless. There will never be the perfect trend in real world data. My working hypothesis is, that a rising autocorrelation means that the market is getting trendy, thus a rising autocorrelation would be the perfect environment for a trend following strategy. But first we have to define the direction of the autocorrelation:
To define the direction of the autocorrelation I am using my digital stochastic indicator, calculated over half of the period I calculated the autocorrelation. Digital stochastic has the big advantage that it is a quite smooth indicator without a lot of lag, thus making it easy to define its direction. The definition of a trending environment would just be: Trending market if digital stochastic is above it`s yesterdays value.
Putting autocorrelation phase detection to a test
The most simple trend following strategy I can think about is a moving average crossover strategy. It never works in reality, simply as markets are not trending all the time. But combined with the autocorrelation phase detection, it might have an edge.
Wooha! That`s pretty cool for such a simple strategy. It is trading (long/short) if the market is trending, but does nothing if the market is in a sideway phase. Exactly what I like when using a trend following strategy.
To compare it with the original moving average crossover strategy, the one without the autocorrelation phase detection, you will see the advantage of the autocorrelation phase filter immediately: The equity line is way more volatile than the filtered one and you got lots of drawdowns when the market is sideways.
Stability of parameters
German power has been a quite trendy market over the last years, that`s why even the unfiltered version of this simple trend following strategy shows a positive result, but let`s have a test on the period of the moving average.
Therefore I calculated the return on account of both strategies, the unfiltered and the autocorrelation filtered, for moving average lengths from 3 to 75 days.
Return on account (ROA) =100 if your max drawdown is as big as your return.
The left chart shows the autocorrelation filtered ROA, the right side the straight ahead moving average crossover strategy. You don`t have to be a genius to see the advantage of the autocorrelation filter. Whatever length of moving average you select, you will get a positive result. This stability of parameters can not be seen with the unfiltered strategy.
Trend following strategies are easy to trade, but only make sense when the market is trending. As shown with the tests above, autocorrelation seems to be a nice way to find out if the market is in the right phase to apply a trend following strategy.
Meta: subchart(true); Inputs: observation_period(250,10), showme(autocorrelation, digistoch), av_period(50), trademode(longshort,longonly); Variables: period, ac, r0, r1, ds,show, av; period=observation_period; r0=sign(close-close); r1=sign(close-close); ac=corsimple(r0,r1,period); ds=stochasticdigital(ac,ac,ac,round(period/2,0),round(period/10,0),round(period/10,0)); av=average(close,av_period); if trademode=longshort then begin if close>av and ds>ds then buy this bar on close; if close<av and ds>ds then short this bar on close; if close crosses above av then cover this bar on close; if close crosses below av then sell this bar on close; end else begin if close>av and ds>ds then buy this bar on close; if close crosses below av then sell this bar on close; end; if showme=autocorrelation then show=ac else show=ds; drawline(show,"showme");