Trailing Stop индикатор на Python

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

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

Средний истинный диапазон

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

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

Вы можете написать вышеупомянутое в 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()
Python

Типы волатильности

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

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

Волатильность — это среднее расстояние от среднего значения, которое мы ожидаем найти при анализе различных компонентов временных рядов.

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

Истинный диапазон

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

  • Максимум — Минимум
  • Максимум — Предыдущее закрытие
  • Предыдущее закрытие — Минимум

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

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

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

def adder(Data, times):
    
    for i in range(1, times + 1):
    
        new = np.zeros((len(Data), 1), dtype = float)
        Data = np.append(Data, new, axis = 1)
    return Data
def deleter(Data, index, times):
    
    for i in range(1, times + 1):
    
        Data = np.delete(Data, index, axis = 1)
    return Data
   
def jump(Data, jump):
    
    Data = Data[jump:, ]
    
    return Data
def ma(Data, lookback, close, where): 
    
    Data = adder(Data, 1)
    
    for i in range(len(Data)):
           
     try:
                
       Data[i, where] = (Data[i - lookback + 1:i + 1, close].mean())
            
     except IndexError:
                
       pass
            
    # Cleaning
    Data = jump(Data, lookback)
    
    return Data
def ema(Data, alpha, lookback, what, where):
    
    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
Python

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

def atr(data, lookback, high, low, close, where):
    
    # adding columns
    data = adder(data, 2)
    
    # 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   
      
    # average true range 
    data = ema(data, 2, (lookback * 2) - 1, where, where + 1)
    # Cleaning
    data = deleter(data, where, 1)
    data = jump(data, lookback)
    
    return data
Python
Сверху — часовой график EURUSD, снизу — ATR на 13 периодах

Индикатор Трейлинг-Стоп

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

Вот простой пример:

  • Открывается покупательная позиция на паре EURUSD по цене 1,1000 в ожидании продолжения восходящего движения. Мы устанавливаем стоп-заявку на уровне 1,0900 и не устанавливаем ордер на фиксацию прибыли, так как мы хотим держать позицию открытой как можно дольше.
  • Через два дня пара EURUSD торгуется по цене 1,1100. Это увеличение на 0,90%, которое мы хотим удержать хотя бы частично и зафиксировать некоторую прибыль. Поэтому мы перемещаем наш стоп до 1,1010. Теперь у нас есть позиция, которая прибыльна на 100 пунктов, и в худшем случае будет закрыта с прибылью 10 пунктов, потому что мы подняли наш стоп с уровня 1,0900 до 1,1010, чтобы его зафиксировать.
  • Через пять дней пара EURUSD торгуется по цене 1,1300. Мы купили ее по цене 1,1000. Следовательно, рынок вырос на 2,72% с момента открытия позиции. Мы можем переместить наш стоп до 1,1200, чтобы зафиксировать хотя бы 1,81% прибыли.
  • Наконец, на следующий день после достижения уровня 1,1300, пара EURUSD корректируется до 1,1800. Наш стоп срабатывает на уровне 1,1200 с прибылью 2,72%.

Индикатор

Индикатор трейлинг-стоп представляет собой линию, которая показывает, куда именно мы должны переместить наш стоп, следуя за движением. Он основан на волатильности и использует средний истинный диапазон (ATR). В версии по умолчанию используется 13-периодный ATR и множитель 3. Множитель можно рассматривать как составляющую, определяющую положение нового стоп-заявки.

EURUSD часовые значения с трейлинг-стоп индикатором (13,3)
def atr_trailing_stop(data, atr_column, multiplier, close, where):
    
    # adding columns
    data = adder(data, 1)
    
    # atr trailing stop    
    for i in range(len(data)):
        
        try:
            
            # stop
            stop = multiplier * data[i, atr_column]
            if data[i, close] > data[i - 1, where] and data[i - 1, close] > data[i - 1, where]:
                
                data[i, where] = max(data[i - 1, where], data[i, close] - stop)
            elif data[i, close] < data[i - 1, where] and data[i - 1, close] < data[i - 1, where]:
                
                data[i, where] = min(data[i - 1, where], data[i, close] + stop)
                
            elif data[i, close] > data[i - 1, where] and data[i - 1, close] < data[i - 1, where]:
                
                data[i, where] = data[i, close] - stop
                
            elif data[i, close] < data[i - 1, where] and data[i - 1, close] > data[i - 1, where]:
            
                data[i, where] = data[i, close] + stop   
                
        except ValueError:
            
            pass
    
    return data
Python
USDCAD часовые значения с трейлинг-стоп индикатором (13,3)

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

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

Заключение

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

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


Опубликовано

в

от

Комментарии

Добавить комментарий