Простая торговая стратегия со свечами и индикаторами

Совмещение стохастического осциллятора с паттерном Доджи

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

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

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

Свечные графики являются одним из самых известных способов визуального анализа временных рядов. Они содержат больше информации, чем простая линейная диаграмма, и имеют большую визуальную интерпретацию, чем гистограммы. Многие библиотеки в 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_ohlc_data, 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, '')

Чтобы получить полную коллекцию свечных паттернов в деталях с бэктестами и техническими стратегиями, вы можете ознакомиться с моей новейшей книгой с O’Reilly Media. В книге представлено огромное количество классических и современных свечных паттернов, поскольку она углубляется в сферу технического анализа с различными торговыми стратегиями. Книга поставляется с собственным GitHub и является динамичной по своей природе, поскольку она постоянно обновляется, а на платформе O’Reilly оперативно даются ответы на вопросы.

Бычий паттерн Доджи

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

Паттерн «Бычий доджи» основан на психологии, согласно которой баланс сил выровнялся после тренда в одном направлении. Теоретически мы должны покупать на закрытии второй и последней свечи, чтобы подтвердить паттерн. Чтобы бычий паттерн Доджи был действительным, нам нужна бычья свеча после него.

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

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

Паттерн «Медвежий доджи» основан на психологии, согласно которой баланс сил выровнялся после тренда в одном направлении. Теоретически мы должны продавать на закрытии второй и последней свечи, чтобы подтвердить паттерн. Чтобы медвежий паттерн Доджи был действителен, нам нужна медвежья свеча после него.

Концепция нормализации

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

Чтобы иметь возможность манипулировать данными, нам сначала нужно иметь массив OHLC (не кадр данных) и определить следующие три небольшие функции манипуляции:

# The function to add a certain 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
# The function to deleter a certain number of columns
def deleter(Data, index, times):

for i in range(1, times + 1):

Data = np.delete(Data, index, axis = 1)

return Data
# The function to delete a certain number of rows from the beginning
def jump(Data, jump):

Data = Data[jump:, ]

return Data

Мы можем попробовать закодировать функцию нормализации в python. Ниже нормализуется данный временной ряд:

def normalizer(Data, lookback, what, where):

for i in range(len(Data)):

try:
Data[i, where] = (Data[i, what] - min(Data[i - lookback + 1:i + 1, what])) / (max(Data[i - lookback + 1:i + 1, what]) - min(Data[i - lookback + 1:i + 1, what]))

except ValueError:
pass

Data[:, where] = Data[:, where] * 100
Data = jump(Data, lookback)

return Data

Если мы применим функцию к цене закрытия часового таймфрейма EURUSD с периодом ретроспективного анализа 50 (то есть функция будет смотреть на последние 50 значений и выбирать оттуда минимальное и максимальное значения), мы получим следующий график.

# Using the function
my_data = normalizer(my_data, 50, 3, 4)

Пошаговое создание стохастического осциллятора

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

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

Мы создадим приведенную ниже функцию, которая вычисляет стохастик на данных 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

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

Создание комбинированной стратегии

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

Первым шагом является создание правил торговли. Когда система будет покупать, а когда открывать короткие? Другими словами, когда подается сигнал, который сообщает системе, что текущий рынок пойдет вверх или вниз? Торговые условия в этом случае будут следующими:

  • Открывайте длинную позицию (покупка) всякий раз, когда появляется паттерн Доджи с 14-периодным стохастическим осциллятором на уровне 20 или ниже.
  • Открывайте короткую позицию (продажу) всякий раз, когда появляется паттерн Доджи с 14-периодным стохастическим осциллятором на уровне 80 или выше.
Сигнальный график, сформированный на EURUSD в соответствии со стратегией.

На приведенном выше графике показаны сигналы, генерируемые системой, где зеленые стрелки относятся к сигналам на покупку, а красные стрелки — к сигналам коротких продаж. Мы должны помнить о частоте сигналов, когда разрабатываем торговый алгоритм. Представленные сигнальные графики всегда относятся к последним периодам 250–500, поэтому смещение по времени отсутствует.

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

def signal(Data, stochastic_col, buy, sell):

Data = adder(Data, 20)

Data = rounding(Data, 4)

for i in range(len(Data)):

if Data[i, stochastic_col] <= lower_barrier and Data[i, 0] == Data[i, 3]:
Data[i, buy] = 1

elif Data[i, stochastic_col] >= upper_barrier and Data[i, 0] == Data[i, 3]:
Data[i, sell] = -1

return Data

# The code takes the condition that the Stochastic Oscillator's column must be equal to or lower than the lower barrier while simultaneously, the opening price equals the closing price

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

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

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

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

Источник