Создание индикатора экспоненциального сглаживания для торговли на рынке на Python.

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

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



Концепция скользящих средних

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

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

Мы видим, что скользящая средняя обеспечивает достойные динамические уровни поддержки и сопротивления, откуда мы можем разместить наши ордера в случае, если рынок там пойдет вниз.

def ma(Data, lookback, what, where):
    
  for i in range(len(Data)):
      try:
        Data[i, where] = (Data[i - lookback + 1:i + 1, what].mean())
        
            except IndexError:
                pass
    return Data

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

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

def ema(Data, alpha, lookback, what, where):
    
    # 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 / (lookback + 1.0)
    beta  = 1 - alpha
    
    # First value is a simple SMA
    Data = ma(Data, lookback, what, where)
    
    # Calculating first EMA
    Data[lookback + 1, where] = (Data[lookback + 1, what] * alpha) + (Data[lookback, where] * beta)
    # Calculating the rest of EMA
    for i in range(lookback + 2, len(Data)):
            try:
                Data[i, where] = (Data[i, what] * alpha) + (Data[i - 1, where] * beta)
        
            except IndexError:
                pass
    return Data

Осциллятор стохастического сглаживания

Во-первых, давайте начнем с обычного стохастического осциллятора, а затем продолжим работу со стохастическим сглаживающим осциллятором. Осциллятор стохастик пытается найти зоны перепроданности и перекупленности, объединяя максимумы и минимумы, используя формулу нормализации, как показано ниже:

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

Мы создадим следующую функцию, которая вычисляет стохастик по данным OHLC:

def stochastic(Data, lookback, what, high, low, where):
        
    for i in range(len(Data)):
        
        try:
          Data[i, where] = (Data[i, what] - min(Data[i - lookback + 1:i + 1, low])) / (max(Data[i - lookback + 1:i + 1, high]) - min(Data[i - lookback + 1:i + 1, low]))
        
        except ValueError:
            pass
    
    Data[:, where] = Data[:, where] * 100        return Data
# The Data variable refers to the OHLC array
# The lookback variable refers to the period (5, 14, 21, etc.)
# The what variable refers to the closing price
# The high variable refers to the high price
# The low variable refers to the low price
# The where variable refers to where to put the Oscillator

Если вас также интересуют другие технические индикаторы и использование Python для создания стратегий, то моя книга-бестселлер по техническим индикаторам может вас заинтересовать:



На приведенном выше графике показаны значения EURUSD, построенные с помощью 14-периодного стохастического осциллятора. Обратите внимание, что индикатор всегда будет ограничен между 0 и 100 из-за характера его функции нормализации, которая улавливает значения между минимумом и максимумом.

Теперь, чтобы получить осциллятор стохастического сглаживания, мы можем выполнить следующие шаги:

  • Рассчитайте 14-периодную экспоненциальную скользящую среднюю по максимумам.
  • Рассчитайте 14-периодную экспоненциальную скользящую среднюю по минимумам.
  • Рассчитайте 14-периодную экспоненциальную скользящую среднюю при закрытии.
  • Примените формулу стохастика к полученным выше результатам.

def stochastic_smoothing_oscillator(Data, high, low, close, lookback, where):
    
    Data = ema(Data, 2, lookback, high, where)
    Data = ema(Data, 2, lookback, low, where + 1)
    Data = ema(Data, 2, lookback, close, where + 2)
    
    for i in range(len(Data)):
        
        try:
            Data[i, where + 3] = (Data[i, where + 2] - min(Data[i - lookback + 1:i + 1, where + 1])) / (max(Data[i - lookback + 1:i + 1, where]) - min(Data[i - lookback + 1:i + 1, where + 1]))
        
        except ValueError:
            pass
    
    Data[:, where + 3] = Data[:, where + 3] * 100
    Data = deleter(Data, where, 3)
    
    Data = jump(Data, lookback)
    
    return Data

Чтобы вышеуказанная функция работала, нам нужен массив OHLC, содержащий несколько запасных столбцов и функции удаления / перехода. Вот как это сделать:

# To add a number of columns
def adder(Data, times):
    
    for i in range(1, times + 1):
    
        z = np.zeros((len(Data), 1), dtype = float)
        Data = np.append(Data, z, axis = 1)     return Data
# To delete a number of columns starting from an index
def deleter(Data, index, times):
    
    for i in range(1, times + 1):
    
        Data = np.delete(Data, index, axis = 1)    return Data
# To delete a number of rows
def jump(Data, jump):
    
    Data = Data[jump:, ]
    
    return Data

Стратегия Бэк-тест

Теперь пришло время протестировать обычную стратегию барьеров. Применяются следующие условия:

  • Открывайте длинную позицию (покупайте), когда осциллятор стохастического сглаживания достигает 25 при двух предыдущих значениях выше 25. Удерживайте эту позицию до получения нового сигнала или до тех пор, пока система управления рисками не остановит вас.
  • Открывайте короткую позицию (продавайте), когда осциллятор стохастического сглаживания достигает 75 с двумя предыдущими значениями ниже 75. Удерживайте эту позицию до получения нового сигнала или остановки системы управления рисками.

Я переключу ретроспективный анализ на 5, чтобы у нас было больше сигналов.

def signal(Data, what, buy, sell):
    
    for i in range(len(Data)):
            
        if Data[i, what] < lower_barrier and Data[i - 1, what] > lower_barrier and Data[i - 2, what] > lower_barrier :
            Data[i, buy] = 1
            
        if Data[i, what] > upper_barrier and Data[i - 1, what] < upper_barrier and Data[i - 2, what] < upper_barrier :
            Data[i, sell] = -1

Результаты основаны на ценовых барах M15 со спредом 0,2 за раунд с использованием теоретического соотношения риска и вознаграждения 0,25 из индикатора среднего истинного диапазона, обсуждаемого ниже.

Слово об управлении рисками

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

Длинная позиция (покупка):

  • Алгоритм инициирует ордер на покупку после того, как сгенерирован сигнал по определенной стратегии.
  • Затем алгоритм будет отслеживать тики, и всякий раз, когда максимум равен определенной константе, умноженной на значение ATR во время открытия сделки, инициируется ордер выхода (с прибылью). Одновременно, если отображается минимум, равный определенной константе, умноженной на значение ATR на момент открытия сделки, инициируется выход (с убытком). Первым встреченный выход, естественно, является принятым событием.

Короткая (продажа) позиция:

  • Алгоритм инициирует короткий ордер на продажу после того, как был сгенерирован сигнал в соответствии с определенной стратегией.
  • Затем алгоритм будет отслеживать тики, и всякий раз, когда минимум равен определенной константе, умноженной на значение ATR во время открытия сделки, инициируется ордер выхода (с прибылью). Одновременно, если виден максимум, равный определенной константе, умноженной на значение ATR на момент открытия сделки, инициируется выход (с убытком). Первым встреченный выход, естественно, является принятым событием.

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

Взгляните на последнее значение ATR. Это около 0,0014 (14 пунктов). Если мы инициируем ордер на покупку, следуя простому соотношению риска и прибыли 2,00 (рискуя половиной того, что мы ожидаем получить), мы можем разместить ордер следующим образом:

  • Купить по текущей рыночной цене.
  • Тейк-профит по текущей рыночной цене + (2 x 14 пунктов).
  • Остановите позицию по текущей рыночной цене - (1 x 14 пунктов).

Заключение

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

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