Skip to content

Commit 68c4bb8

Browse files
committed
readibility of code and documentation
1 parent 6edf6e5 commit 68c4bb8

File tree

1 file changed

+30
-17
lines changed

1 file changed

+30
-17
lines changed

Diff for: financial/exponential_moving_average.py

+30-17
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
"""
2-
Calculates exponential moving average (EMA) on the series of numbers
2+
Calculate the exponential moving average (EMA) on the series of numbers.
33
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
56
67
Exponential moving average is used in finance to analyze changes stock prices.
78
EMA is used in conjunction with Simple moving average (SMA), EMA reacts to the
@@ -12,22 +13,27 @@
1213

1314

1415
def exponential_moving_average(
15-
series_generator: Iterator[float], window_size: int
16+
series: Iterator[float], window_size: int
1617
) -> Iterator[float]:
1718
"""
1819
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))
2122
[2.0, 3.5, 3.25, 5.725, 5.8625, 7.43125, 8.715625]
2223
23-
:param series_generator: Generator which generates numbers
24+
:param series: Generator which generates numbers
2425
:param window_size: Window size for calculating average (window_size > 0)
2526
:return: Returns generator of which returns exponentially averaged numbers
2627
2728
Formula:
2829
2930
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
3137
3238
Exponential moving average (EMA) is a rule of thumb technique for
3339
smoothing time series data using the exponential window function.
@@ -40,22 +46,28 @@ def exponential_moving_average(
4046
alpha = 2 / (1 + window_size)
4147

4248
# Defining timestamp t
43-
t = 0
49+
timestamp = 0
4450

4551
# Exponential average at timestamp t
46-
st = 0.0
52+
exponential_average = 0.0
4753

48-
for xt in series_generator:
49-
if t <= window_size:
54+
for datapoint in series:
55+
if timestamp <= window_size:
5056
# Assigning simple moving average till the window_size for the first time
5157
# 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+
)
5363
else:
5464
# Calculating exponential moving average based on current timestamp data
5565
# 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
5971

6072

6173
if __name__ == "__main__":
@@ -64,9 +76,10 @@ def exponential_moving_average(
6476
doctest.testmod()
6577

6678
test_series = [2, 5, 3, 8.2, 6, 9, 10]
67-
test_generator = (ele for ele in test_series)
6879
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+
)
7083
print("Test series: ", test_series)
7184
print("Window size: ", test_window_size)
7285
print("Result: ", list(result))

0 commit comments

Comments
 (0)