Полное введение в свечной паттерн «Пятерка».
Свечные паттерны заслуживают тщательного изучения, и даже если стратегия, основанная исключительно на них, будет нестабильной и убыточной, они могут стать ценным дополнением к полноценной торговой системе, использующей другие методы. В этой статье мы увидим полное представление и код модели продолжения из пяти свечей.
Я только что опубликовал новую книгу после успеха предыдущей книги под названием «Новые технические индикаторы в 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 для создания стратегий, то мой бестселлер по техническим индикаторам может вас заинтересовать: