рекомендации

четверг, 20 мая 2021 г.

Кодирование различных типов скользящих средних в Python


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

Если вам нужен способ сделать их своими руками, то статья ниже наверняка вас заинтересует. Все, что требуется, это интерпретатор Python, такой как SPYDER. Наиболее широко используемые типы скользящих средних:
  • Простая скользящая средняя.
  • Экспоненциальная скользящая средняя.
  • Сглаженная скользящая средняя.
  • Линейно-взвешенная скользящая средняя.
Мы рассмотрим каждую из них, определим ее, закодируем и построим ее график.



Дневной график GBPUSD. Черным цветом - 200-дневная MA, малиновым - 200-дневная EMA, желтым - 200-дневная сглаженная MA и розовым - 200-дневная линейно-взвешенная MA.

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

Как следует из названия, это обычное простое среднее значение, которое используется повсюду в статистике и практически в любой другой части нашей жизни. Это просто общие значения наблюдений, разделенные на количество наблюдений.

С математической точки зрения это можно записать как:


В Python мы можем определить функцию, которая вычисляет скользящие средние, следующим образом:

def ma(Data, period, onwhat, where):

for i in range(len(Data)):
    try:
        Data[i, where] = (Data[i - period:i + 1, onwhat].mean())

except IndexError:
        pass
    return Data

Функция принимает вашу структуру данных, представленную переменной Data, период скользящего среднего (20, 60, 200 и т. д.), представленный переменной period, к чему вы хотите его применить (в структурах данных OHLC выберите 3 для цен закрытия, потому что индексирование в Python начинается с нуля), представленного переменной onwhat, а переменная where - это то место, где вы хотите отображать столбец скользящего среднего. Обратите внимание, что у вас должен быть массив из более чем 4 столбцов, чтобы это работало, потому что он не создает автоматически новый столбец, а просто заполняет его.


Дневной график EURUSD с 200-дневной простой скользящей средней.

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

В отличие от простой скользящей средней, которая дает равные веса всем наблюдениям, экспоненциальная скользящая средняя придает больший вес более поздним наблюдениям. Она больше, чем простая скользящая средняя, ​​реагирует на недавние движения.

С математической точки зрения это можно записать как:


Коэффициент сглаживания часто равен 2. Обратите внимание, что если мы увеличим коэффициент сглаживания (также известный как alpha), то более свежие наблюдения будут иметь больший вес.

На языке Python мы можем определить функцию, вычисляющую EMA, следующим образом:

def ema(Data, alpha, window, what, whereSMA, whereEMA):

# alpha is the smoothing factor
    # window is the lookback period
    # what is the column that needs to have its average calculated
    # where is where to put the exponential moving average

alpha = alpha / (window + 1.0)
    beta = 1 - alpha

# First value is a simple SMA
    Data[window - 1, whereSMA] = np.mean(Data[:window - 1, what])

# Calculating first EMA
    Data[window, whereEMA] = (Data[window, what] * alpha) + (Data[window - 1, whereSMA] *     beta)# Calculating the rest of EMA
    for i in range(window + 1, len(Data)):
        try:
        Data[i, whereEMA] = (Data[i, what] * alpha) + (Data[i - 1, whereEMA] * beta)

except IndexError:
        pass
    return Data

Эта функция не требует пояснений, поскольку она просто воспроизводит функцию EMA, представленную выше.


Дневной график EURUSD с 200-дневной экспоненциальной скользящей средней.

Сглаженная скользящая средняя

Эта скользящая средняя учитывает общую картину и меньше подвержена влиянию недавних движений. Это мой любимый индикатор следования за трендом. С математической точки зрения, ее можно найти, просто умножив переменную Days в функции EMA на 2 и вычитая 1. Это означает, что для преобразования экспоненциальной скользящей средней в сглаженную мы следуем этому уравнению на языке Python, которое преобразует экспоненциальную скользящую среднюю в сглаженную:

smoothed = (exponential * 2) - 1 # From exponential to smoothed


Дневной график EURUSD с 200-дневной сглаженной скользящей средней.

Линейно-взвешенная скользящая средняя

Это простая скользящая средняя, ​​которая придает больший вес последним данным. Самое последнее наблюдение имеет наибольший вес, а каждое предшествующее имеет постепенно убывающий вес. Интуитивно понятно, что у нее меньшее запаздывание, чем у других скользящих средних, но она используется реже всего.

С математической точки зрения это можно записать как:


На языке Python мы можем определить функцию, которая вычисляет скользящие средние, следующим образом:

def lwma(Data, period): weighted = [] for i in range(len(Data)):
    try:
        total = np.arange(1, period + 1, 1) # weight matrix

matrix = Data[i - period + 1: i + 1, 3:4]
        matrix = np.ndarray.flatten(matrix)
        matrix = total * matrix # multiplication
        wma = (matrix.sum()) / (total.sum()) # WMA
        weighted = np.append(weighted, wma) # add to array except ValueError:
        pass return weighted


Дневной график EURUSD с 200-дневной средневзвешенной скользящей средней.

По сути, если у нас есть набор данных, состоящий из двух чисел [1, 2], и мы хотим вычислить линейное средневзвешенное значение, мы сделаем следующее:

(2 x 2) + (1 x 1) = 5

5 / 3 = 1.66

Это предполагает, что временной ряд с номером 2 является самым последним наблюдением.

Заключение

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

Комментариев нет:

Отправить комментарий