Использование распознавания образов и импульса для торговли на рынках.

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

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



Индикатор Momentum

Формула индикатора Momentum чрезвычайно проста, и ее можно резюмировать в следующем математическом представлении:

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

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

На приведенном выше графике показаны значения EURUSD в сравнении с индикатором моментума за 5 периодов. Это означает, что мы просто делим текущую цену закрытия на цену 5 периодов назад и умножаем на 100. Ниже приведен код Python для создания функции, которая вычисляет индикатор моментума на массиве OHLC.

def momentum_indicator(Data, what, where, lookback):
    
 for i in range(len(Data)):
     
     Data[i, where] = Data[i, what] / Data[i - lookback, what] * 100
    
 return Data
# The Data variable is the OHLC array
# The what variable is the closing price column
# The where variable is where to put the indicator
# The lookback variable is the subtraction range

Астральный узор

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

Но прежде чем мы начнем изучать астральный паттерн, давайте познакомимся с последовательностью Фибоначчи. Последовательность следует этой четкой схеме:

Числа находятся путем сложения двух предыдущих чисел после них. В случае 13 оно рассчитывается как 8 + 5, следовательно, формула имеет следующий вид:

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

Триггер Buy (Go long):

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

Триггер продажи (открытия короткой позиции):

  • Восемь последовательных закрытий, при которых текущее закрытие выше, чем закрытие три бара назад, и одновременно текущий максимум выше, чем максимум пять баров назад.
  • Если любое из вышеперечисленных условий в любой момент не выполняется, шаблон становится недействительным.

Что делает его паттерном Фибоначчи? Это связано с тем, что он использует только упорядоченные числа Фибоначчи для выполнения своего условия (3, 5 и 8). И что делает его временным шаблоном? Он зависит от времени, так как для его заполнения требуется восемь значений.

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

def astral(Data, completion, step, step_two, what, high, low, where_long, where_short):
   
    # Timing buy signal
    counter = -1
    for i in range(len(Data)):    
        if Data[i, what] < Data[i - step, what] and Data[i, low] < Data[i - step_two, low]:
            Data[i, where_long] = counter
            counter += -1       
            if counter == -completion - 1:
                counter = 0
            else:
                continue        
        elif Data[i, what] >= Data[i - step, what]:
            counter = -1 
            Data[i, where_long] = 0 
        
    # Timing sell signal       
    counter = 1 
    
    for i in range(len(Data)):
        if Data[i, what] > Data[i - step, what] and Data[i, high] > Data[i - step_two, high]: 
            Data[i, where_short] = counter 
            counter += 1        
            if counter == completion + 1: 
                counter = 0            
            else:
                continue        
        elif Data[i, what] <= Data[i - step, what]: 
            counter = 1 
            Data[i, where_short] = 0 
      
    return Data
# The completion variable refers to Astral's final count
# The step variable refers to Astral's first lookback
# The step_two variable refers to Astral's second lookback
# 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_long variable refers to where to put the buy trigger
# The where_short variable refers to where to put the sell trigger

Паттерн можно использовать на всех таймфреймах, а его эффективность максимальна на ранжированных рынках.

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



Создание и тестирование стратегии

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

  • Рассчитайте n-периодный индикатор моментума по рыночной цене. Это можно сделать, следуя приведенной выше формуле.
  • Рассчитайте астральный паттерн по рыночной цене с помощью функции, представленной выше.
  • Рассчитайте астральный паттерн на индикаторе Momentum с помощью функции, представленной выше.
  • Добавьте бычьи астральные паттерны из рыночной цены и индикатора моментума. Также добавьте медвежьи астральные паттерны из рыночной цены и индикатора моментума.
  • Выберите два субъективных барьера для генерирования сигнала. Например, 8 и -8 или 12 и -12.

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

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
# Using the function to add 20 columns
my_data = adder(my_data, 20)

Теперь мы хотим вычислить индикатор моментума в шестом столбце (с индексом 5). Помните, что цена закрытия индексируется на 3 в массиве Python.

my_data = momentum_indicator(my_data, lookback, 3, 5)

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

my_data = astral(my_data, 8, 3, 5, 3, 1, 2, 6, 7)

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

def simplified_astral(Data, completion, step, what, where_long, where_short):
        
    # Timing buy signal
    counter = -1
for i in range(len(Data)):    
        if Data[i, what] < Data[i - step, what]:
            Data[i, where_long] = counter
            counter += -1       
            if counter == -completion - 1:
                counter = 0
            else:
                continue        
        elif Data[i, what] >= Data[i - step, what]:
            counter = -1 
            Data[i, where_long] = 0 
    
    if Data[8, where_long] == -completion:
        Data = Data[9:,]
    elif Data[7, where_long] == -completion + 1:
        Data = Data[8:,]
    elif Data[6, where_long] == -completion + 2:
        Data = Data[7:,]
    elif Data[5, where_long] == -completion + 3:
        Data = Data[6:,]
    elif Data[4, where_long] == -completion + 4:
        Data = Data[5:,]
        
    # Timing sell signal       
    counter = 1 
    
    for i in range(len(Data)):
        if Data[i, what] > Data[i - step, what]: 
            Data[i, where_short] = counter 
            counter += 1        
            if counter == completion + 1: 
                counter = 0            
            else:
                continue        
        elif Data[i, what] <= Data[i - step, what]: 
            counter = 1 
            Data[i, where_short] = 0 
    
    if Data[8, where_short] == completion:
        Data = Data[9:,]
    elif Data[7, where_short] == completion - 1:
        Data = Data[8:,]
    elif Data[6, where_short] == completion - 2:
        Data = Data[7:,]
    elif Data[5, where_short] == completion - 3:
        Data = Data[6:,]
    elif Data[4, where_short] == completion - 4:
        Data = Data[5:,] 
        
    return Data
# Using the function on the Momentum Indicator
my_data = simplified_astral(my_data, completion, step, 5, 8, 9)

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

my_data[:, 10] = my_data[:, 6] + my_data[:, 8]
my_data[:, 11] = my_data[:, 7] + my_data[:, 9]

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

  • Открывайте длинную позицию (Покупайте), когда астральный паттерн 13/4/5 достигает барьера -12. Ретроспективный анализ индикатора Momentum установлен на 5 периодов.
  • Открывайте короткую позицию (продавайте), когда астральный паттерн 13/4/5 достигает барьера 12. Ретроспективный анализ индикатора Momentum установлен на 5 периодов.

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

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

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

  • Открывайте длинную позицию (Покупайте), когда астральный паттерн 13/4/4 достигает барьера -8. Ретроспективный анализ индикатора Momentum установлен на 5 периодов.
  • Открывайте короткую позицию (продавайте), когда астральный паттерн 13/4/4 достигает 8-го барьера. Ретроспективный анализ индикатора Momentum установлен на 5 периодов.
  • Система управления рисками использует индикатор среднего истинного диапазона в качестве стоп-лосса и тейк-профита. Теоретическое соотношение риска и прибыли составляет 0,25.
  • Установлен спред 0,20 пункта на сделку.

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

Заключение

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