Могут ли нормализованный индекс и свечи вместе давать хорошие сигналы?

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

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



Нормализованный индекс

Мы должны понимать две вещи о технических индикаторах:

  • Они основаны на цене. Это означает, что они берут цену и разлагают ее, чтобы понять некоторые характеристики. Поэтому они смотрят не вперед, а назад. Мы надеемся, что эти отсталые отношения сохранятся и в будущем. Например, если мы видим расхождение на RSI, мы надеемся, что оно вызовет истощение цен, как это обычно бывает. Это расхождение не заглядывает в будущее, это просто математическое наблюдение.
  • Сами по себе они вряд ли обеспечат выигрышную стратегию. Если да, то почему мы все не миллионеры, зависящие от зон перекупленности/перепроданности на индикаторе Stochastic? Торговля намного сложнее и требует более тщательного подхода к поиску прибыльных сделок.

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

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

Давайте сначала закодируем основные функции, необходимые для облегчения манипулирования данными и их модификации:

# 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. Следующая функция нормализует заданный временной ряд типа OHLC:

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
# Using the function
my_data = adder(my_data, 1)
my_data = normalizer(my_data, 4, 3, 4)

Интуитивно мы можем понять, что когда 4-периодный нормализованный индекс равен 100, это означает, что текущее закрытие рыночной цены является самым высоким за последние 4 периода.

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



Думая о простом свечном паттерне

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

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

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

Медвежий 4-сторонний паттерн характеризуется 4 последовательными медвежьими свечами, где каждый максимум выше предыдущего максимума.

Чтобы закодировать этот шаблон, мы можем просто использовать следующую сигнальную функцию для данных OHLC. Это означает, что значения открытия, максимума, минимума и закрытия имеют следующие индексы {0, 1, 2, 3}. Мы будем называть наши данные OHLC «my_data».

def four_way(Data):
    
    # Bullish 4-Way Pattern
    for i in range(len(Data)):
        
        if Data[i, 3] < Data[i - 1, 3] and Data[i - 1, 3] < Data[i - 2, 3] and Data[i - 2, 3] < Data[i -  3, 3]:
            Data[i, 6] = 1
        
    # Bearish 4-Way Pattern
    for i in range(len(Data)):
        
        if Data[i, 3] > Data[i - 1, 3] and Data[i - 1, 3] > Data[i - 2, 3] and Data[i - 2, 3] > Data[i -  3, 3]:    
            Data[i, 7] = -1
    
    return Data

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

Теперь мы готовы представить условия для тестирования на истории:

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

def signal(Data):
    
  for i in range(len(Data)):        
       
    # Bullish Signal
    if Data[i, 4] == 0 and Data[i - 1, 4] > 0 and Data[i, 6] == 1:
            
                Data[i, 8] = 1 
           
       
    # Bearish Signal
    if Data[i, 4] == 100 and Data[i - 1, 4]<100 and Data[i, 7]== -1:
            
                Data[i, 9] = -1

Кажется, что это работает не так хорошо, но количество существующих стратегий и комбинаций бесконечно.

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



Вывод

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

Прежде всего, я постоянно публикую свои торговые журналы в Твиттере до инициации и после инициации, чтобы показать результаты. Это обеспечивает прозрачность. Я также публикую послужной список в Твиттере каждые 1–3 месяца. Однако я никогда не гарантирую возврат ни превосходного мастерства. Что касается индикаторов, которые я разрабатываю, то я постоянно использую их в личном трейдинге. Следовательно, у меня нет мотива публиковать предвзятое исследование. Моя цель — поделиться тем, что я узнал из онлайн-сообщества.

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

Рыночная цена не может быть предсказана или ее очень трудно предсказать более чем в 50% случаев. Но реакцию рынка можно предсказать.

Приведенная выше цитата означает, что мы можем сформировать небольшую зону вокруг области и с некоторой степенью уверенности сказать, что рыночная цена покажет реакцию вокруг этой области. Но мы не можем сказать, что оттуда он упадет на 4%, затем снова протестирует его и пробьет с третьей попытки до $103,85. Член ошибки становится экспоненциально выше, потому что мы прогнозируем больше прогнозов.

Пока мы обсуждаем эту тему, я должен отметить несколько вещей, касающихся моих бэк-тестов и статей:

  • Спред, который я использую, основан на институциональных котировках с небольшой долей пункта. Как правило, розничным трейдерам предоставляется колоссальный спред в 1–2 пункта за сделку. Это огромно и несправедливо по отношению к ним. Я использую спред 0,2–0,5. Однако большинство стратегий, использующих часовой таймфрейм, по-прежнему работают со спредом в 1 пипс. Для тех, которые используют таймфреймы M15 или M5, они не могут быть прибыльными со спредом в 1 пипс.
  • Расчет периода владения, который я использую, близок к закрытию в случае отсутствия процесса управления рисками.
  • Хотя я не одобряю торговлю на основе только одного индикатора, цифры не лгут. Я представляю то, что могло бы произойти, принимая во внимание низкий спред.
  • Некоторые тесты на исторических данных, которые я предоставляю, являются проигрышными, и они публикуются либо для того, чтобы демистифицировать торговый миф, либо для того, чтобы представить интересные функции, которые читатели могут закодировать.
  • Наконец, я твердо верю в то, что не следует кормить учащихся с ложечки. Я учился, делая, а не копируя. Вы должны получить идею, функцию, интуицию, условия стратегии, а затем разработать (даже лучше) ее самостоятельно, чтобы протестировать ее на исторических данных и улучшить, прежде чем принимать решение о ее реализации или ликвидации.

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