Полное введение в паттерн "Рогатка".

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

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



Свечные графики

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

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

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

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

import numpy as np
import pandas as pd
# Importing the OHLC Historical Data in Excel format
my_ohlc_data = pd.read_excel('my_ohlc_data.xlsx')
# Converting to Array
my_ohlc_data = np.array(my_ohlc_data)

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

# Importing the necessary charting library
import matplotlib.pyplot as plt
# The syntax to plot a line chart
plt.plot(my_data[-100:, 3], color = 'black', label = 'EURUSD')
# The syntax to add the label created above
plt.legend()
# The syntax to add a grid
plt.grid()

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

  • Выберите период ретроспективного анализа. Это количество значений, которые вы хотите отобразить на диаграмме.
  • Постройте вертикальные линии для каждой строки, представляющей максимумы и минимумы. Например, для данных OHLC мы будем использовать функцию matplotlib, называемую vlines, которая строит вертикальную линию на диаграмме, используя минимальное (низкое) значение и максимальное (высокое значение).
  • Создайте цветовое условие, которое гласит, что если цена закрытия больше, чем цена открытия, выполнить выбранный блок кода (который, естественно, содержит зеленый цвет). Сделайте это с красным цветом (медвежья свеча) и черным цветом (свеча доджи).
  • Постройте вертикальные линии, используя условия с минимальным и максимальным значениями, представляющими цены закрытия и цены открытия. Убедитесь, что ширина линии слишком велика, чтобы тело свечи выглядело достаточно, чтобы график считался свечным.
def ohlc_plot(Data, window, name):
    
    Chosen = Data[-window:, ]
    
    for i in range(len(Chosen)):
 
      plt.vlines(x = i, ymin = Chosen[i, 2], ymax = Chosen[i, 1], color = 'black', linewidth = 1)
        
      if Chosen[i, 3] > Chosen[i, 0]:
            color_chosen = 'green'
            plt.vlines(x = i, ymin = Chosen[i, 0], ymax = Chosen[i, 3], color = color_chosen, linewidth = 4)
if Chosen[i, 3] < Chosen[i, 0]:
            color_chosen = 'red'
            plt.vlines(x = i, ymin = Chosen[i, 3], ymax = Chosen[i, 0], color = color_chosen, linewidth = 4)  
            
      if Chosen[i, 3] == Chosen[i, 0]:
            color_chosen = 'black'
            plt.vlines(x = i, ymin = Chosen[i, 3], ymax = Chosen[i, 0], color = color_chosen, linewidth = 4)  
          
    plt.grid()
    plt.title(name)
# Using the function
ohlc_plot(my_ohlc_data, 50, '')

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



Паттерн бычьей рогатки

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

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

Медвежья рогатка

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

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

Создание алгоритма сканирования

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

  • Первая свеча бычья, вторая свеча также бычья и закрывается выше.
  • Третья свеча является медвежьей, а четвертая - бычьей и закрывается выше максимума второй свечи.
  • Четвертая свеча имеет минимум, равный максимуму первой свечи или ниже нее.
  • Максимум первой свечи не должен превышать цену закрытия второй свечи.

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

  • Первая свеча - медвежья, вторая - тоже медвежья и закрывается ниже.
  • Третья свеча является бычьей, а четвертая - медвежьей и закрывается ниже минимума второй свечи.
  • Четвертая свеча имеет максимум, равный или выше минимума первой свечи.
  • Минимум первой свечи не должен быть ниже закрытия второй свечи.
def signal(Data):
    
    for i in range(len(Data)):    
        
       # Bullish Slingshot
       if Data[i - 3, 3] > Data[i - 3, 0] and Data[i - 2, 3] > Data[i - 2, 0] and Data[i - 1, 3] < Data[i - 1, 0] and Data[i, 3] > Data[i, 0] and Data[i - 2, 3] > Data[i - 3, 3] and Data[i, 2] <= Data[i - 3, 1] and Data[i, 1] > Data[i - 2, 1] and Data[i - 3, 1] < Data[i - 2, 3]:  
              
                Data[i, 6] = 1 
                
       # Bearish Slingshot
       elif Data[i - 3, 3] < Data[i - 3, 0] and Data[i - 2, 3] < Data[i - 2, 0] and Data[i - 1, 3] > Data[i - 1, 0] and Data[i, 3] < Data[i, 0] and Data[i - 2, 3] < Data[i - 3, 3] and Data[i, 1] >= Data[i - 3, 2] and Data[i, 2] < Data[i - 2, 2] and Data[i - 3, 2] > Data[i - 2, 3]:     
              
                Data[i, 7] = -1 
              
    return Data

Вышеупомянутая функция принимает массив данных OHLC с несколькими пустыми столбцами для резервирования и заполняет столбцы 6 (покупка) и 7 (продажа) условиями, которые мы обсуждали ранее. Мы хотим ввести 1 в столбец, который мы называем «купить», и -1 в столбец, который мы называем «продать».

Позже это позволит вам создать функцию, которая вычисляет прибыль и убыток, перебирая эти два столбца и принимая разницу в рыночной цене, чтобы найти прибыль и убыток для стратегии «близко-к-закрытию». Затем вы можете использовать функцию управления рисками, которая использует стопы и ордера на прибыль.

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



Красные стрелки указывают на сигнал на продажу, а зеленые стрелки указывают на сигнал на покупку, основанный на ценах закрытия. Следующий шаг - оценка качества сигнала.

Оценка качества сигнала

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

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

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

# Choosing the holding period
period = 34
def signal_quality(Data, closing, buy, sell, period, where):
    
    Data = adder(Data, 1)
    
    for i in range(len(Data)):
      try:
        if Data[i, buy] == 1:
                
                Data[i + period, where] = Data[i + period, closing] - Data[i, closing]
            
        if Data[i, sell] == -1:
                
                Data[i + period, where] = Data[i, closing] - Data[i + period, closing]
      except IndexError:
        pass
     return Data
# Using the selected period as a window of signal Quality check
my_data = signal_quality(my_data, 3, 6, 7, period, 8)
positives = my_data[my_data[:, 8] > 0]
negatives = my_data[my_data[:, 8] < 0]
# Calculating Signal Quality
signal_quality = len(positives) / (len(negatives) + len(positives))
print('Signal Quality = ', round(signal_quality * 100, 2), '%')
# Output EURUSD Hourly since  2011:  50.81%
# Output USDCHF Hourly since  2011:  54.97%
# Output AUDUSD Hourly since  2011:  53.14%

Поскольку это модель продолжения, более длительные периоды владения должны соответствовать лучшему качеству, и поэтому я использовал 34 периода. Качество сигнала 54,97% означает, что на 100 сделок мы склонны видеть в 55 случаях правильное предсказанное направление.

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

Заключение и важный отказ от ответственности

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

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

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