Обнаружение изменений рыночного режима в Python.

Огромная часть времени, затрачиваемого на торговлю, уходит на поиск ответа на этот знаменитый вопрос: «Что рынок будет делать дальше? Диапазон? Тенденция? ». Ответ на этот вопрос - своего рода Святой Грааль, потому что, если мы знаем, что произойдет, мы сможем выбрать правильную стратегию.

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

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



Что такое рыночный режим?

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

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

Напоминание: бычий тренд означает рынок с восходящим трендом, а медвежий - нисходящий.

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

Создание вертикального горизонтального фильтра

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

Он рассчитывается с использованием следующих шагов:

  • Рассчитайте абсолютную сумму разницы цен от одного периода к другому. Например, если текущая цена составляет 99 долларов США, а последняя цена - 100 долларов США, то столбец абсолютной цены должен быть равен 1 доллару.
  • Рассчитайте максимальные значения за определенный период ретроспективного анализа и вычтите их из минимального значения. Это означает, что если период ретроспективного анализа равен 5, то мы должны вычесть самое высокое закрытие из самого низкого закрытия за этот период времени.
  • Разделите числитель на знаменатель, чтобы получить вертикальный горизонтальный фильтр.

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

# Adds a specified number of columns in an array
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
# Deletes a specified column in an array
def deleter(Data, index, times):
    
    for i in range(1, times + 1):
    
        Data = np.delete(Data, index, axis = 1)
    return Data
# Skips a certain number of rows in an array  
def jump(Data, jump):
    
    Data = Data[jump:, ]
    
    return Data

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

def vertical_horizontal_indicator(Data, lookback, what, where):
    
    for i in range(len(Data)):
        Data[i, where] = Data[i, what] - Data[i - 1, what]
    
    Data = jump(Data, 1)    
       
    Data[:, where] = abs(Data[:, where])
    for i in range(len(Data)):
        Data[i, where + 1] = Data[i - lookback + 1:i + 1, where].sum()
    
    for i in range(len(Data)):
        try:
            Data[i, where + 2] = max(Data[i - lookback + 1:i + 1, what]) - min(Data[i - lookback + 1:i + 1, what])
        except ValueError:
            pass
    Data = jump(Data, lookback)  
  
    Data[:, where + 3] = Data[:, where + 2] / Data[:, where + 1]
    
    Data = deleter(Data, where, 3)
    
    return Data

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

my_data = vertical_horizontal_indicator(my_data, lookback, 3, 5)

Переменная my_data относится к имеющемуся у нас массиву OHLC, ретроспективный анализ - это просто период индикатора, переменная «3» - это индекс. цен закрытия в массиве OHLC, а переменная «5» - это индекс, в котором мы хотим, чтобы VHF отображался.

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



Использование вертикального горизонтального фильтра

УКВ можно использовать в основном тремя способами:

  • Высокие значения указывают на сильную и здоровую тенденцию, которая, как ожидается, продолжится.
  • Экстремальные значения, основанные на историческом и статистическом анализе, указывают на то, что текущая тенденция, возможно, подходит к концу.

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

Но как мы узнаем, что достигли предела на неограниченном индикаторе? В конце концов, на изображении выше показаны случайные крайние значения от 0,40 до 0,50. Кто сказал, что следующим экстремумом не будет 1,00? Есть много способов обнаружить крайности:

  • Нормализация: мы можем уловить значения между их максимумами и минимумами периода ретроспективного анализа, чтобы крайние максимумы имели значение 100, а экстремальные минимумы - значение 0.
  • Графический анализ. Этот метод предполагает рисование вручную исторических уровней поддержки и сопротивления, как и при классическом техническом анализе.
  • Статистический анализ. Простое скользящее среднее и его стандартное отклонение могут помочь нам обнаружить некоторые экстремальные значения, даже если данные не распределены нормально.
  • Распознавание образов: некоторые закономерности повторяются и позволяют в среднем предсказать, где находится крайняя точка. Обширный анализ данных должен быть проведен на данных VHF, чтобы указать, где есть большая вероятность разворота. Это не очень интуитивно понятно и может легко заманить нас в ловушку интеллектуального анализа данных, но все же является альтернативным способом подтвердить наши отклонения.

В приведенном выше примере показаны почасовые данные AUDUSD с VHF (50) на второй панели. Мы видим очевидную восходящую линию тренда, поддерживающую УКВ (как форму графического анализа). Низкие значения VHF фактически подтверждают преобладающий тренд, и, следовательно, каждый раз, когда VHF достигает своей восходящей поддержки, может срабатывать бычий сигнал. Однако ни в коем случае УКВ не является указателем направления. Мы не можем использовать его так же, как RSI или MACD. Это просто помогает нам подтвердить тенденцию.

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

Аналогичный индикатор: ADX

Индекс среднего направления - ADX, созданный Уэллсом Уайлдером, представляет собой сложный индикатор, который используется для определения силы или отсутствия тренда, будь то бычий или медвежий. Как правило, он сопровождается индексом отрицательного направления (-DI) и индексом положительного направления (+ DI).

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

С учетом сказанного, -DM также является первым показателем для определения силы медвежьего тренда, и ниже мы можем увидеть его формулу:

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

def ma(Data, lookback, what, where):
    
    for i in range(len(Data)):
            try:
                Data[i, where] = (Data[i - lookback + 1:i + 1, what].mean())
        
            except IndexError:
                pass
    return Data
# The Data variable is the OHLC array
# The what variable is the closing price column
# The where variable is where to put the indicator
# The lookback variable is the moving average's period
def atr(Data, lookback, high, low, close, where):
    
    # TR
    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    
    Data = ma(Data, lookback, where, where + 1)
return Data
# The Data variable is the OHLC array
# The high variable is the high closing price column
# The low variable is the low closing price column
# The what variable is the closing price column
# The where variable is where to put the indicator
# The lookback variable is the ATR's period

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

Следовательно, для каждого момента времени у нас будет последнее среднее значение + DM и -DM, которые оба делятся на текущий ATR. Это дает нам две линии, следующие за рыночной ценой. Эти линии называются положительным указателем направления (+ DI) и отрицательным указателем направления (-DI).

На графике ниже показана пара EURUSD с индексом положительного направления и индексом отрицательного направления с использованием стандартного 14-периодного параметра. Это означает, что скользящее среднее было рассчитано на последних 14 значениях, включая текущее значение. Интересно отметить, что для нахождения сглаженной скользящей средней мы можем добавить единицу к ретроспективному анализу, используемому для экспоненциальной скользящей средней, а затем разделить на 2, поэтому экспоненциальная скользящая средняя 19 совпадает с сглаженной скользящей средней для 10, а экспоненциальная скользящая средняя 1399 такая же, как сглаженная скользящая средняя 700.

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

Даем нам окончательный график ADX, который выглядит примерно так:

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



Заключение

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

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