В статистике скользящее среднее — это вычисление, используемое для анализа точек данных путем создания ряда средних значений различных подмножеств полного набора данных. В финансах скользящая средняя (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 :)