Кодирование индикатора полос с использованием скользящей средней с поправкой на волатильность.

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

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



Скользящая средняя с поправкой на волатильность

В предыдущей статье мы представили скользящую среднюю с поправкой на волатильность - VAMA - созданную Тушаром Чандом. Эта часть является продолжением создания вокруг них полос волатильности для создания динамических уровней поддержки и сопротивления. Прежде чем двигаться дальше, освежитесь в памяти VAMA.

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

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

Следовательно, альфа рассчитывается как отношение между расчетом краткосрочной волатильности и расчетом долгосрочной волатильности. Результат умножается на 0,20. Затем, чтобы рассчитать VAMA, мы выполняем следующие действия.

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

На приведенном выше графике показаны почасовые значения EURUSD с VAMA с использованием трехпериодного стандартного отклонения и 144-периодного стандартного отклонения. Чтобы закодировать VAMA, мы используем следующую функцию

# The function to add a number of columns inside an array
def adder(Data, times):
    
    for i in range(1, times + 1):
    
        new_col = np.zeros((len(Data), 1), dtype = float)
        Data = np.append(Data, new_col, axis = 1)
        
    return Data
# The function to delete a number of columns starting from an index
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 number of rows from the beginning
def jump(Data, jump):
    
    Data = Data[jump:, ]
    
    return Data
# Example of adding 3 empty columns to an array
my_ohlc_array = adder(my_ohlc_array, 3)
# Example of deleting the 2 columns after the column indexed at 3
my_ohlc_array = deleter(my_ohlc_array, 3, 2)
# Example of deleting the first 20 rows
my_ohlc_array = jump(my_ohlc_array, 20)
# Remember, OHLC is an abbreviation of Open, High, Low, and Close and it refers to the standard historical data file
def volatility(Data, lookback, what, where):
    
    # Adding an extra column
    Data = adder(Data, 1)
    
    for i in range(len(Data)):
        
        try:
            Data[i, where] = (Data[i - lookback + 1:i + 1, what].std())
    
        except IndexError:
            pass
     
    # Cleaning
    Data = jump(Data, lookback)    
     
    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 volatility_adjusted_moving_average(Data, lookback_volatility_short, lookback_volatility_long, close, where):
    
    # Adding Columns
    Data = adder(Data, 2)
    
    # Calculating Standard Deviations
    Data = volatility(Data, lookback_volatility_short, close, where)
    Data = volatility(Data, lookback_volatility_long, close, where + 1)
    
    # Calculating Alpha
    for i in range(len(Data)):
        
        Data[i, where + 2] = 0.2 * (Data[i, where] / Data[i, where + 1])
   
    # Calculating the First Value of VAMA
    Data[1, where + 3] = (Data[1, where + 2] * Data[1, close]) + ((1 - Data[1, where + 2]) * Data[0, close])
        
    # Calculating the Rest of VAMA
    for i in range(2, len(Data)):
        
        Data[i, where + 3] = (Data[i, where + 2] * Data[i, close]) + ((1 - Data[i, where + 2]) * Data[i - 1, where + 3])    
    # Cleaning
    Data = deleter(Data, where, 3) 
    Data = jump(Data, 1)
    
    return Data

lookback_volatility_short = 3
lookback_volatility_long  = 144
my_data = volatility_adjusted_moving_average(my_data, lookback_volatility_short, lookback_volatility_long, 3, 4)

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

Если вы хотите поддержать меня и статьи, которые я регулярно публикую, рассмотрите возможность подписки на мой ЕЖЕДНЕВНЫЙ информационный бюллетень (доступен бесплатный план) по приведенной ниже ссылке. В нем есть некоторые из моих статей о Medium, другие торговые стратегии и уроки программирования, связанные с исследованиями и анализом. Оформив подписку, вы можете рассчитывать на 5–7 статей в неделю. Это поможет мне продолжать делиться своими исследованиями. Спасибо!



Группы ВАМА

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

  • Мы рассчитаем скользящее 30-периодное стандартное отклонение цены.
  • Мы умножим стандартное отклонение каждого временного шага (строки) на 3.
  • Мы добавим его к текущему VAMA, чтобы найти уровень динамического сопротивления.
  • Мы вычтем его из текущего VAMA, чтобы найти динамический уровень поддержки.

def vama_bands(Data, lookback_volatility_short, lookback_volatility_long, lookback_volatility, std, close, where):
    
    Data = volatility_adjusted_moving_average(Data, lookback_volatility_short, lookback_volatility_long, close, where)
    
    Data = volatility(Data, lookback_volatility, close, where + 1)
    
    Data = adder(Data, 2)
    
    Data[:, where + 2] = Data[:, where] + (std * Data[:, where + 1])
    Data[:, where + 3] = Data[:, where] - (std * Data[:, where + 1])
    
    Data = jump(Data, lookback_volatility)
    Data = deleter(Data, where + 1, 1)
    
    return Data
lookback_volatility_short   = 3
lookback_volatility_long    = 144 
lookback_volatility         = 30
std                         = 3
my_data = vama_bands(my_data, lookback_volatility_short, lookback_volatility_long, lookback_volatility, std, 3, 4)

На приведенном выше графике показаны почасовые значения AUDUSD с зеленым цветом VAMA, который использует 3 периода для короткого стандартного отклонения и 144 периода для длинного стандартного отклонения. Также нанесены полосы, которые используют скользящие 30 периодов для стандартного отклонения и множитель 3.

def signal(Data, close, upper_boll, lower_boll, buy, sell):
    
    Data = adder(Data, 10)
    
    for i in range(len(Data)):
    
        if Data[i, close] < Data[i, lower_boll] and Data[i - 1, close] > Data[i - 1, lower_boll]:
            
            Data[i, buy] = 1
        
        if  Data[i, close] > Data[i, upper_boll] and Data[i - 1, close] < Data[i - 1, upper_boll]:
        
            Data[i, sell] = -1
            
    return Data

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



Заключение

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

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

Medium - это центр множества интересных чтений. Я прочитал много статей, прежде чем решил начать писать. Рассмотрите возможность присоединения к Medium!



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