Использование базовой информации для создания прибыльной торговой стратегии.

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

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



Мозговой штурм идеи

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

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

Материализация индикатора

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

Множитель денежного потока - один из строительных блоков более сложного технического индикатора, называемого осциллятором Чайкина. Мы будем придерживаться множителя денежного потока и посмотрим, может ли он сам по себе дать нам интересные сигналы. Формула множителя денежного потока:

Это кажется достаточно простым и использует только данные HLC, предоставленные каждым брокером. Если применить его к графикам, мы получим что-то вроде приведенного ниже на EURUSD.

Обратите внимание на его стационарность, которая может дать нам сигналы, обращенные к среднему. Мы можем закодировать индикатор таким образом на Python:

def money_flow_multiplier(Data, what, high, low, where):
    # Numerator    
    Data[:, where] = Data[:, what] - Data[:, low]
    Data[:, where + 1] = Data[:, high] - Data[:, what]
    # Denominator    
    Data[:, where + 2] = Data[:, where] - Data[:, where + 1]
    Data[:, where + 3] = Data[:, high] - Data[:, low]
    
    # Avoiding NaN values (Division by zero in case the High equals   the Low)
    for i in range(len(Data)):
        if Data[i, where + 3] == 0:
            Data[i, where + 3] = 0.0001
    # Money Flow Multiplier Formula
    Data[:, where + 4] = (Data[:, where + 2] / Data[:, where + 3]) * 100
    
    return Data

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

Создание и тестирование стратегии

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

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

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

def signal(Data, what, buy, sell):
    
    for i in range(len(Data)):
            
        if Data[i, what] < lower_barrier and Data[i - 1, what] > lower_barrier and Data[i - 2, what] > lower_barrier :
            Data[i, buy] = 1
            
        if Data[i, what] > upper_barrier and Data[i - 1, what] < upper_barrier and Data[i - 2, what] < upper_barrier :
            Data[i, sell] = -1

Сигнальная функция учитывает 4 переменные:

  • Переменная Data представляет собой временной ряд OHLC в форме массива, предпочтительно массива numpy.
  • Переменная what является индикатором. В нашем случае это столбец множителя денежного потока.
  • Переменные покупка и продажа - это столбцы, в которых размещаются заказы на покупку и продажу. Значение 1 относится к триггеру покупки, а значение -1 относится к триггеру продажи.

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



Примечание. Мы можем сократить множитель денежного потока до MFM, чтобы облегчить общение.

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

Давайте посмотрим на показатели производительности ниже для данных с января 2010 года:

Разъяснение по системе управления рисками

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

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

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

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

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

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

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

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

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



Сглаживание индикатора для дискреционной торговли

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

Ознакомьтесь с нижеприведенными сигналами по паре USDCHF после сглаженного MFM. Условия покупки и продажи следующие:

  • Открывайте длинную позицию (покупайте), когда множитель сглаженного денежного потока достигает нижнего порога -35,00.
  • Открывайте короткую позицию (продавайте), когда множитель сглаженного денежного потока достигает верхнего барьера на отметке 35,00.

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

Мы знаем это:

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

Проверка на практике

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

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

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

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

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

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

Ниже представлена ​​та же стратегия MFM, но с розничным спредом 2,5 пункта на сделку в качестве эталона для сравнения, когда мы использовали спред 0,2 в приведенном выше бэк-тесте.

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