В статистике скользящее среднее — это вычисление, используемое для анализа точек данных путем создания ряда средних значений различных подмножеств полного набора данных. В финансах скользящая средняя (MA) — это фондовый индикатор, который обычно используется в техническом анализе. Причина вычисления скользящей средней акции состоит в том, чтобы помочь сгладить ценовые данные, создав постоянно обновляемую среднюю цену.

Скользящее среднее обычно используется с данными временных рядов, чтобы сгладить краткосрочные колебания и выделить долгосрочные тренды или циклы.

Я проанализирую методы простой скользящей средней, экспоненциальной скользящей средней и кумулятивной скользящей средней.

1. Простая скользящая средняя

В финансовых приложениях простая скользящая средняя (SMA) — это невзвешенное среднее предыдущих k точек данных. Однако в науке и технике среднее значение обычно берется из равного количества данных по обе стороны от центрального значения. Это гарантирует, что вариации среднего выравниваются с вариациями данных, а не сдвигаются во времени.

Давайте код

import pandas as pd 
import numpy as np
def simple_moving_average(arr, windowSize):
 # Create the dataframe
 df = pd.DataFrame(arr, columns=[‘digits’]) 
 mean = df.digits.rolling(windowSize, min_periods=windowSize).mean().dropna().tolist()
 mean = [i for i in mean if i!=’nan’]
 return mean

Когда мы пробуем образцы данных, мы можем видеть результаты

# simple_moving_average
>>> arr = [1, 2, 3, 7, 9]
>>> window_size = 3
>>> print(“simple_moving_average(arr, windowSize)”, simple_moving_average(arr, window_size))                            simple_moving_average(arr, windowSize) [2.0, 4.0, 6.333333333333333]
>>> arr =[8, 8, 3, 7, 7, 0, 4, 2, 5, 2]
>>> window_size = 3
>>> print("simple_moving_average(arr, windowSize)",
      simple_moving_average(arr, window_size))
simple_moving_average(arr, windowSize) [6.333333333333333, 6.0, 5.666666666666667, 4.666666666666667, 3.6666666666666665, 2.0, 3.6666666666666665, 3.0]

Я включил значения «nan» в массив SMA. Посмотрим результаты на графике

>>> new_df = pd.DataFrame()
>>> new_df[“actual_data”] = arr
>>> new_df[“simple_moving_average”] = simple_moving_average_with_nan(arr, window_size)
>>> new_df.plot()

2. Экспоненциальная скользящая средняя

В финансовом анализе Экспоненциальное скользящее среднее (EMA) — это тип скользящего среднего, придающий больший вес и значение самым последним точкам данных. Мы можем рассчитать EMA следующим образом:

def exponential_moving_average(arr, timePeriod):
 alpha = 2 / (timePeriod+1)
 ema_list = []
 for i in range(len(arr)):
 if i==0:
 ema = arr[i]
 ema_list.append(ema)
 else:
 ema = alpha*arr[i] + ema*(1-alpha) 
 ema_list.append(ema)
 return ema_list

Давайте попробуем код:

>>> arr = [1, 2, 3, 7, 9]
>>> window_size = 3
>>> print(“exponential_moving_average(arr, window_size)”,
 exponential_moving_average(arr, window_size))
exponential_moving_average(arr, window_size) [1, 1.5, 2.25, 4.625, 6.8125]
>>> arr =[8, 8, 3, 7, 7, 0, 4, 2, 5, 2]
>>> window_size = 3
>>> print(“exponential_moving_average(arr, window_size)”,
 exponential_moving_average(arr, window_size))
exponential_moving_average(arr, window_size) [8, 8.0, 5.5, 6.25, 6.625, 3.3125, 3.65625, 2.828125, 3.9140625, 2.95703125]
>>> new_df = pd.DataFrame()
>>> new_df[“actual_data”] = arr
>>> new_df[“exponential_moving_average”] = exponential_moving_average_list
>>> new_df.plot()

3. Кумулятивная скользящая средняя

В кумулятивном скользящем среднем (CMA) данные поступают в виде упорядоченного потока данных, и пользователь хотел бы получить среднее значение всех данных до текущего датум. Например, инвестору может понадобиться средняя цена всех операций с акциями для конкретной акции до текущего момента времени.

def cumulative_moving_average(arr, windowSize):
 
 i = windowSize
 # Initialize an empty list to store cumulative moving averages
 moving_averages = []
 
 # Store cumulative sums of array in cum_sum array
 cum_sum = np.cumsum(arr);
 
 # Loop through the array elements
 while i <= len(arr):
 
 # Calculate the cumulative average by dividing
 # cumulative sum by number of elements till 
 # that position
 window_average = round(cum_sum[i-1] / i, 2)
 
 # Store the cumulative average of
 # current window in moving average list
 moving_averages.append(window_average)
 
 # Shift window to right by one position
 i += 1
 
 return moving_averages

Пример данных для функции CMA:

>>> arr = [1, 2, 3, 7, 9]
>>> window_size = 3 # smoothening factor
>>> print(“cumulative_moving_average(arr, window_size)”,
 cumulative_moving_average(arr, window_size))
cumulative_moving_average(arr, window_size) [2.0, 3.25, 4.4]
>>> arr =[8, 8, 3, 7, 7, 0, 4, 2, 5, 2]
>>> window_size = 3
>>> print(“cumulative_moving_average(arr, window_size)”,
 cumulative_moving_average(arr, window_size))
cumulative_moving_average(arr, window_size) [6.33, 6.5, 6.6, 5.5, 5.29, 4.88, 4.89, 4.6]

Теперь пришло время применить функции скользящего среднего к реальным данным. Я выбрал данные о COVID19 в Турции.

>>> CSV_LINK = "https://raw.githubusercontent.com/ozanerturk/covid19-turkey-api/master/dataset/timeline.csv"
>>> df = pd.read_csv(CSV_LINK)
>>> new_df = pd.DataFrame()
>>> new_df[“actual_data”] = df[“deaths”]
>>> new_df[“exponential_moving_average”] = exponential_moving_average(df[“deaths”], window_size)
>>> new_df[“cumulative_moving_average”] = cumulative_moving_average(df[“deaths”], 1)
>>> new_df[“simple_moving_average”] = simple_moving_average(arr, window_size)
>>> new_df.plot()

Thank you for reading :)