Полное введение в свечной паттерн «Пятерка».

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

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



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

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

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

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

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

import numpy as np
import pandas as pd
# Importing the Data
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, '')

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



Паттерн бычьих пятерок

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

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

Медвежий паттерн пятерок

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

Психология стадности, а также отсутствие реакции - вот что дает этой модели дополнительный толчок для продолжения в том же направлении. Для него характерно наличие 5 последовательных медвежьих свечей, при которых ожидается дальнейшее снижение рынка.

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

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

body = 0.0005
def signal(Data):
    
    for i in range(len(Data)):    
        
       # Bullish Quintuplets
       if (Data[i, 3]     - Data[i, 0]) <     body and Data[i, 3]     > Data[i, 0] and \
          (Data[i - 1, 3] - Data[i - 1, 0]) < body and Data[i - 1, 3] > Data[i - 1, 0] and \
          (Data[i - 2, 3] - Data[i - 2, 0]) < body and Data[i - 2, 3] > Data[i - 2, 0] and \
          (Data[i - 3, 3] - Data[i - 3, 0]) < body and Data[i - 3, 3] > Data[i - 3, 0] and \
          (Data[i - 4, 3] - Data[i - 4, 0]) < body and Data[i - 4, 3] > Data[i - 4, 0] and \
          Data[i - 1, 6] == 0:  
              
                Data[i, 6] = 1 
                
       # Bearish Quintuplets
       elif (Data[i, 3]     - Data[i, 0]) <   body and Data[i, 3]     < Data[i, 0] and \
          (Data[i - 1, 3] - Data[i - 1, 0]) < body and Data[i - 1, 3] < Data[i - 1, 0] and \
          (Data[i - 2, 3] - Data[i - 2, 0]) < body and Data[i - 2, 3] < Data[i - 2, 0] and \
          (Data[i - 3, 3] - Data[i - 3, 0]) < body and Data[i - 3, 3] < Data[i - 3, 0] and \
          (Data[i - 4, 3] - Data[i - 4, 0]) < body and Data[i - 4, 3] < Data[i - 4, 0] and \
          Data[i - 1, 7] == 0:   
              
                Data[i, 7] = -1 
              
    return Data

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

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



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

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

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

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

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

  • 3 закрывающихся бара. Этот сигнальный период относится к стратегиям быстрого определения рыночного времени, основанным на немедленных реакциях. Другими словами, мы будем измерять разницу между ценой закрытия через 3 периода после сигнала и ценой входа на момент срабатывания триггера.
  • 8 закрывающих баров. Этот сигнальный период относится к рыночным стратегиям с небольшим запаздыванием. Другими словами, мы будем измерять разницу между ценой закрытия через 8 периодов после сигнала и ценой входа на момент срабатывания триггера.
  • 21 закрывающийся столбец: этот сигнальный период относится к более важным реакциям, которые могут даже сигнализировать об изменении тренда. Другими словами, мы будем измерять разницу между ценой закрытия через 21 период после сигнала и ценой входа на момент срабатывания триггера.
# Choosing an example of 3 periods
period = 21
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 3 Periods 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 for 3 periods:  47.66%
# Output for 8 periods:  50.76%
# Output for 21 periods: 52.22%

Поскольку это модель следования за трендом, более длительные периоды владения должны соответствовать более высокому качеству. Качество сигнала 52,22% означает, что на 100 сделках мы склонны видеть в 52 случаях более высокую цену через 21 период после получения сигнала.

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

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

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

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

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