Использование индекса изменчивости в Python

Знакомство

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

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

Прежде чем двигаться дальше, если вы хотите протестировать свои торговые стратегии без какого-либо кодирования, для этого есть решение. Это BacktestZone. Это платформа для бесплатного тестирования любого количества торговых стратегий на различных типах торгуемых активов без кодирования. Вы можете использовать инструмент прямо сейчас, используя ссылку здесь: https://www.backtestzone.com/

Волатильность и ATR

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

Основанный Уайлдером Уайлсом, Average True Range — это технический индикатор, который измеряет, насколько актив движется в среднем. Это запаздывающий индикатор, означающий, что он учитывает исторические данные актива для измерения текущей стоимости, но не способен предсказывать будущие точки данных. Это не считается недостатком при использовании ATR, поскольку это один из индикаторов для более точного отслеживания волатильности рынка. Наряду с тем, что ATR является запаздывающим индикатором, он также является ненаправленным индикатором, что означает, что движение ATR обратно пропорционально фактическому движению рынка. Чтобы рассчитать ATR, необходимо выполнить два шага:

  • Рассчитать истинный диапазон (TR): Истинный диапазон актива рассчитывается путем взятия наибольших значений трех ценовых разниц, а именно: рыночный максимум минус маркерный минимум, рыночный максимум минус предыдущее закрытие рынка, предыдущее закрытие рынка минус рыночный минимум. Его можно представить следующим образом:
MAX [ {HIGH - LOW}, {HIGH - P.CLOSE}, {P.CLOSE - LOW} ]where,
MAX = Maximum values
HIGH = Market High
LOW = Market Low
P.CLOSE = Previous market close
  • Рассчитать ATR: Расчет среднего истинного диапазона прост. Нам просто нужно взять сглаженное среднее из ранее рассчитанных значений истинного диапазона за указанное количество периодов. Сглаженное среднее — это не просто SMA или EMA, а собственный тип сглаженного среднего, созданный самим Уайлдером Уайлсом, но нет никаких ограничений и в использовании других MA. В этой статье мы будем использовать SMA, а не пользовательскую скользящую среднюю, созданную основателем индикатора, чтобы упростить задачу. Расчет ATR с традиционной установкой 14 в качестве количества периодов можно представить следующим образом:
ATR 14 = SMA 14 [ TR ]where,
ATR 14 = 14 Period Average True Range
SMA 14 = 14 Period Simple Moving Average
TR = True Range

Используя ATR в качестве индикатора для торговых целей, трейдеры должны быть осторожны, как никогда, поскольку индикатор сильно отстает. Теперь, когда у нас есть понимание того, что такое волатильность и средний истинный диапазон. Давайте углубимся в основную концепцию этой статьи — индекс изменчивости.

Индекс изменчивости

Индекс изменчивости — это индикатор волатильности, который используется для определения того, находится ли рынок в диапазоне или в тренде. Характеристики индекса изменчивости почти аналогичны ATR. Это запаздывающий и ненаправленный индикатор, значения которого растут, когда рынок должен консолидироваться, и уменьшаются в цене, когда рынок демонстрирует высокий импульс или ценовые действия. Расчет индекса изменчивости включает в себя два этапа:

  • Расчет ATR: На этом этапе ATR актива рассчитывается с единицей как указанное количество периодов.
  • Расчет индекса прерывистости: Чтобы рассчитать индекс изменчивости с традиционной настройкой 14, период ретроспективного анализа рассчитывается путем сначала беря log 10 полученного значения, деля 14-дневную сумму ранее рассчитанного ATR 1 на разницу между 14-дневным самым высоким максимумом и 14-дневным самым низким минимумом. Затем это значение делится на log 10 периода ретроспективного анализа и, наконец, умножается на 100. Это может показаться запутанным, но будет легко понять, как только вы увидите представление расчета:
CI14 = 100 * LOG10 [14D ATR1 SUM/(14D HIGHH - 14D LOWL)] / LOG10(14)where,
CI14 = 14-day Choppiness Index
14D ATR1 SUM = 14-day sum of ATR with 1 as lookback period
14D HIGHH = 14-day highest high
14D LOWL - 14-day lowest low

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

Реализация на Python

Наш процесс начинается с импорта основных пакетов в нашу среду python. Затем мы будем извлекать исторические данные об акциях Tesla, используя API, предоставленный twelvedata.com (не партнерскую ссылку). После этого мы построим Choppiness Index с нуля.

Шаг 1: Импорт пакетов

Импорт необходимых пакетов в среду python — это шаг, который нельзя пропустить. Основными пакетами будут Pandas для работы с данными, NumPy для работы с массивами и сложными функциями, Matplotlib для построения графиков и Requests для вызовов API.

Реализация Python:

import pandas as pd
import requests
import matplotlib.pyplot as plt
import numpy as np

plt.style.use('fivethirtyeight')
plt.rcParams['figure.figsize'] = (20, 10)

Теперь, когда мы импортировали все необходимые пакеты в нашу среду python. Давайте продолжим извлекать исторические данные Tesla с помощью мощного биржевого API twelvedata.com.

Шаг 2: Извлечение данных из twelvedata.com

На этом этапе мы собираемся извлечь исторические данные об акциях Tesla, используя конечную точку API, предоставленную twelvedata.com. Перед этим заметка о twelvedata.com: Twelve Data — один из ведущих поставщиков рыночных данных, имеющий огромное количество конечных точек API для всех типов рыночных данных. Очень легко взаимодействовать с API, предоставляемыми Twelve Data, и имеет одну из лучших документаций за всю историю. Кроме того, убедитесь, что у вас есть учетная запись на twelvedata.com, только тогда вы сможете получить доступ к своему ключу API (жизненно важный элемент для извлечения данных с помощью API).

Реализация Python:

def get_historical_data(symbol, start_date):
api_key = 'YOUR API KEY'
api_url = f'https://api.twelvedata.com/time_series?symbol={symbol}&interval=1day&outputsize=5000&apikey={api_key}'
raw_df = requests.get(api_url).json()
df = pd.DataFrame(raw_df['values']).iloc[::-1].set_index('datetime').astype(float)
df = df[df.index >= start_date]
df.index = pd.to_datetime(df.index)
return df

tsla = get_historical_data('TSLA', '2020-01-01')
tsla

Пояснение к коду: Первое, что мы сделали, это определили функцию с именем «get_historical_data», которая принимает символ акции («символ») и дату начала исторических данных («start_date») в качестве параметров. Внутри функции мы определяем ключ API и URL-адрес и сохраняем их в соответствующей переменной. Далее мы извлекаем исторические данные в формате JSON с помощью функции «get» и сохраняем их в переменной «raw_df». После выполнения некоторых процессов по очистке и форматированию необработанных данных JSON мы возвращаем их в виде чистого кадра данных Pandas. Наконец, мы вызываем созданную функцию, чтобы извлечь исторические данные Tesla с начала 2020 года и сохранить их в переменной ‘tsla’.

Шаг 3: Расчет индекса прерывиста

На этом этапе мы собираемся рассчитать значения индекса изменчивости с 14 в качестве периода ретроспективного анализа, используя формулу индекса прерывистости, которую мы обсуждали ранее.

Реализация Python:

def get_ci(high, low, close, lookback):
tr1 = pd.DataFrame(high - low).rename(columns = {0:'tr1'})
tr2 = pd.DataFrame(abs(high - close.shift(1))).rename(columns = {0:'tr2'})
tr3 = pd.DataFrame(abs(low - close.shift(1))).rename(columns = {0:'tr3'})
frames = [tr1, tr2, tr3]
tr = pd.concat(frames, axis = 1, join = 'inner').dropna().max(axis = 1)
atr = tr.rolling(1).mean()
highh = high.rolling(lookback).max()
lowl = low.rolling(lookback).min()
ci = 100 * np.log10((atr.rolling(lookback).sum()) / (highh - lowl)) / np.log10(lookback)
return ci

tsla['ci_14'] = get_ci(tsla['high'], tsla['low'], tsla['close'], 14)
tsla = tsla.dropna()
tsla

Пояснение к коду: Во-первых, мы определяем функцию с именем «get_ci», которая принимает в качестве параметров данные о высокой цене акции («high»), данные о низкой цене («low»), данные о цене закрытия («close») и период ретроспективного анализа.

Внутри функции мы сначала находим три отличия, которые необходимы для вычисления истинного диапазона. Чтобы рассчитать TR, мы выбираем максимальные значения из этих трех разниц, используя функцию «max», предоставляемую пакетом Pandas. С периодом ретроспективного анализа, равным 1, мы берем SMA TR, используя функции «скользящий» и «средний», чтобы вычислить средний истинный индекс и сохранить значения в переменной «atr». Затем мы определяем две переменные «highh» и «lowl» для хранения самого высокого максимума и самого низкого минимума акций за указанный период ретроспективного анализа. Теперь мы подставляем все вычисленные значения в формулу, которую мы обсуждали ранее, чтобы получить значения индекса изменчивости.

Наконец, мы вызываем определенную функцию, чтобы получить значения индекса изменчивости Теслы с традиционным периодом ретроспективного анализа, равным 14.

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

Значения индекса изменчивости ограничены от 0 до 100, следовательно, действуют как осциллятор с ограниченным диапазоном. Чем ближе значения к 100, тем выше прерывистость и наоборот. Обычно два уровня строятся выше и ниже графика индекса изменчивости, который используется для определения того, находится ли рынок в диапазоне или в тренде. Вышеуказанный уровень обычно строится на более высоком пороге 61,8, и если значения индекса изменчивости равны или выше этого порога, то рынок считается ранжирующимся или консолидирующимся. Аналогичным образом, нижний уровень строится на более низком пороге 38,2, и если индекс изменчивости имеет значение или ниже этого порога, то рынок считается трендовым. Использование индекса изменчивости можно представить следующим образом:

IF CHOPPINESS INDEX >= 61.8 --> MARKET IS CONSOLIDATING
IF CHOPPINESS INDEX <= 38.2 --> MARKET IS TRENDING

Теперь давайте воспользуемся индексом изменчивости для определения диапазонных и трендовых рыночных периодов Tesla, построив график рассчитанных значений в python.

Реализация Python:

ax1 = plt.subplot2grid((11,1,), (0,0), rowspan = 5, colspan = 1)
ax2 = plt.subplot2grid((11,1,), (6,0), rowspan = 4, colspan = 1)
ax1.plot(tsla['close'], linewidth = 2.5, color = '#2196f3')
ax1.set_title('TSLA CLOSING PRICES')
ax2.plot(tsla['ci_14'], linewidth = 2.5, color = '#fb8c00')
ax2.axhline(38.2, linestyle = '--', linewidth = 1.5, color = 'grey')
ax2.axhline(61.8, linestyle = '--', linewidth = 1.5, color = 'grey')
ax2.set_title('TSLA CHOPPINESS INDEX 14')
plt.show()

Приведенный выше график разделен на две панели: верхняя панель с ценой закрытия Tesla и нижняя панель со значениями 14-дневного индекса изменчивости Tesla. Как вы можете видеть, над и под графиком индекса изменчивости построены две линии, которые представляют собой два пороговых значения, используемых для идентификации движения рынка. Tesla, будучи волатильной акцией с более высокими ценовыми движениями, часто имеет показания ниже нижнего порога 38,2. Это означает, что Tesla демонстрирует огромный импульс с более высокой волатильностью. Мы можем подтвердить показания индекса изменчивости, параллельно наблюдая за фактическими движениями цен. Аналогичным образом, в некоторых местах показания индекса изменчивости превышают более высокий порог 61,8, что свидетельствует о консолидации акций. Это традиционный и правильный способ использования индекса изменчивости на реальном рынке.

Заключение

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

  • Оптимизация стратегии: Индекс изменчивости — это не только о более высоком и более низком пороге, но и о потенциале быть больше. Поэтому, прежде чем выходить на реальный рынок, убедитесь, что у вас есть надежная и оптимизированная торговая стратегия, которая использует индекс изменчивости в качестве фильтра.
  • Тестирование на истории: Делать выводы, просто тестируя алгоритм на одном активе или около того, будет неэффективно, а иногда даже может привести к неожиданным поворотам. Реальный рынок не работает одинаково каждый раз. Чтобы совершать более выгодные сделки, попробуйте протестировать торговую стратегию с различными активами и при необходимости изменить стратегию.

Ну вот! Надеюсь, вы узнали что-то полезное из этой статьи. Если вы забыли следовать какой-либо из частей кодирования, не волнуйтесь. Я предоставил полный исходный код в конце статьи. Приятного обучения!

Полный код:

import pandas as pd
import requests
import matplotlib.pyplot as plt
import numpy as np

plt.style.use('fivethirtyeight')
plt.rcParams['figure.figsize'] = (20, 10)

def get_historical_data(symbol, start_date):
api_key = 'YOUR API KEY'
api_url = f'https://api.twelvedata.com/time_series?symbol={symbol}&interval=1day&outputsize=5000&apikey={api_key}'
raw_df = requests.get(api_url).json()
df = pd.DataFrame(raw_df['values']).iloc[::-1].set_index('datetime').astype(float)
df = df[df.index >= start_date]
df.index = pd.to_datetime(df.index)
return df

tsla = get_historical_data('TSLA', '2020-01-01')
print(tsla)

def get_ci(high, low, close, lookback):
tr1 = pd.DataFrame(high - low).rename(columns = {0:'tr1'})
tr2 = pd.DataFrame(abs(high - close.shift(1))).rename(columns = {0:'tr2'})
tr3 = pd.DataFrame(abs(low - close.shift(1))).rename(columns = {0:'tr3'})
frames = [tr1, tr2, tr3]
tr = pd.concat(frames, axis = 1, join = 'inner').dropna().max(axis = 1)
atr = tr.rolling(1).mean()
highh = high.rolling(lookback).max()
lowl = low.rolling(lookback).min()
ci = 100 * np.log10((atr.rolling(lookback).sum()) / (highh - lowl)) / np.log10(lookback)
return ci

tsla['ci_14'] = get_ci(tsla['high'], tsla['low'], tsla['close'], 14)
tsla = tsla.dropna()
print(tsla)

ax1 = plt.subplot2grid((11,1,), (0,0), rowspan = 5, colspan = 1)
ax2 = plt.subplot2grid((11,1,), (6,0), rowspan = 4, colspan = 1)
ax1.plot(tsla['close'], linewidth = 2.5, color = '#2196f3')
ax1.set_title('TSLA CLOSING PRICES')
ax2.plot(tsla['ci_14'], linewidth = 2.5, color = '#fb8c00')
ax2.axhline(38.2, linestyle = '--', linewidth = 1.5, color = 'grey')
ax2.axhline(61.8, linestyle = '--', linewidth = 1.5, color = 'grey')
ax2.set_title('TSLA CHOPPINESS INDEX 14')
plt.show()

Источник