Кодирование индикатора полос с использованием скользящей средней с поправкой на волатильность.
Великолепные полосы Боллинджера - это одна из первых вещей, которую мы должны изучить при анализе временных рядов. Это связано с их надежным статистическим обоснованием, их широким распространением среди участников рынка и их успехом при использовании в торговых стратегиях. Мы также можем увидеть другие вариации, которые напоминают 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 как о причине для открытия короткой позиции или о преодолении сопротивления как о причине идти долго. Я пытаюсь представить новую область под названием «Объективный технический анализ», в которой мы используем достоверные данные для оценки наших методов, а не полагаемся на устаревшие классические методы.