Что такое TA-lib и его использование

В этой статье вы узнаете:

  • Что такое TA-Lib? Как его установить? Как им пользоваться?
  • 2 технических индикатора (ATR, BBands): Определение, Формула
  • Реализуйте их с помощью TA-Lib и Python с нуля
  • Сравнение результатов реализации TA-Lib и Python
  • Понять интуицию, стоящую за этим

1 TA-Lib

1.1 Что такое TA-Lib?

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

Библиотека написана на языке Си и предоставляет более 150 технических индикаторов и торговых функций. Эти индикаторы используются для выявления тенденций, измерения импульса и оценки общей силы и направления рынка.

?️ Он может быть легко интегрирован в различные языки программирования, такие как Python, R и Java, что делает его доступным для широкого круга пользователей.

Вся информация о библиотеке TA-Lib включена в репозиторий github:

https://github.com/TA-Lib/ta-lib-python

1.2 Как установить TA-lib?

Подробная информация приведена в README.md файле, но вот как установить в Python:

Вы можете установить из PyPI:

$ python3 -m pip install TA-Lib

Или проверьте источники и запустите setup.py самостоятельно:

$ python setup.py install

Также можно установить через Conda Forge:

$ conda install -c conda-forge ta-lib

1.3 Какие индикаторы реализованы в TA-Lib?

Существуют различные категории индикаторов, реализованных в TA-Lib. Вот краткий список:

  • Исследования перекрытия (например, полосы Боллинджера)
  • Индикаторы импульса (например, ROC — Скорость изменения)
  • Индикаторы объема (например, OBV — On Balance Volume)
  • Индикаторы волатильности (например, ATR — Средний истинный диапазон)

Здесь Вы можете ознакомиться с исчерпывающим перечнем индикаторов:

https://github.com/TA-Lib/ta-lib-python/blob/master/docs/funcs.md

?️ Исходный код функций написан на C и его нелегко понять. Вот почему необходимо пошаговое руководство, объясняющее формулы и реализующее с нуля индикаторы на Python. Взгляните на мою новую электронную книгу «Технические индикаторы с использованием Python и TA-Lib», в которой я подробно объясняю более 25 технических индикаторов.

Теперь давайте изучим два индикатора, чтобы увидеть, как они используются в Ta-lib и как реализовать их в Python с нуля.

Загрузка набора данных

Начнем с загрузки набора данных и необходимых нам библиотек:

import talib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

from pandas_datareader import data as pdr
import yfinance as yfin

yfin.pdr_override()
df = pdr.get_data_yahoo('GOOG', start='2022–01–01', end='2022–12–23')
df.head()

2 ATR: Average True Range

Average True Range — это технический индикатор, который измеряет волатильность актива. Он рассчитывается путем взятия максимума из этих трех показателей, включая максимум, минимум и предыдущее закрытие, а затем применения экспоненциального средневзвешенного значения (EWA) с n-периодом, обычно 14-дневным.

Расчет включает в себя два этапа, как описано ниже:

ФОРМУЛА

1- Вычислите значение истинного диапазона (TR): которое является максимальным значением следующего:
True 1: High — Low
True 2: Абсолютное значение High — предыдущее закрытие
True 3: Абсолютное значение Low — предыдущее закрытие
TR = max(high — low, abs(high — предыдущее закрытие), abs(low — предыдущее закрытие))

2 — Сгладьте значения TR с помощью 14-периодного EWA (Экспоненциально-взвешенное среднее):
Первое значение ATR = Среднее значение TR за 14-дневный период
Следующее значение:
Current ATR = Current TR * 1/period + Previous ATR * (1–1/period)

Видно, что формула напрямую связана с уровнем цен актива, что делает невозможным сравнение между активами.

2.1 TA-Lib: talib.ATR

period = 14
high = df['High'].values
low = df['Low'].values
close = df['Adj Close'].values

atr_talib = talib.ATR(high, low, close, timeperiod=period)
atr_talib[:20]
array([ nan, nan, nan, nan, nan,
nan, nan, nan, nan, nan,
nan, nan, nan, nan, 4.11370629,
4.10515555, 4.2456443 , 4.20416599, 4.23786806, 4.19012777])

2.2 Реализация Python: Как реализовать Average True Return (ATR) с помощью Python для получения того же результата, что и TA-Lib?

period = 14
high = df['High'].values
low = df['Low'].values
close = df['Adj Close'].values
previous_close=df['Adj Close'].shift().values

tr1=high-low
tr2=np.abs(high-previous_close)
tr3=np.abs(low-previous_close)
true_range=np.max((tr1,tr2,tr3),axis=0)
true_range[0]=tr1[0]

# Average True Range 14 days period EWA:
atr=np.zeros_like(high)
atr[period]=np.mean(true_range[1:period+1])

for i in range(period+1,df.shape[0]):
atr[i]=true_range[i]*1/period+atr[i-1]*(1–1/period)
display(atr[:20])
array([0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 4.11370629,
4.10515555, 4.2456443 , 4.20416599, 4.23786806, 4.19012777])

Получаем те же результаты, что и функция TA-Lib.

Вопреки тому, что объясняется в литературе, где первое значение истинного диапазона инициализируется разницей между High и Low, в TA-Lib первое значение должно быть равно 0. True_range в моем расчете также эквивалентен этой функции TA-Lib: talib. TRANGE(высокий, низкий, близкий), с первым значением, равным nan.

Этот индикатор также используется при расчете ADX (Average Directional Index), но не использует EWA. Вместо этого он использует технику сглаживания Уайлдера.

2.3 Интерпретация

Данный индикатор используется только как мера волатильности, он не используется для определения направления цены. Как было сказано ранее, он используется в других индикаторах, таких как ADX, которые могут дать больше информации о тренде актива.

Давайте построим различные расчеты, чтобы понять этот показатель:

df["atr_talib"]=atr_talib
df['tr1']=tr1
df['tr2']=tr2
df['tr3']=tr3

figsize=(12,10)
fig, (ax0,ax1,ax2) = plt.subplots(nrows=3, sharex=True, subplot_kw=dict(frameon=True),figsize=figsize)

df['Adj Close'].shift().plot(ax=ax0,label="prev Close")
df[['High','Low']].plot(ax=ax0,style=' - ')
ax0.fill_between(df.index,df['High'], df['Low'], alpha=0.2)
ax0.legend()

df[['tr1','tr2','tr3']].plot(ax=ax1,style=' - ')
ax0.legend()
df[['atr_talib']].plot(ax=ax2)

plt.title("ATR Indicator")
plt.legend()
plt.show()

?️ Большая волатильность зафиксирована в начале февраля 2022 года. Это связано с большой разницей, замеченной между Максимумом и предыдущим закрытием (tr2) (оранжевый цвет на втором графике). То же самое можно заметить несколько моментов в этот период, например, в мае 2022 года, когда это время связано с разницей tr1 (High-Low).

3 BBands: полосы Боллинджера

Bollinger Bands — это технический индикатор, который измеряет диапазоны волатильности цены актива. Есть 3 полосы, верхняя полоса, средняя полоса и нижняя полоса. Средняя полоса представляет собой простую скользящую среднюю цены за период, обычно 20 дней. Верхняя (нижняя) полоса составляет всего 2 стандартных отклонения выше (ниже) средней полосы.

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

Полосы боллинджера могут быть использованы для определения силы тренда или для определения того, является ли актив перекупленным или перепроданным. Исходя из этого, он может запускать сигналы на покупку и продажу.

ФОРМУЛА

1- Middle_band = простая скользящая средняя (SMA) n-период

Обычно 20-дневный

2- Upper_band = Middle_band + n_std * стандартное отклонение цены за n-период

3- Lower_band = Middle_band — n_std * стандартное отклонение цены за n-период

n_std — число стандартных отклонений

3.1 TA-Lib: talib.BBands

Число стандартных отклонений выше и ниже средней полосы

close = df['Adj Close']
upperband, middleband, lowerband = talib.BBANDS(close, timeperiod=20, nbdevup=2, nbdevdn=2)

3.2 Реализация Python: Как реализовать полосы Боллинджера с помощью Python, чтобы получить тот же результат, что и TA-Lib?

period = 20
n_std = 2
close = df['Adj Close']

# Calculate the rolling mean and standard deviation of the close
rolling_mean = close.rolling(period).mean()
rolling_std = close.rolling(period).std(ddof=0)
# ddof=0 ==> In order to devide by N instead of N-1, to get the same results than TA-Lib

# Calculate the z-score (number of standard deviations away from the rolling mean)
zscore = (close - rolling_mean) / rolling_std
upper_band = rolling_mean + n_std * rolling_std
lower_band = rolling_mean - n_std * rolling_std

Чтобы получить те же результаты, что и у TA-Lib, ddof=0 должен быть задан в функции встроенной функции скользящего стандартного отклонения в пандах. Потому что версия по умолчанию в пандах использует N-1 в качестве знаменателя, а не N в TA-Lib. Просто запомните здесь формулу стандартного отклонения:

Вы можете проверить сами результаты : talib. STDDEV vs rolling(period).std(ddof=0).

3.3 Сравнение результатов

Сравним для верхней полосы результаты реализации собственного python и в TA-Lib:

df['upper_band_calc']=upper_band
df['upper_band_talib']=upperband
df[['upper_band_talib','upper_band_calc','middleband','rolling_mean','rolling_std','2*rolling_std']].head(25)
df[['upper_band_talib','upper_band_calc']].head(100).tail()

3.4 Интерпретация

Давайте построим график закрытия, SMA 20-дневной цены, верхней и нижней полосы против z-балла:

figsize=(10,8)
fig, (ax0,ax1) = plt.subplots(nrows=2, sharex=True, subplot_kw=dict(frameon=True),figsize=figsize)

zscore.plot(ax=ax0,label='Zscore')
ax0.axhline(y=2,linestyle = ' - ',c='g')
ax0.axhline(y=-2,linestyle = ' - ',c='r')
ax0.fill_between(df.index,zscore, 0, where=zscore>=0,alpha=0.2)
ax0.fill_between(df.index,zscore, 0, where=zscore<0,alpha=0.2)
ax0.legend()

upper_band.plot(ax=ax1,label='Upper_band')
lower_band.plot(ax=ax1,label='Lower_band')
close.plot(ax=ax1,label='close')
rolling_mean.plot(ax=ax1,label = 'ma_20days', linestyle = '-.')
ax1.fill_between(df.index,lower_band, upper_band, alpha=0.2)
ax1.legend()

plt.title('Bollinger Bands')
plt.legend()
plt.show()

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

? Когда z-оценка положительна и увеличивается, что означает, что закрытие пересекается выше SMA 20-дневной и она увеличивается, это также определяет сильный восходящий тренд. То же самое на противоположной стороне, когда z-оценка отрицательна и уменьшается, она определяет сильный нисходящий тренд (точка 2-).

? Когда закрытие пересекает верхнюю (нижнюю) полосу выше (ниже), это означает, что закрытие отклоняется более чем на 2 стандартных отклонения от своего среднего значения. Это может указывать (не всегда) на перекупленность (перепроданность) (пункт 3-). Другой индикатор (например, CCI, RSI) может быть добавлен для подтверждения этих сигналов.

4 Резюме

В этой статье вы узнали о библиотеке TA-Lib, о том, как ее установить и как ее использовать.

Вы изучили 2 технических индикатора ATR (Average True Return) и BBands (Полосы Боллинджера):

  • Их определение, их формулы, их интерпретация
  • Как их реализовать с помощью TA-Lib
  • Как реализовать их с помощью Python с нуля
  • Сравните оба результата: некоторые трюки объяснены, чтобы получить одинаковые результаты

Источник