Чрезвычайно полезный индикатор, чтобы уберечься от ловушки.

Введение

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

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

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

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

Средний истинный диапазон, основанный Уайлдером Уайлсом, - это технический индикатор, который измеряет, сколько в среднем движется актив. Это запаздывающий индикатор, означающий, что он учитывает исторические данные об активе для измерения текущей стоимости, но не может предсказать будущие точки данных. Это не считается недостатком при использовании 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. Расчет среднего истинного диапазона прост. Нам просто нужно взять сглаженное среднее значение ранее рассчитанных значений True Range за указанное количество периодов. Сглаженное среднее - это не просто SMA или EMA, а собственный тип сглаженного среднего, созданный самим Уайлдером Уайлсом, но также нет никаких ограничений на использование других скользящих средних. В этой статье мы будем использовать 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 в качестве индикатора для торговых целей, трейдеры должны быть осторожны, чем когда-либо, поскольку индикатор сильно отстает. Теперь, когда мы понимаем, что такое волатильность и средний истинный диапазон. Давайте углубимся в основную концепцию этой статьи - Индекс изменчивости.

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

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

  • Расчет ATR: на этом этапе рассчитывается ATR актива, используя единицу в качестве указанного количества периодов.
  • Расчет индекса изменчивости: для расчета индекса изменчивости с традиционным значением 14, поскольку период ретроспективного анализа рассчитывается путем первого логарифма 10 значения, полученного путем деления 14-дневной суммы ранее рассчитанного ATR 1. разницей между 14-дневным максимальным значением и 14-дневным минимальным минимумом. Затем это значение делится на 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 (не по партнерской ссылке). После этого мы с нуля построим индекс изменчивости.

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

Импорт необходимых пакетов в среду Python - шаг, который нельзя пропустить. Основными пакетами будут Pandas для работы с данными, NumPy для работы с массивами и для сложных функций, Matplotlib для построения графиков и запросы на выполнение вызовов 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», которая принимает в качестве параметров символ акции («symbol») и дату начала исторических данных («start_date»). Внутри функции мы определяем ключ API и URL-адрес и сохраняем их в соответствующей переменной. Затем мы извлекаем исторические данные в формате JSON с помощью функции «get» и сохраняем их в переменной «raw_df». После выполнения некоторых процессов очистки и форматирования необработанных данных JSON мы возвращаем их в виде чистого фрейма данных Pandas. Наконец, мы вызываем созданную функцию, чтобы получить исторические данные Tesla с начала 2020 года и сохранить их в переменной «tsla».

Шаг 3: Расчет индекса волнистости

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

Реализация 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» для хранения наивысшего максимума и самого низкого минимума акции за указанный период ретроспективного анализа. Теперь мы подставляем все рассчитанные значения в формулу, которую мы обсуждали ранее, чтобы получить значения индекса Choppiness.

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

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

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

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

Теперь давайте воспользуемся индексом Choppiness Index для определения периодов изменения и изменения рыночных тенденций 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, что означает консолидацию акций. Это традиционный и правильный способ использования индекса Choppiness Index на реальном рынке.

Последние мысли!

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

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

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

Полный код:

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()