One drawback of both the simple and weighted moving average (see) Simple Moving Average
and Weighted Moving Average
is that they include data for only the number of periods the moving average covers. For example, a 5-day simple or weighted
moving average only uses five days' worth of data. Data prior to those five days are not included in the calculation of the
moving average.
In some situations, however, the prior data is an important reflection of prices and should be included in a moving average
calculation. This can be achieved by using an exponential moving average.
An exponential moving average (EMA) uses weight factors that decrease exponentially. The weight for each older data point
decreases exponentially, giving much more importance to recent observations while still not discarding older observations
entirely.
The formula for calculating the EMA at time periods t ≥ 2 is:
Si = Þ Yt-1 + (1 - Þ) St-1
|
This formula can also be expressed in technical analysis terms as follows, showing how the EMA steps towards
the latest data point:
EMAtoday = EMAyesterday + Þ(p0 - EMAyesterday)
|
Testing the Exponential Average Moving Method
As a sample we provide the input data points using one double array using data of a stock for 20 days
(Data Array), we use the same closing data of stock for 20 days that was used under
Simple Moving Average and Weighted Moving Average
to calculate a 5-day time frame n.
Running this application produces the results WMA shown above.
The user can manipulate all values and try variations on the arrays themselves by
specifying new estimate values. For comparison purposes, the user can plot the data, the 5-day simple, weighted and exponential average. It
will show how the three methods perform under similar input conditions.
In order to test the Exponential Average Moving Method as defined above, a new ExponentialAverageMovingMethod()
static method has been added and executed. Supporting code and methods are not shown.
static void ExponentialAverageMovingMethod();
{
ListBox1.Items.Clear();
double[] xarray = new double[] {t1, t2, t3, t4, t5, t6, t7, t8,
t9, t10, t11, t12, t13, t14, t15, t16,
t17, t18, t19, t20};
VectorR ema = CurveFitting.ExponentialMovingAverage(data, t21);
ListBox1.Items.Add(" " + ema.ToString());
}
|