Новый технический индикатор для прогнозирования краткосрочных рыночных движений.

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

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



Индикатор диапазона волатильности - VRI

VRI - это немного сложный индикатор, состоящий из трех элементов:

  • Волатильность, измеренная с помощью исторического стандартного отклонения.
  • Импульс, измеренный по разнице цен закрытия.
  • Метод максимальной-минимальной дальности, измеренный ниже.

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

Самый простой тип волатильности - это наш старый друг, стандартное отклонение. Это один из столпов описательной статистики и важный элемент некоторых технических индикаторов. Он также используется в знаменитых полосах Боллинджера. Но сначала давайте определим, что такое дисперсия, прежде чем мы найдем стандартное отклонение.

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

Таким образом, следуя нашей логике, стандартное отклонение:

Результат вышеуказанных функций для дневных значений пары EURUSD с периодом стандартного отклонения 3 можно увидеть на графике ниже:

def volatility(Data, lookback, what, where):
    for i in range(len(Data)):
      try:
        Data[i, where] = (Data[i - lookback + 1:i + 1, what].std())
            except IndexError:
                pass
    return Data

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

for i in range(len(Data)):    
  Data[i, where] = Data[i, what] - Data[i - lookback, 0]
# Assuming what = 3, lookback = 3, where = 4, and we have an OHLC array with a few empty columns to be populated

Перейдем к следующему шагу.

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



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

  • Верхний диапазон - это самый высокий максимум за последние 3 периода.
  • Нижний диапазон - это самый низкий минимум за последние 3 периода.

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

# High Range
for i in range(len(Data)):
  try:
    Data[i, where + 2] = max(Data[i - lookback:i + 1, high])
  except ValueError:
    pass
# Low Range
for i in range(len(Data)):
  try:
     Data[i, where + 3] = min(Data[i - lookback:i + 1, low])
  except ValueError:
     pass
# Assuming where = 4, high = 1, low = 2, and we have an OHLC array with a few empty columns to be populated

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

Constand - это просто число для нормализации торговых сигналов, оно ничего не меняет в формуле. Поскольку я тестирую пары FX на исторических данных, я установил константу равной 10 000, чтобы значения VRI были более четкими.

def vri(Data, lookback, what, high, low, where):
    # Volatility Calculation
    Data = volatility(Data, lookback, what, where)
    # Differencing as a Measure of Momentum
    for i in range(len(Data)):    
        Data[i, where + 1] = Data[i, what] - Data[i - lookback, 0]
    # Extreme Range
    for i in range(len(Data)):
        try:
            Data[i, where + 2] = max(Data[i - lookback:i + 1, high])
        except ValueError:
            pass
    for i in range(len(Data)):
        try:
            Data[i, where + 3] = min(Data[i - lookback:i + 1, low])
        except ValueError:
            pass
        
    Data[:, where + 4] = Data[:, where + 1] / (Data[:, where + 2] - Data[:, where + 3])    
        
    Data[:, where + 4] = Data[:, where + 4] * Data[:, where] * 1000
       
    return Data

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

Стратегия Бэк-тест

Я считаю, что теперь картина прояснилась. Мы разработаем алгоритм обратного тестирования, который:

  • Открывает длинную позицию (покупает), когда VRI достигает -0,30 с двумя предыдущими значениями VRI выше -0,30.
  • Открывает короткую позицию (Продает), когда VRI достигает 0,30 при двух предыдущих значениях VRI ниже 0,30.

Мы снова будем использовать систему управления рисками на основе ATR со стоимостью 0,2 пункта за раунд сделки. Проверенные на исторических данных данные представляют собой почасовые столбцы с января 2010 года. Система управления рисками намеренно неоптимальна, чтобы дать стратегиям время на передышку, и, таким образом, теоретическое соотношение риска и прибыли составляет 0,25.

«Он работает лучше с почасовыми данными, чем с другими таймфреймами».

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

Заключение

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

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