A little lag is a good thing. Here’s how you can remove a selected amount from an exponential moving average and use the ﬁlter in an effective trading strategy. All smoothing ﬁlters and moving averages have lag. The lag is necessary because the smoothing is done using past data. Therefore, the averaging includes the effects of the data as of several bars ago. In this article we show you how to remove a selected amount of lag from an exponential moving average (EMA). Removing all the lag is not necessarily a good thing, because with no lag, the indicator would just track out the price you were ﬁltering; the amount of lag removed is a tradeoff with the amount of smoothing you are willing to forgo. We show you the effects of lag removal in an indicator and then use the ﬁlter in an effective trading strategy.
An exponential moving average (EMA) is computed by taking a fraction of the current price and adding to it the quantity (1 –fraction) times the previously computed value of the EMA. That fraction is called the “smoothing factor” and is commonly called α (alpha), and alpha is always less than 1. The equation for an EMA can be written as:
EMA = α * Price + (1 – α) * EMA;
where EMA is the value of the EMA one bar ago.
Engineers often describe ﬁlters in terms of their impulse response. An impulse is where the data has a ﬁnite value at one sample and a zero value at all other samples. Suppose an impulse of data has a value of 1/α. When the EMA is applied to this impulse, the ﬁlter output at the end of the ﬁrst sample is just 1 because there is no previous value in the ﬁlter. On the next sample, the input value is zero, and the previous value of 1 is multiplied by (1 – α), so the output is (1 – α). On the third sample, there again is no new input and the previous value of (1 – α) is multiplied by (1 – α), so the output is (1 – α)2.
The process continues with each new data sample, with the result that the ﬁltered output response to the impulse decays as the exponent of the compliment of the smoothing factor — hence the name “exponential moving average.” When alpha is small, the EMA gives a high degree of smoothing and a relatively large amount of lag. When alpha is large (but less than 1), the EMA does very little smoothing and has very little lag.
Traders should also take note that the sum of the coefﬁcients in the ﬁlter, α and (1 – α), sum to 1. This means that if the data input is a constant value, the ﬁltered output will eventually almost reach that constant value as well. It is a common coding error to not have the ﬁlter coefﬁcients sum to 1. This is why we always write the EMA code to explicitly reﬂect the smoothing factor and its compliment.
One of the earliest mentions of the relationship between the lag of an EMA and the length of a simple moving average (SMA) was in a 1984 issue of Technical Analysis of STOCKS & COMMODITIES, in an article written by S&C founder Jack Hutson. In it, he found that the EMA smoothing factor is related to the length of an SMA as
α = 2/(Length + 1)
For interested readers, the mathematical derivation of EMA lag related to the length of an SMA can also be found in my book Rocket Science For Traders. Since minimalization of lag is crucial to the effectiveness of indicators, several authors have devised ways to make the EMA smoothing factor vary with volatility in price. Software developer Mark Jurik also has commercially available ﬁlters for various platforms that are speciﬁcally designed to minimize lag.
The method described in this article is fundamentally different from previous approaches. Here, we acknowledge the EMA ﬁlter has an error term. That error for the current data sample is just
Price – EMA 
We introduce this error term into the equation in addition to the value of the new data sample. We further change the amplitude of the error term by multiplying the error by a gain term. We call the new ﬁlter EC (for “error correcting”) instead of EMA. So the equation for the EC ﬁlter is:
EC = a * (Price + Gain * (Price – EC)) + (1 – a) * EC
The equation is simple, but its results are profound. If the gain is zero, the EC becomes just an EMA. If the gain is sufﬁciently large, the error term causes EC to track the price for all practical purposes — that is, there is virtually no lag or smoothing. We seek a value of gain that is a happy medium between tracing out the price and the EMA. We do this by limiting the maximum amount of allowable gain. If the difference between the price and the previous value of EC is small, we do not want a large value of gain. Further, the previous value of EC can be either greater or less than the current price. To properly apply the error correction, the gain must swing both positive and negative.
Suggested Books and Courses About Market Cycles
The computation of the zero-lag indicator in EasyLanguage is described in the ﬁrst sidebar, “EasyLanguage Code For Zero-Lag Indicator.” There are two user inputs: the length of the equivalent SMA and the “GainLimit.” The gain limit input is 10 times the actual gain used in the computation because the error-correcting loop variable works in incremental steps of 1 and we want the gain to be incremented in steps of 0.1. The smoothing factor alpha and EMA are computed after the variables are declared. Next, a loop searches for the least amount of error, varying gain from the lower gain limit to the upper gain limit. When a lower error is computed, the values of best gain and least error are recorded.
Once the loop has completed its work, the “BestGain” value is used to compute the EC indicator. Then both the EMA and EC are plotted on the chart. It is good practice to test indicators on theoretical waveforms to see if they behave as expected. For example, the zero-lag indicator response to a step function is shown in Figure 1 where the SMA length is set to 12 and the gain limit is set to 50. In Figure 1, we see that the EC indicator line has signiﬁcantly faster rise and fall times than the EMA. In addition, there are no transient overshoots, which are usually associated with more complicated indicators.
Zero lag is a new concept in adaptive technical analysis. This technique has resulted in an effective indicator.
Another stress test observes how the indicator responds to a short burst of waves. This test assesses how the indicator will respond to wave-like transients in the data. Figure 2 shows the EC and EMA lines responding to a three-cycle burst of waves that are 20 bars long. The zero-lag indicator inputs are again set to a SMA length of 12 and a gain limit of 50. Not only are there no signiﬁcant transients, but we can also consider the idea of using the EC and EMA line crossovers as entry and exit signals.
When we apply the zero-lag indicator to real market data — using closing prices, for example — we know the EC line will track the closes. So using a high value of gain limit would be of no value. Figure 3 shows the zero-lag indicator applied to approximately one year of Microsoft (MSFT) data. The input settings were length = 32 and gain limit = 22. The red line is the EMA and the yellow line is the EC (error-corrected) line. Since we did not apply the maximum gain limit, the EC does not faithfully follow the close, instead providing a leading indicator relative to the EMA. In general, when the EC is above the EMA, the stock is in a bull mode, and when the EC is below the EMA, the stock is bearish.
The line crossovers of the zero-lag indicator suggest that an automatic crossover trading system is feasible using the crossings of the EC and EMA lines as entry and exit signals for both long and short positions. However, a problem arises when the least error is relatively small. In this situation, the EC and EMA have almost the same value, and therefore, a considerable number of undesirable whipsaw trades are made under this condition. The whipsaw trades can be reduced by setting an additional condition that the least error must be greater than some threshold value at the same time the EC and EMA lines cross. The code for this strategy can be found in the second sidebar, “EasyLanguage For Zero-Lag Strategy,” on page 32. In this code, “Thresh” is an input parameter. To make the code more universal for all symbols, the threshold is compared to a percentage of the least error normalized to the closing price.
When the zero-lag strategy was applied to ﬁve years of 100 shares of MSFT with settings length = 32, gain limit = 22, and thresh = 0.75, we obtained the following hypothetical results:
|% Proﬁtable trades
The equity curve over the ﬁve-year period is shown in Figure 4. The relatively few trades over the ﬁve-year observation period indicate that the zero-lag trading strategy is a trend-follower. A selection of a shorter period for the equivalent SMA length can turn it into a swing trader. If this is done in the case of MSFT, the percentage wins increases, the proﬁt factor decreases, and the equity growth curve has less of a consistent growth than shown in Figure 4.
Zero lag is a new concept in adaptive technical analysis. This simple technique of applying a measured amount of error correction has resulted in both an effective technical indicator and automatic trading strategy that are free from the transients that usually accompany more sophisticated ﬁlters.
John Ehlers is a pioneer in the use of cycles and DSP techniques in technical analysis. He is the author of the MESA9 program and is the chief scientist for www.stock-spotter.com. Ric Way is an independent software developer specializing in programming algorithmic trading systems in C#.