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