forked from TheAlgorithms/Python
- Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimple_moving_average.py
69 lines (54 loc) · 2.24 KB
/
simple_moving_average.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"""
The Simple Moving Average (SMA) is a statistical calculation used to analyze data points
by creating a constantly updated average price over a specific time period.
In finance, SMA is often used in time series analysis to smooth out price data
and identify trends.
Reference: https://en.wikipedia.org/wiki/Moving_average
"""
fromcollections.abcimportSequence
defsimple_moving_average(
data: Sequence[float], window_size: int
) ->list[float|None]:
"""
Calculate the simple moving average (SMA) for some given time series data.
:param data: A list of numerical data points.
:param window_size: An integer representing the size of the SMA window.
:return: A list of SMA values with the same length as the input data.
Examples:
>>> sma = simple_moving_average([10, 12, 15, 13, 14, 16, 18, 17, 19, 21], 3)
>>> [round(value, 2) if value is not None else None for value in sma]
[None, None, 12.33, 13.33, 14.0, 14.33, 16.0, 17.0, 18.0, 19.0]
>>> simple_moving_average([10, 12, 15], 5)
[None, None, None]
>>> simple_moving_average([10, 12, 15, 13, 14, 16, 18, 17, 19, 21], 0)
Traceback (most recent call last):
...
ValueError: Window size must be a positive integer
"""
ifwindow_size<1:
raiseValueError("Window size must be a positive integer")
sma: list[float|None] = []
foriinrange(len(data)):
ifi<window_size-1:
sma.append(None) # SMA not available for early data points
else:
window=data[i-window_size+1 : i+1]
sma_value=sum(window) /window_size
sma.append(sma_value)
returnsma
if__name__=="__main__":
importdoctest
doctest.testmod()
# Example data (replace with your own time series data)
data= [10, 12, 15, 13, 14, 16, 18, 17, 19, 21]
# Specify the window size for the SMA
window_size=3
# Calculate the Simple Moving Average
sma_values=simple_moving_average(data, window_size)
# Print the SMA values
print("Simple Moving Average (SMA) Values:")
fori, valueinenumerate(sma_values):
ifvalueisnotNone:
print(f"Day {i+1}: {value:.2f}")
else:
print(f"Day {i+1}: Not enough data for SMA")