1
1
"""
2
- Calculates exponential moving average (EMA) on the series of numbers
2
+ Calculate the exponential moving average (EMA) on the series of numbers.
3
3
Wikipedia Reference: https://en.wikipedia.org/wiki/Exponential_smoothing
4
- Reference: https://www.investopedia.com/terms/e/ema.asp#toc-what-is-an-exponential-moving-average-ema
4
+ https://www.investopedia.com/terms/e/ema.asp#toc-what-is-an-exponential
5
+ -moving-average-ema
5
6
6
7
Exponential moving average is used in finance to analyze changes stock prices.
7
8
EMA is used in conjunction with Simple moving average (SMA), EMA reacts to the
12
13
13
14
14
15
def exponential_moving_average (
15
- series_generator : Iterator [float ], window_size : int
16
+ series : Iterator [float ], window_size : int
16
17
) -> Iterator [float ]:
17
18
"""
18
19
Returns the generator which generates exponential moving average of the given
19
- series generator
20
- >>> list(exponential_moving_average((ele for ele in [2, 5, 3, 8.2, 6, 9, 10]), 3))
20
+ series
21
+ >>> list(exponential_moving_average(iter( [2, 5, 3, 8.2, 6, 9, 10]), 3))
21
22
[2.0, 3.5, 3.25, 5.725, 5.8625, 7.43125, 8.715625]
22
23
23
- :param series_generator : Generator which generates numbers
24
+ :param series : Generator which generates numbers
24
25
:param window_size: Window size for calculating average (window_size > 0)
25
26
:return: Returns generator of which returns exponentially averaged numbers
26
27
27
28
Formula:
28
29
29
30
st = alpha * xt + (1 - alpha) * st_prev
30
- alpha = 2/(1 + window_size) - smoothing factor
31
+
32
+ Where,
33
+ st : Exponential moving average at timestamp t
34
+ xt : Datapoint in series at timestamp t
35
+ st_prev : Exponential moving average at timestamp t-1
36
+ alpha : 2/(1 + window_size) - smoothing factor
31
37
32
38
Exponential moving average (EMA) is a rule of thumb technique for
33
39
smoothing time series data using the exponential window function.
@@ -40,22 +46,28 @@ def exponential_moving_average(
40
46
alpha = 2 / (1 + window_size )
41
47
42
48
# Defining timestamp t
43
- t = 0
49
+ timestamp = 0
44
50
45
51
# Exponential average at timestamp t
46
- st = 0.0
52
+ exponential_average = 0.0
47
53
48
- for xt in series_generator :
49
- if t <= window_size :
54
+ for datapoint in series :
55
+ if timestamp <= window_size :
50
56
# Assigning simple moving average till the window_size for the first time
51
57
# is reached
52
- st = float (xt ) if t == 0 else (st + xt ) * 0.5
58
+ exponential_average = (
59
+ float (datapoint )
60
+ if timestamp == 0
61
+ else (exponential_average + datapoint ) * 0.5
62
+ )
53
63
else :
54
64
# Calculating exponential moving average based on current timestamp data
55
65
# point and previous exponential average value
56
- st = (alpha * xt ) + ((1 - alpha ) * st )
57
- t += 1
58
- yield st
66
+ exponential_average = (alpha * datapoint ) + (
67
+ (1 - alpha ) * exponential_average
68
+ )
69
+ timestamp += 1
70
+ yield exponential_average
59
71
60
72
61
73
if __name__ == "__main__" :
@@ -64,9 +76,10 @@ def exponential_moving_average(
64
76
doctest .testmod ()
65
77
66
78
test_series = [2 , 5 , 3 , 8.2 , 6 , 9 , 10 ]
67
- test_generator = (ele for ele in test_series )
68
79
test_window_size = 3
69
- result = exponential_moving_average (test_generator , test_window_size )
80
+ result = exponential_moving_average (
81
+ series = iter (test_series ), window_size = test_window_size
82
+ )
70
83
print ("Test series: " , test_series )
71
84
print ("Window size: " , test_window_size )
72
85
print ("Result: " , list (result ))
0 commit comments