Пошаговое руководство по этому известному индикатору и его стратегиям на Python.

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

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



Концепция волатильности

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

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

Вы можете самостоятельно написать код на Python, используя следующий фрагмент:

# Importing the necessary libraries
import numpy as np
import matplotlib.pyplot as plt
# Creating high volatility noise
hv_noise = np.random.normal(0, 1, 250)
# Creating low volatility noise
lv_noise = np.random.normal(0, 0.1, 250)
# Plotting
plt.plot(hv_noise, color = 'red', linewidth = 1.5, label = 'High Volatility')
plt.plot(lv_noise, color = 'green', linewidth = 1.5, label = 'Low Volatility')
plt.axhline(y = 0, color = 'black', linewidth = 1)
plt.grid()
plt.legend()

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

  • Историческая волатильность: это реализованная волатильность за определенный период времени. Несмотря на то, что это ретроспективный взгляд, историческая волатильность чаще всего используется как ожидание волатильности в будущем. Одним из примеров исторической меры является стандартное отклонение, которое мы увидим позже. Другой пример - средний истинный диапазон, главный герой этой статьи.
  • Подразумеваемая волатильность. В самом простом определении подразумеваемая волатильность - это мера, которая при вводе в уравнение Блэка-Шоулза дает рыночную цену опциона. Он рассматривается участниками рынка как ожидаемая будущая фактическая волатильность. Имеет единовременную шкалу, срок действия опциона.
  • Форвардная волатильность: это волатильность за определенный период в будущем.
  • Фактическая волатильность: это величина волатильности в любой момент времени. Этот показатель, также известный как локальная волатильность, сложно рассчитать, и он не имеет временной шкалы.

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

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

Следовательно, следуя нашей логике, стандартное отклонение составляет:

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

Давайте теперь оставим в голове идею о том, чтобы быть подальше от среднего, и перейдем к концепции среднего истинного диапазона.

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

В техническом анализе индикатор под названием Средний истинный диапазон -ATR- может использоваться в качестве индикатора исторической волатильности. Хотя он считается запаздывающим индикатором, он дает некоторое представление о том, где сейчас волатильность и где она была в последний период (день, неделя, месяц и т. Д.).

Но сначала мы должны понять, как рассчитывается Истинный диапазон (ATR - это просто среднее значение этого расчета). Рассмотрим данные OHLC, состоящие из своевременно упорядоченных цен открытия, максимума, минимума и закрытия. Для каждого временного периода (бара) истинный диапазон - это просто наибольшая из трех ценовых разниц:

  • Высокая - Низкая
  • Максимум - Предыдущее закрытие
  • Предыдущее закрытие - минимум

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

Поскольку он был создан Уайлдером Уайлсом, также создателем индекса относительной силы, он использует собственный тип скользящей средней Уайлдера, сглаженный вид. Чтобы упростить ситуацию, сглаженную скользящую среднюю можно найти путем простого преобразования экспоненциальной скользящей средней.

Приведенная выше формула означает, что 100 сглаженных скользящих средних - это то же самое, что (100 x 2) -1 = 199 экспоненциальных скользящих средних. Пока мы занимаемся этим, мы можем закодировать экспоненциальную скользящую среднюю, используя эту функцию:

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
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 Data
# 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

Ниже приведен код функции, которая вычисляет форму ATR.

def ATR(Data, lookback, high, low, close, where):
    # From exponential to smoothed moving average   
    lookback = (lookback * 2) - 1
    # True Range
    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 = ema(Data, 2, lookback, where, where + 1)
    Data = deleter(Data, where, 1)
    Data = jump(Data, lookback)
    return Data

Давайте попробуем применить код к данным OHLC и посмотрим на график 14-периодного среднего истинного диапазона:

my_data = ATR(my_data, 14, 1, 2, 3, 4)

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



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

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

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

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

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

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

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

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

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



Заключение

Индикатор среднего истинного диапазона является ключевым элементом при работе с волатильностью. Это один из способов его измерения, которым следуют многие участники рынка, что придает ему больше силы. Самая большая полезность индикатора - это, как описано выше, управление рисками и установка стопов / целей. Вы можете установить ожидаемое (теоретическое) соотношение риска и прибыли по своим сделкам, установив параметры на индикаторе. Например, рассмотренный нами пример умножения должен дать нам теоретическое соотношение риска и прибыли 2,00.