Перевод. Оригинал: Build Technical Indicators in Python
Технический индикатор - это, по сути, математическое представление, основанное на наборах таких данных, как цена (максимум, минимум, открытие, закрытие и т. д.) или объем торгов ценной бумагой, предназначенное для прогнозирования ценовых тенденций. Есть несколько видов технических индикаторов, которые используются для анализа и определения направления движения цены. Трейдеры используют их для изучения краткосрочного движения цен, поскольку они не очень полезны для долгосрочных инвесторов. Они используются в первую очередь для прогнозирования будущих уровней цен.
Технические индикаторы не следуют общему шаблону, то есть ведут себя по-разному для каждой ценной бумаги. Что может быть хорошим индикатором для одной ценной бумаги, может не иметь смысла для другой. Таким образом, использование технического индикатора требует понимания в сочетании с опытом.
В следующем посте я выделю шесть технических индикаторов, которые широко используются на рынках для изучения движения цены.
Поскольку этот анализ будет выполнен на Python, вместе с описанием индикаторов также вставляется фрагмент кода. Для наглядности также прилагаются типовые диаграммы с примерами.
Commodity Channel Index (CCI)
Commodity Channel Index (CCI) - это осциллятор, который был первоначально введен Дональдом Ламбертом в 1980 году. CCI может использоваться для определения циклических колебаний по классам активов, будь то товары, индексы, акции или ETF. CCI также используется трейдерами для определения уровней перекупленности/перепроданности ценных бумаг.
Расчет
CCI оценивает взаимосвязь между ценой и скользящей средней. Расчет CCI включает:
- Расчет типичной цены на ценную бумагу. Типичная цена получается путем усреднения максимума, минимума и цены закрытия дня.
- Нахождение скользящей средней за выбранное количество дней на основе типичной цены.
- Вычисление стандартного отклонения за тот же период, что и для скользящей средней.
Формула CCI:
CCI = (Typical price – MA of Typical price) / (0.015 * Standard deviation of Typical price)
Индекс масштабируется с коэффициентом, обратным 0,015 для получения более удобочитаемых чисел.
Анализ
CCI можно использовать для определения уровней перекупленности и перепроданности. Значения выше +100 могут указывать на состояние перекупленности, тогда как значения ниже -100 могут указывать на состояние перепроданности. Однако следует быть осторожным, потому что ценная бумага может продолжить движение вверх после того, как индикатор CCI станет перекупленным. Точно так же ценные бумаги могут продолжить движение вниз после того, как индикатор станет перепроданым.
Всякий раз, когда ценная бумага находится на уровнях перекупленности/перепроданности, на что указывает CCI, есть хороший шанс, что цена сделает коррекцию. Следовательно, трейдер может использовать такие уровни перекупленности/перепроданности для входа в короткие/длинные позиции.
Трейдеры также могут искать сигналы дивергенции, чтобы занять подходящие позиции, используя CCI. Бычья дивергенция возникает, когда базовая ценная бумага достигает более низкого минимума, а CCI - более высокого минимума, что показывает меньшую нисходящую динамику. Точно так же медвежья дивергенция формируется, когда ценная бумага фиксирует более высокий максимум, а CCI формирует более низкий максимум, что показывает меньшую динамику роста.
Код Python для расчета Commodity Channel Index
В приведенном ниже коде мы используем функции Series, Rolling_mean, Rolling_std и join для вычисления Commodity Channel Index. Функция Series используется для формирования ряда, который представляет собой одномерный объект, подобный массиву, содержащий массив данных. Функция Rolling_mean принимает временной ряд или data frame вместе с числом периодов и вычисляет среднее значение. Функция Rolling_std вычисляет стандартное отклонение на основе указанной цены. Функция join соединяет данный ряд с указанным рядом/dataframe.
# Commodity Channel Index Python Code # Load the necessary packages and modules from pandas_datareader import data as pdr import matplotlib.pyplot as plt import yfinance import pandas as pd # Commodity Channel Index def CCI(data, ndays): TP = (data['High'] + data['Low'] + data['Close']) / 3 CCI = pd.Series((TP - TP.rolling(ndays).mean()) / (0.015 * TP.rolling(ndays).std()), name = 'CCI') data = data.join(CCI) return data # Retrieve the Nifty data from Yahoo finance: data = pdr.get_data_yahoo("^NSEI", start="2014-01-01", end="2016-01-01") data = pd.DataFrame(data) # Compute the Commodity Channel Index(CCI) for NIFTY based on the 20-day Moving average n = 20 NIFTY_CCI = CCI(data, n) CCI = NIFTY_CCI['CCI'] # Plotting the Price Series chart and the Commodity Channel index below fig = plt.figure(figsize=(7,5)) ax = fig.add_subplot(2, 1, 1) ax.set_xticklabels([]) plt.plot(data['Close'],lw=1) plt.title('NSE Price Chart') plt.ylabel('Close Price') plt.grid(True) bx = fig.add_subplot(2, 1, 2) plt.plot(CCI,'k',lw=0.75,linestyle='-',label='CCI') plt.legend(loc=2,prop={'size':9.5}) plt.ylabel('CCI values') plt.grid(True) plt.setp(plt.gca().get_xticklabels(), rotation=30)
Мы также нанесли ряд значений цен NSE и CCI под ценовым графиком. Сначала мы создаем пустой график с помощью функции plt.figure, а затем создаем два графика. На первом графике показан ценовой ряд NSE, а на втором - значения CCI.
Ease of Movement (EVM)
Ease of Movement (EMV) - это осциллятор на основе объема, разработанный Ричардом Армсом. EVM показывает легкость, с которой цены растут или падают с учетом объема торгов ценной бумагой. Например, рост цены при небольшом объеме означает, что цены росли относительно легко, и давление со стороны продавцов было незначительным. Положительные значения EVM означают, что рынок легко движется вверх, а отрицательные значения указывают на легкость снижения.
Расчет
Чтобы вычислить EMV, мы сначала вычисляем Distance moved:
Distance moved = ((Current High + Current Low)/2 - (Prior High + Prior Low)/2)
Затем мы вычисляем коэффициент Box ratio, который использует объем и диапазон максимума-минимума:
Box ratio = (Volume / 100,000,000) / (Current High – Current Low) EMV = Distance moved / Box ratio
Для вычисления n-периодной EMV мы берем n-периодную простую скользящую среднюю для 1-периодной EMV.
Анализ
Ease of Movement (EMV) может использоваться для подтверждения бычьего или медвежьего тренда. Устойчивое положительное значение Ease of Movement вместе с растущим рынком подтверждает бычий тренд, тогда как отрицательные значения Ease of Movement при падающих ценах подтверждают медвежий тренд. Помимо использования в качестве отдельного индикатора, Ease of Movement (EMV) также используется с другими индикаторами при анализе графиков.
Код Python для вычисления Ease of Movement (EMV)
Пример кода: 14-дневная Ease of Movement (EMV) для AAPL.
В приведенном ниже коде мы используем функции Series, Rolling_mean, shift и join для вычисления индикатора Ease of Movement (EMV). Функция Series используется для формирования ряда, который представляет собой одномерный объект, подобный массиву, содержащий массив данных. Функция Rolling_mean принимает временной ряд или data frame вместе с числом периодов и вычисляет среднее значение. Функция shift используется для получения максимальной и минимальной цены предыдущего дня. Функция join соединяет данный ряд с указанным рядом/dataframe.
# Ease Of Movement (EVM) Code # Load the necessary packages and modules from pandas_datareader import data as pdr import matplotlib.pyplot as plt import yfinance import pandas as pd # Ease of Movement def EVM(data, ndays): dm = ((data['High'] + data['Low'])/2) - ((data['High'].shift(1) + data['Low'].shift(1))/2) br = (data['Volume'] / 100000000) / ((data['High'] - data['Low'])) EVM = dm / br EVM_MA = pd.Series(EVM.rolling(ndays).mean(), name = 'EVM') data = data.join(EVM_MA) return data # Retrieve the AAPL data from Yahoo finance: data = pdr.get_data_yahoo("AAPL", start="2015-01-01", end="2016-01-01") data = pd.DataFrame(data) # Compute the 14-day Ease of Movement for AAPL n = 14 AAPL_EVM = EVM(data, n) EVM = AAPL_EVM['EVM'] # Plotting the Price Series chart and the Ease Of Movement below fig = plt.figure(figsize=(7,5)) ax = fig.add_subplot(2, 1, 1) ax.set_xticklabels([]) plt.plot(data['Close'],lw=1) plt.title('AAPL Price Chart') plt.ylabel('Close Price') plt.grid(True) bx = fig.add_subplot(2, 1, 2) plt.plot(EVM,'k',lw=0.75,linestyle='-',label='EVM(14)') plt.legend(loc=2,prop={'size':9}) plt.ylabel('EVM values') plt.grid(True) plt.setp(plt.gca().get_xticklabels(), rotation=30)
Мы также нанесли ряд цен AAPL и значения Ease of Movement (EVM) под ценовым графиком. Сначала мы создаем пустой график с помощью функции plt.figure, а затем создаем два графика. На первом графике показан ценовой ряд AAPL, а на втором - значения EVM.
Скользящая средняя (MA)
Скользящая средняя - один из наиболее широко используемых технических индикаторов. Он используется вместе с другими техническими индикаторами или может служить строительным блоком для расчета других технических индикаторов.
«Скользящая средняя» - это среднее значение цен на активы за «x» дней/недель. Термин «скользящая» используется потому, что группа данных продвигается вперед с каждым новым торговым днем. Для каждого нового дня мы включаем цену этого дня и исключаем цену самого раннего дня в последовательности данных.
Наиболее часто используемые скользящие средние - 5-дневные, 10-дневные, 20-дневные, 50-дневные и 200-дневные.
Расчет
Существуют различные типы скользящих средних, используемых для анализа: простая скользящая средняя (SMA), взвешенная скользящая средняя (WMA) и экспоненциальная скользящая средняя (EMA).
Чтобы вычислить 20-дневную SMA, мы берем сумму цен за 20 дней и делим ее на 20. Чтобы прийти к следующей точке данных для 20-дневной SMA, мы включаем цену следующего торгового дня, исключая цену первого торгового дня. Таким образом группа данных продвигается вперед.
SMA присваивает одинаковые веса каждой ценовой категории в группе. Когда мы вычисляем 20-дневную WMA, мы присваиваем разные веса каждому ценовому пункту. Последняя цена, то есть цена 20-го дня, получает наибольший вес, а первая цена получает наименьший вес. Затем эта сумма делится на сумму используемых весов.
Чтобы вычислить 20-дневную EMA, мы сначала вычисляем самое первое значение EMA, используя простую скользящую среднюю. Затем мы вычисляем множитель, и после этого для вычисления второго значения EMA мы используем множитель и EMA предыдущего дня. Эта формула используется для вычисления последующих значений EMA.
SMA: 20 period sum / 20 Multiplier: (2 / (Time periods + 1)) = (2 / (20 + 1)) = 9.52% EMA: {Close price - EMA(previous day)} x multiplier + EMA(previous day).
Анализ
Скользящая средняя показывает, начался ли тренд, закончился или развернулся. Усреднение цен дает более гладкую линию, которая упрощает определение основного тренда. Однако скользящая средняя отстает от движения рынка.
Более короткая скользящая средняя более чувствительна, чем более длинная скользящая средняя. Однако она склонна генерировать ложные торговые сигналы.
Использование одной скользящей средней: даже одна скользящая средняя может использоваться для генерации торговых сигналов. Когда цена закрытия поднимается выше скользящей средней, генерируется сигнал на покупку, и наоборот. При использовании одной скользящей средней следует выбирать период усреднения таким образом, чтобы он был чувствителен к генерации торговых сигналов и в то же время нечувствителен к выдаче ложных сигналов.
Использование двух скользящих средних. Использование одной скользящей средней может быть невыгодным. Поэтому многие трейдеры используют две скользящие средние для генерации сигналов. В этом случае сигнал на покупку генерируется, когда более короткая средняя пересекает более длинную среднюю снизу вверх. Точно так же сигнал на продажу генерируется, когда более короткая средняя пересекает более длинную среднюю сверху вниз. Использование двух скользящих средних уменьшает количество ложных сигналов, которые более вероятны при использовании одной скользящей средней.
Трейдеры также используют три скользящих средних, например система 5, 10 и 20-дневного скользящего среднего, широко используемая на товарных рынках.
Код Python для вычисления скользящих средних для NIFTY
В приведенном ниже коде мы используем Series, скользящую среднюю и функции join для создания функций SMA и EWMA. Функция Series используется для формирования ряда, который представляет собой одномерный объект, подобный массиву, содержащий массив данных. Функция Rolling_mean принимает временной ряд или data frame вместе с числом периодов и вычисляет среднее значение. Функция join соединяет данный ряд с указанным рядом/dataframe.
# Moving Averages Code # Load the necessary packages and modules from pandas_datareader import data as pdr import matplotlib.pyplot as plt import yfinance import pandas as pd # Simple Moving Average def SMA(data, ndays): SMA = pd.Series(data['Close'].rolling(ndays).mean(), name = 'SMA') data = data.join(SMA) return data # Exponentially-weighted Moving Average def EWMA(data, ndays): EMA = pd.Series(data['Close'].ewm(span = ndays, min_periods = ndays - 1).mean(), name = 'EWMA_' + str(ndays)) data = data.join(EMA) return data # Retrieve the Nifty data from Yahoo finance: data = pdr.get_data_yahoo("^NSEI", start="2013-01-01", end="2016-01-01") data = pd.DataFrame(data) close = data['Close'] # Compute the 50-day SMA for NIFTY n = 50 SMA_NIFTY = SMA(data,n) SMA_NIFTY = SMA_NIFTY.dropna() SMA = SMA_NIFTY['SMA'] # Compute the 200-day EWMA for NIFTY ew = 200 EWMA_NIFTY = EWMA(data,ew) EWMA_NIFTY = EWMA_NIFTY.dropna() EWMA = EWMA_NIFTY['EWMA_200'] # Plotting the NIFTY Price Series chart and Moving Averages below plt.figure(figsize=(9,5)) plt.plot(data['Close'],lw=1, label='NSE Prices') plt.plot(SMA,'g',lw=1, label='50-day SMA (green)') plt.plot(EWMA,'r', lw=1, label='200-day EWMA (red)') plt.legend(loc=2,prop={'size':11}) plt.grid(True) plt.setp(plt.gca().get_xticklabels(), rotation=30)
Мы также построили ценовой ряд NIFTY, 50-дневную SMA и 200-дневную EWMA.
Rate of Change (ROC)
Rate of Change (ROC) - это технический индикатор, который измеряет процентное изменение между самой последней ценой и ценой «n» дней назад. Индикатор колеблется около нулевой линии.
Если ROC растет, это дает бычий сигнал, а падающий ROC дает медвежий сигнал. Можно вычислить ROC на основе разных периодов, чтобы измерить краткосрочный импульс или долгосрочный импульс.
Расчет
ROC = [(Close price today - Close price “n” day’s ago) / Close price “n” day’s ago))]
Код Python для вычисления Rate of Change (ROC)
Пример кода: 5-дневный Rate of Change (ROC) для NIFTY.
В приведенном ниже коде мы используем функции Series, diff, shift и join для вычисления Rate of Change (ROC). Функция Series используется для формирования ряда, который представляет собой одномерный объект, подобный массиву, содержащий массив данных. Функция diff вычисляет разницу в ценах между ценой текущего дня и ценой «n» дней назад. Функция shift используется для получения цены за предыдущий n-й день. Функция join соединяет данный ряд с указанным рядом/dataframe.
# Rate of Change code # Load the necessary packages and modules from pandas_datareader import data as pdr import matplotlib.pyplot as plt import yfinance import pandas as pd # Rate of Change (ROC) def ROC(data,n): N = data['Close'].diff(n) D = data['Close'].shift(n) ROC = pd.Series(N/D,name='Rate of Change') data = data.join(ROC) return data # Retrieve the NIFTY data from Yahoo finance: data = pdr.get_data_yahoo("^NSEI", start="2015-06-01", end="2016-01-01") data = pd.DataFrame(data) # Compute the 5-period Rate of Change for NIFTY n = 5 NIFTY_ROC = ROC(data,n) ROC = NIFTY_ROC['Rate of Change'] # Plotting the Price Series chart and the Ease Of Movement below fig = plt.figure(figsize=(7,5)) ax = fig.add_subplot(2, 1, 1) ax.set_xticklabels([]) plt.plot(data['Close'],lw=1) plt.title('NSE Price Chart') plt.ylabel('Close Price') plt.grid(True) bx = fig.add_subplot(2, 1, 2) plt.plot(ROC,'k',lw=0.75,linestyle='-',label='ROC') plt.legend(loc=2,prop={'size':9}) plt.ylabel('ROC values') plt.grid(True) plt.setp(plt.gca().get_xticklabels(), rotation=30)
Мы также нанесли ряд цен NIFTY и значения Rate of Change (ROC) под ценовым графиком. Сначала мы создаем пустой график с помощью функции plt.figure, а затем создаем два графика. На первом графике показан ценовой ряд NIFTY, а на втором - значения ROC.
Полосы Боллинджера
Концепция полос Боллинджера была разработана Джоном Боллинджером. Эти полосы состоят из верхней и нижней полос и расположены на два стандартных отклонения выше и ниже скользящей средней.
Полосы Боллинджера расширяются и сужаются в зависимости от волатильности. В период роста волатильности полосы расширяются и сужаются по мере уменьшения волатильности. Цены считаются относительно высокими, когда они поднимаются выше верхней полосы, и относительно низкими, когда они опускаются ниже нижней полосы.
Расчет
Чтобы создать полосы, мы сначала вычисляем SMA, а затем используем его для вычисления значений полос.
Middle Band = 20-day simple moving average (SMA) Upper Band = 20-day SMA + (2 x 20-day standard deviation of price) Lower Band = 20-day SMA - (2 x 20-day standard deviation of price)
Анализ
Чтобы использовать полосы Боллинджера для генерации сигналов, простым подходом было бы использовать верхнюю и нижнюю полосы в качестве целей для цены. Если цена отскакивает от нижней полосы и пересекает линию скользящей средней, верхняя полоса становится верхней целью цены.
В случае пересечения ценой линии скользящей средней вниз, нижняя полоса становится нижней целью цены.
Код Python для вычисления полос Боллинджера для NIFTY
В приведенном ниже коде мы используем функцию прокрутки для создания функции полосы Боллинджера. Методы среднего и стандартного отклонения используются для вычисления этих показателей с использованием цены закрытия. После того, как мы вычислили среднее значение и стандартное отклонение, мы вычисляем верхнюю полосу Боллинджера и нижнюю полосу Боллинджера. Функция полосы Боллинджера вызывается для ценовых данных NIFTY с использованием окна 50-дневной скользящей средней.
# Load the necessary packages and modules from pandas_datareader import data as pdr import yfinance import pandas as pd # Compute the Bollinger Bands def BBANDS(data, window=n): MA = data.Close.rolling(window=n).mean() SD = data.Close.rolling(window=n).std() data['UpperBB'] = MA + (2 * SD) data['LowerBB'] = MA - (2 * SD) return data # Retrieve the Nifty data from Yahoo finance: data = pdr.get_data_yahoo("^NSEI", start="2014-01-01", end="2016-01-01") data = pd.DataFrame(data) # Compute the Bollinger Bands for NIFTY using the 50-day Moving average n = 50 NIFTY_BBANDS = BBANDS(data, n) print(NIFTY_BBANDS) # Create the plot pd.concat([NIFTY_BBANDS.Close,NIFTY_BBANDS.UpperBB,NIFTY_BBANDS.LowerBB],axis=1).plot(figsize=(9,5),grid=True)
Индекс силы
Индекс силы был создан Александром Элдером. Индекс силы учитывает направление движения цены акции, протяженность движения цены акции и объем. Используя эти три элемента, он формирует осциллятор, который измеряет давление покупателей и продавцов.
Каждый из этих трех факторов играет важную роль в определении индекса силы. Например, большой рост цен, который определяется масштабом ценового движения, показывает сильное давление покупателей. Большое снижение объемов указывает на сильное давление со стороны продавцов.
Расчет
Пример: вычисление индекса силы (1) и индекса силы (15).
The Force index(1) = {Close (current period) - Close (prior period)} x Current period Volume
Индекс силы для 15-дневного периода - это экспоненциальная скользящая средняя 1-периодного индекса силы.
Анализ
Индекс силы может использоваться для определения или подтверждения тренда, выявления коррекций и предсказания разворотов с дивергенциями. Более короткий индекс силы используется для определения краткосрочного тренда, в то время как более длинный, например 100-дневный, может использоваться для определения долгосрочного тренда.
Индекс силы также может использоваться для выявления коррекций в заданном тренде. Для этого его можно использовать вместе с индикатором отслеживания тренда. Например, можно использовать 22-дневную EMA для тренда и 2-дневный индекс силы для выявления коррекций в тренде.
Код Python для вычисления индекса силы для акций Apple Inc. (AAPL)
В приведенном ниже коде мы используем функции Series, diff и join для вычисления индекса силы. Функция Series используется для формирования ряда, который представляет собой одномерный объект, подобный массиву, содержащий массив данных. Функция diff вычисляет разницу между текущей точкой данных и точкой данных с интервалом «n» периодов/дней. Функция join соединяет данный ряд с указанным рядом/dataframe.
# Load the necessary packages and modules from pandas_datareader import data as pdr import matplotlib.pyplot as plt import yfinance import pandas as pd # Force Index def ForceIndex(data, ndays): FI = pd.Series(data['Close'].diff(ndays) * data['Volume'], name = 'ForceIndex') data = data.join(FI) return data # Retrieve the Apple Inc. data from Yahoo finance: data = pdr.get_data_yahoo("AAPL", start="2010-01-01", end="2016-01-01") data = pd.DataFrame(data) # Compute the Force Index for AAPL n = 1 AAPL_ForceIndex = ForceIndex(data,n) print(AAPL_ForceIndex)
Комментариев нет:
Отправить комментарий