Кодирование и бэк-тестирование рыночной модели TD Waldo №6. Это хороший образец?

Распознавание образов - это поиск и идентификация повторяющихся паттернов с примерно одинаковыми результатами. Это означает, что когда нам удается найти паттерн, у нас есть ожидаемый результат, который мы хотим видеть и действовать в соответствии с нашей торговлей. Например, паттерн «голова и плечи» - это классический технический паттерн, который сигнализирует о неизбежном развороте тренда. Литература различается по предсказательной способности этой известной конфигурации. В этой статье мы обсудим некоторые экзотические объективные паттерны. Я говорю «объективные», потому что у них есть четкие правила, в отличие от классических моделей, таких как голова и плечи и двойная вершина / низ. В предыдущей статье свет был на TD Waldo # 8, в этой мы обсудим TD Waldo # 6 еще одну схему синхронизации и разворота, представленную Томом Демарком.

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



Кодирование паттерна TD Waldo # 6

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

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

Чтобы найти потенциальное краткосрочное дно и долгую возможность:

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

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

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

Чтобы закодировать этот индикатор, нам нужно сначала определить основные функции манипуляции:

# 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

Предполагая, что у нас есть массив OHLC, мы можем определить и использовать приведенный ниже сканер, который будет искать паттерн и вводить 1 в случае бычьего Waldo # 6 или вводить -1 в случае медвежьего Waldo # 6.

def td_waldo_6(Data, high, low, close, buy, sell):
    # Adding a few columns
    Data = adder(Data, 10)
    
    for i in range(len(Data)):
        
        # Short-term Bottom
        if Data[i, 2] < Data[i - 1, 2] and \
           Data[i, 2] < Data[i - 2, 2] and \
           Data[i, 2] < Data[i - 3, 2] and \
           Data[i, 2] < Data[i - 4, 2] and \
           Data[i, 2] < Data[i - 5, 2] and \
           Data[i, 2] < Data[i - 6, 2] and \
           Data[i, 2] < Data[i - 7, 2] and \
           Data[i, 2] < Data[i - 8, 2] and \
           abs(Data[i, 3] - Data[i, 2]) - abs(Data[i - 1, 3] - Data[i - 1, 2]) > 0:
               
               Data[i, buy] = 1
        
        # Short-term Top
        if Data[i, 1] > Data[i - 1, 1] and \
           Data[i, 1] > Data[i - 2, 1] and \
           Data[i, 1] > Data[i - 3, 1] and \
           Data[i, 1] > Data[i - 4, 1] and \
           Data[i, 1] > Data[i - 5, 1] and \
           Data[i, 1] > Data[i - 6, 1] and \
           Data[i, 1] > Data[i - 7, 1] and \
           Data[i, 1] > Data[i - 8, 1] and \
           abs(Data[i, 3] - Data[i, 1]) - abs(Data[i - 1, 3] - Data[i - 1, 1]) > 0:
               
               Data[i, sell] = -1
return Data

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



Бэк-тестирование модели без управления рисками

Шаблон будет протестирован на исторических данных тремя способами. Первый из них, описанный в этом разделе, не использует никакого управления рисками. Открывает и закрывает позиции по ценам закрытия и по следующему сигналу. Второй способ - использовать оптимальное соотношение риска и прибыли 2,0, которое просто устанавливает стоп на половине расстояния от входа по сравнению с расстоянием уровня прибыли от входа. Наконец, третий способ будет использовать субоптимальное соотношение риска и прибыли, равное 0,20. Это означает, что мы нацелимся на одну пятую установленного стопа.

Ниже приведены условия тестирования на истории:

  • С 2010 года указаны ежечасные временные рамки с использованием спреда в 0,2 пункта для имитации институционального алгоритма.
  • Открытие позиции основывается на сигнале, а ее выход основан на обнаружении другого сигнала, такого же или противоположного.

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

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



Бэк-тестирование модели с соотношением риска и прибыли 2: 1

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

Ниже приведены условия тестирования на истории:

  • С 2010 года указаны ежечасные временные рамки с использованием спреда в 0,2 пункта для имитации институционального алгоритма.
  • Открытие позиции основывается на сигнале, а ее выход основан на обнаружении другого сигнала, такого же или противоположного.
  • Остановки срабатывают, когда текущая котировка достигает 1x значения среднего истинного диапазона при входе.
  • Прибыльные ордера срабатывают, когда текущая котировка в 2 раза превышает значение среднего истинного диапазона на момент входа.

Стратегия, кажется, работает хуже, но в целом смотреть на нее крайне болезненно.

Бэк-тестирование модели с соотношением риска и прибыли 1: 5

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

Ниже приведены условия тестирования на истории:

  • С 2010 года указаны ежечасные временные рамки с использованием спреда в 0,2 пункта для имитации институционального алгоритма.
  • Открытие позиции основывается на сигнале, а ее выход основан на обнаружении другого сигнала, такого же или противоположного.
  • Остановки срабатывают, когда текущая котировка в 5 раз превышает значение среднего истинного диапазона на момент входа.
  • Прибыльные ордера срабатывают, когда текущая котировка достигает 1x значения среднего истинного диапазона при входе.

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

Слово об управлении рисками

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

Длинная позиция (покупка):

  • Алгоритм инициирует ордер на покупку после того, как был сгенерирован сигнал по определенной стратегии.
  • Затем алгоритм будет отслеживать тики, и всякий раз, когда максимум равен определенной константе, умноженной на значение ATR во время открытия сделки, инициируется ордер выхода (с прибылью). Одновременно, если виден минимум, равный определенной константе, умноженной на значение ATR на момент открытия сделки, инициируется выход (с убытком). Первым встреченный выход является, естественно, принятым событием.

Короткая (продажа) позиция:

  • Алгоритм инициирует короткий ордер на продажу после того, как был сгенерирован сигнал в соответствии с определенной стратегией.
  • Затем алгоритм будет отслеживать тики, и всякий раз, когда минимум равен определенной константе, умноженной на значение ATR во время открытия сделки, инициируется ордер выхода (с прибылью). Одновременно, если виден максимум, равный определенной константе, умноженной на значение ATR на момент открытия сделки, инициируется выход (с убытком). Первым встреченный выход является, естественно, принятым событием.

Взгляните на последнее значение ATR. Это около 0,0014 (14 пунктов). Если мы инициируем ордер на покупку, следуя простому соотношению риска и прибыли 2,00 (рискуя половиной того, что мы ожидаем получить), мы можем разместить ордер следующим образом:

  • Купить по текущей рыночной цене.
  • Тейк-профит по текущей рыночной цене + (2 x 14 пунктов).
  • Остановите позицию по текущей рыночной цене - (1 x 14 пунктов).

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

def ema(Data, alpha, lookback, what, where):
    
    # alpha is the smoothing factor
    # window is the lookback period
    # what is the column that needs to have its average calculated
    # where is where to put the exponential moving average
    
    alpha = alpha / (lookback + 1.0)
    beta  = 1 - alpha
    
    # First value is a simple SMA
    Data = ma(Data, lookback, what, where)
    
    # Calculating first EMA
    Data[lookback + 1, where] = (Data[lookback + 1, what] * alpha) + (Data[lookback, where] * beta)                    
    # Calculating the rest of EMA
    for i in range(lookback + 2, len(Data)):
            try:
                Data[i, where] = (Data[i, what] * alpha) + (Data[i - 1, where] * beta)
        
            except IndexError:
                pass
    return Datadef atr(Data, lookback, high, low, close, where):
    
    # Adding the required columns
    Data = adder(Data, 2)
    
    # True Range Calculation
    for i in range(len(Data)):
        try:
            
          Data[i, where] = max(Data[i, high] - Data[i, low],
                           abs(Data[i, high] - Data[i - 1, close]),
                           abs(Data[i, low] - Data[i - 1, close]))
            
        except ValueError:
            pass
        
    Data[0, where] = 0   
    
    # Average True Range Calculation
    Data = ema(Data, 2, lookback, where, where + 1)
    
    # Cleaning
    Data = deleter(Data, where, 1)
    Data = jump(Data, lookback)    
    return Data

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

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

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

Я должен отметить несколько моментов в моих тестах на истории и статьях:

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

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