Using TTR package to calculate Exponential moving average
Asked Answered
B

2

7

Curious if anyone used it. I did a simple EMA operation on a time series. But wasn't able to reconcile very well.

I read that the value of the update constant = 2/(N+1). I defined x = 1:20, and did EMA(x,5). Then I did an EMA computation using the recursive computation. The two results don't really line up

The function returns

EMA(x,5)
 [1] NA NA NA NA  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18

And my little thing gives me,

EMA
 [1]  1.000000  1.333333  1.888889  2.592593  3.395062  4.263374  5.175583  6.117055  7.078037  8.052025  9.034683 10.023122 11.015415 12.010276 13.006851 14.004567
[17] 15.003045 16.002030 17.001353 18.000902
Bituminize answered 24/9, 2012 at 1:11 Comment(0)
S
9

To get the answer you are looking for you would need to write

TTR::EMA(1:20, n=1,  ratio=2/(5+1))

 [1]  1.000000  1.333333  1.888889  2.592593  3.395062  4.263374  5.175583
 [8]  6.117055  7.078037  8.052025  9.034683 10.023122 11.015415 12.010276
[15] 13.006851 14.004567 15.003045 16.002030 17.001353 18.000902

If you call TTR::EMA(1:20, n=5) it is equivalent to calling

TTR::EMA(1:20, n=5, ratio=2/(5+1))

This will put NA's in the first 4 places and then the 5th place will be the simple mean of the first 5 entries. (i.e. 3 in this case). Then the EMA algorithm will start. The 6th place will be 6 * 2 / 6 + 3 * 4 / 6 = 4. The 7th place will be 7 * 2 / 6 + 4 * 4 / 6 = 5. Etc...

You can see the exact algorithm here

Sublittoral answered 24/9, 2012 at 4:31 Comment(0)
N
3

TTR::EMA calculates the first non-missing value as the arithmetic mean of the first n variables, then begins calculating recursively. You can match your calculation by setting n=1 and ratio=1/3.

R> EMA(x,n=1,ratio=1/3)
 [1]  1.000000  1.333333  1.888889  2.592593  3.395062  4.263374  5.175583
 [8]  6.117055  7.078037  8.052025  9.034683 10.023122 11.015415 12.010276
[15] 13.006851 14.004567 15.003045 16.002030 17.001353 18.000902
Nescience answered 24/9, 2012 at 3:49 Comment(2)
> cor("TTR Author: Joshua Ulrich", "answered by: Joshua Ulrich") [1] 1 omg!Sculptress
It is worth comparing it with the way pandas in Python x.ewm(span=n, adjust = False).mean() uses y[0]=x[0] and then recursively y[t] = (1 - alpha) * y[t-1] + alpha * x[t] (for t>=1), Instead of having NAs for the first n-1, then the arithmetic mean of the first n variables and then the above formula recursively.Appointment

© 2022 - 2024 — McMap. All rights reserved.