рекомендации

пятница, 20 ноября 2020 г.

Полосы Боллинджера и их использование для анализа фондового рынка (с помощью Quandl & tidyverse в R)


Введение

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

Вот почему я решил создать эту серию статей. Следуя этой серии статей, вы поймете некоторые методы, используемые на фондовом рынке. Вы также можете применить их к параллельным доменам, которые я упоминал ранее.

В этом посте мы сделаем акцент на выявлении закономерностей, чтобы узнать, как ведет себя акция. Такое поведение, как вы увидите позже, очень важно для торговли акциями. В последней части я покажу, как прогнозировать цены акций, используя традиционную методологию ARIMA (Auto-Regressive intensive Moving Average Method) из анализа временных рядов. Так что давайте начнем!

Настройка системы

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

Quandl - для загрузки данных;
tidyverse - используем tibble для группировки и выполнения одной операции над несколькими группами;
Tidyquant - для временных рядов и финансовых функций.

Трейдинг с полосами Боллинджера

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

Что такое полосы Боллинджера?

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

С другой стороны, когда ширина полосы уменьшается, степень волатильности акций снижается. Иногда ширина полосы постоянна в течение периода времени, что указывает на одинаковое поведение определенной акции в течение этого периода времени.

Полоса Боллинджера включает три линии:
  • Средняя линия - это N-периодная скользящая средняя (MA), обычно 20-дневная SMA.
  • Верхняя линия на K стандартных отклонений цены выше N-периодной скользящей средней, обычно это 20-дневная SMA + (20-дневное стандартное отклонение цены х 2).
  • Нижняя линия на K стандартных отклонений цены ниже N-периодной скользящей средней, обычно это 20-дневная SMA - (стандартное отклонение цены на 20 дней x 2).
Примечание. SMA - это простая скользящая средняя, стандартное отклонение, периоды K и N обычно устанавливаются на 20 дней. Верхняя и нижняя полосы размещены на 2 единицы выше и ниже соответственно.

Ниже приведен типичный пример полосы Боллинджера. Она показывает волатильность акций Axis Bank за период 1 год с 1 сентября 2016 года по 1 сентября 2017 года. Разрыв был больше в период с сентября по декабрь.



Некоторые аспекты полос Боллинджера

В этом разделе мы обсудим несколько аспектов полос Боллинджера. Эта информация может быть использована в трейдинге.
  • Если восходящий тренд сильный, то цена акции регулярно касается верхней полосы и остается выше средней линии. Это сигнализирует о сильном движении вверх.
  • Если силен нисходящий тренд , то цена регулярно касается нижней полосы и остается ниже средней линии. Это свидетельствует о сильном движении вниз.
  • Во время восходящего тренда цена не должна быть ниже нижней полосы, иначе это сигнализирует об обратном движении.
  • Во время нисходящего тренда, если цена движется выше верхней полосы, это сигнализирует о движении вверх.
В исследовании будут обсуждаться вышеперечисленные моменты, а также выявление популярных паттернов, таких как «W - Bottoms» и «M - Tops» в полосе Боллинджера.

Мы будем поддерживать чистоту данных с помощью Tidyverse. В этом разделе мы сначала загрузим данные с помощью пакета Quandl, а затем будем работать с dataframe с помощью tidyverse, чтобы получить желаемый набор данных.
## Required Packages
library(Quandl)
library(tidyverse)
library(tidyquant)
library(timetk)
library(forecast)
library(gridExtra)
Код для Quandl и ключей API Quandl 

Если вы не прошли через это в моем предыдущем посте, посвященном сравнительному анализу акций, давайте настроим API Quandl.
## Setup the Quandl Free Acount and API Key, Please copy and paste the API key in order to #authinticate

Quandl.api_key("<Your-API-Key>")

## Download the data Set
ICICI = Quandl("NSE/ICICIBANK",collapse="daily",start_date="2016-09-01",type="raw")
PNB= Quandl("NSE/PNB",collapse="daily",start_date="2016-09-01",type="raw")
Axis=Quandl("NSE/AXISBANK",collapse="daily",start_date="2016-09-01",type="raw")
Canara=Quandl("NSE/CANBK",collapse="daily",start_date="2016-09-01",type="raw")
BOB=Quandl("NSE/BANKBARODA",collapse="daily",start_date="2016-09-01",type="raw")
SBI=Quandl("NSE/SBIN",collapse="daily",start_date="2016-09-01",type="raw")

## Add another ("Stock") coloumn in Datasets using cbind command

ICICI<-cbind(ICICI,Stock="")
PNB<-cbind(PNB,Stock="")
Axis<-cbind(Axis,Stock="")
SBI<-cbind(SBI,Stock="")
Canara<-cbind(Canara,Stock="")
BOB<-cbind(BOB,Stock="")

## Paste the stock name in stock coloumn

ICICI$Stock<-paste(ICICI$Stock,"ICICI",sep="")
PNB$Stock<-paste(PNB$Stock,"PNB",sep="")
Axis$Stock<-paste(Axis$Stock,"Axis",sep="")
SBI$Stock<-paste(SBI$Stock,"SBI",sep="")
Canara$Stock<-paste(Canara$Stock,"Canara",sep="")
BOB$Stock<-paste(BOB$Stock,"BOB",sep="")

## Consolidate under one dataset

Master_Data<-rbind(ICICI,PNB,Axis,SBI,Canara,BOB)  

## Coerce the Date variable into as.Date from character

Master_Data$Date<-as.Date(Master_Data$Date)

end<-ymd("2017-09-01")
start<-ymd("2016-09-01")

Master_Data<-Master_Data%>%
  tibble::as_tibble() %>%
group_by(Stock)

Идентификация паттернов

Существуют модели, которые обычно видны в данных фондового рынка. Эти модели (или сигналы) помогают нам определить поведение акций. Давайте быстро разберемся с двумя самыми популярными (W-Bottoms и M-Tops)

1. Сигнал: W-Bottoms

«W-Bottom» формируется в нисходящем тренде и включает два минимума. В частности, Боллинджер искал W-Bottoms там, где второй минимум ниже первого, но держится выше нижней полосы. Есть четыре шага для подтверждения паттерна Боллинджера «W-Bottoms»:
  • Во-первых, формирование минимума. Этот минимум обычно ниже нижней полосы (не всегда).
  • Во-вторых, отскок в сторону средней полосы.
  • В-третьих, формирование нового минимума. Этот минимум держится выше нижней полосы.
  • В-четвертых, паттерн подтверждается сильным движением от второго минимума и прорывом сопротивления.
На рисунке ниже паттерн «W-Bottoms» для BOB (Bank of Baroda). Оба W-Bottoms сопровождаются сильным движением вверх в феврале и мае 2017 года соответственно.



2. Сигнал: M-Tops

M-Top похож на двойной максимум. M-Tops - сигналы разворота от восходящего тренда в нисходящий. Первый максимум может быть выше или ниже, чем второй максимум. Первоначально есть волна повышения, которая приближается к верхней полосе или движется над ней. Затем цена будет двигаться вниз к средней полосе, а затем продолжит движение на север, может коснуться верхней полосы (иногда она поднимается выше предыдущего максимума), а затем не закрывается выше верхней полосы.

Боллинджер предлагает искать признаки подтверждения, когда ценные бумаги достигают новых максимумов. Пподтверждение происходит в три этапа:
  • Во-первых, котировка создает пик высоко над верхней полосой.
  • Во-вторых, откат к средней полосе.
  • В-третьих, цены движутся выше предыдущего максимума, но не достигают верхней полосы. Это предупреждающий знак. Неспособность второго максимума достичь верхней полосы демонстрирует ослабление импульса, что может предвещать разворот тренда. Окончательное подтверждение приходит с прорывом поддержки или сигналом медвежьего индикатора.
Ниже приведено изображение для сигнала M-Tops для акций SBI (Государственный банк Индии) в NSE в течение одного года, начиная с 1 сентября 2016 года по 1 сентября 2017 года. Каждый из M-Tops сопровождается снижением цен.


Если вы хотите получить больше информации о полосах Боллинджера и связанных с ними паттернах, ниже приведены ссылки на ресурсы:


Анализ волатильности акций банков

Давайте визуализируем волатильность (разрыв между верхней и нижней полосой), а также попытаемся определить паттерны/сигналы в наших шести выбранных банковских акциях.
## Visualisation of BBand in ggplot2 
 
 Master_Data%>%filter(Stock=="ICICI"|Stock=="PNB")%>%ggplot(aes(x=Date,y=Close))+
    geom_line(size=1)+
    geom_bbands(aes(high = High, low = Low, close = Close), ma_fun = SMA, sd=2,n = 20,size=0.75,
        color_ma = "royalblue4", color_bands = "red1")+
    coord_x_date(xlim = c(start, end), expand = TRUE)+
    facet_wrap(~ Stock, scales = "free_y")+
    labs(title = "Bollinger Band", x = "Date",y="Price") +
  theme(text = element_text(family = 'Gill Sans', color = "#444444",hjust=0.5)
        ,panel.background = element_rect(fill = 'lightyellow')
        ,panel.grid.minor = element_blank(),
        ,panel.grid.major = element_blank()
        ,plot.title = element_text(size = 20,hjust=0.5,colour="orangered4")
        ,axis.title = element_text(size = 18, color = '#555555')
        ,axis.title.y = element_text(hjust=0.5,size=15)
        ,axis.title.x = element_text(hjust = 0.5,size=15)
        ) +
theme(legend.position="none")

  1. MTOP сформировался в ноябре (сигнализация нисходящего тренда). Цены снизились до нового минимума до января 2017 года.
  2. Волатильность акций ICICI была очень высокой в октябре 2016 года. Она была постоянной в течение 3 месяцев (с марта по май 2017 года), когда цены находились в диапазоне от 265 до 285 рупий.
  3. PNB демонстрирует многократные MTOPS в течение года, за которыми следует сильный нисходящий тренд.
  4. PNB обладает высокой волатильностью, он показывает неустойчивое движение вверх и вниз в течение всего года. Он касается нового минимума ниже RS 120 в январе 2017 года и достигает нового максимума RS 175 в мае 2017 года.
Master_Data%>%filter(Stock=="Axis"|Stock=="SBI")%>%ggplot(aes(x=Date,y=Close))+
    geom_line(size=1)+
    geom_bbands(aes(high = High, low = Low, close = Close), ma_fun = SMA, sd=2,n = 20,size=0.75,
        color_ma = "royalblue4", color_bands = "red1")+
    coord_x_date(xlim = c(start, end), expand = TRUE)+
    facet_wrap(~ Stock, scales = "free_y")+
    labs(title = "Bollinger Band", x = "Date",y="Price") +
  theme(text = element_text(family = 'Gill Sans', color = "#444444",hjust=0.5)
        ,panel.background = element_rect(fill = 'lightyellow')
        ,panel.grid.minor = element_blank(),
        ,panel.grid.major = element_blank()
        ,plot.title = element_text(size = 20,hjust=0.5,colour="orangered4")
        ,axis.title = element_text(size = 18, color = '#555555')
        ,axis.title.y = element_text(hjust=0.5,size=15)
        ,axis.title.x = element_text(hjust = 0.5,size=15)
        ) +
theme(legend.position="none")

  1. MTOP сформировался в октябре 2016 года (сигнализация о нисходящем тренде). Цены снизились до нового минимума до января 2017 года до 420 с предыдущего максимума в 650 рупий в сентябре 2016 года. За 4 месяца цены снизились на 230 рупий.
  2. Волатильность для акций ICICI была выше в течение 6 месяцев до марта 2017 года. Но после марта цены варьировались от 470 до 520 рупий. Здесь они были почти постоянным и, похоже, сходились.
  3. SBI демонстрирует многократные MTOPS в течение года, за которыми следует сильная тенденция к снижению цен.
  4. ВОО обладает высокой волатильностью, он показывает неустойчивое движение вверх и вниз в течение года.
Master_Data%>%filter(Stock=="Canara"|Stock=="BOB")%>%ggplot(aes(x=Date,y=Close))+
    geom_line(size=1)+
    geom_bbands(aes(high = High, low = Low, close = Close), ma_fun = SMA, sd=2,n = 20,size=0.75,
        color_ma = "royalblue4", color_bands = "red1")+
    coord_x_date(xlim = c(start, end), expand = TRUE)+
    facet_wrap(~ Stock, scales = "free_y")+
    labs(title = "Bollinger Band", x = "Date",y="Price") +
  theme(text = element_text(family = 'Gill Sans', color = "#444444",hjust=0.5)
        ,panel.background = element_rect(fill = 'lightyellow')
        ,panel.grid.minor = element_blank(),
        ,panel.grid.major = element_blank()
        ,plot.title = element_text(size = 20,hjust=0.5,colour="orangered4")
        ,axis.title = element_text(size = 18, color = '#555555')
        ,axis.title.y = element_text(hjust=0.5,size=15)
        ,axis.title.x = element_text(hjust = 0.5,size=15)
        ) +
theme(legend.position="none")
  1. Обе акции BOB и Canara демонстрируют аналогичное движение цен в течение года, обе они снижались с октября 2016 года до середины января 2017 года, а затем показывали повышение до апреля. Но после апреля обе акции шли в противоположных направлениях. Canara пошла на север, а BOB на юг.
  2. BOB показывает W-Bottoms в январе 2017 и апреле, после чего наблюдается сильное восходящее движение.
Прогнозирование цен акций

В этом разделе мы прогнозируем цены для двух выбранных банков PNB и Axis Bank. На фондовом рынке, как правило, цены являются динамическими и зависят от различных факторов, таких как новости, погода, государственная политика, процентная ставка. Трудно предсказать поведение цены акций, поскольку оно зависит от множества факторов. Чтобы получить большую точность прогнозов, мы использовали два разных подхода к прогнозированию:
  • Регрессия
  • ARIMA (Auto Regressive Intensive Moving Average)
В последнем посте мы видели, что цены на акции также зависят от объема торгов, но направление может быть любым. В нашем анализе мы будем принимать во внимание эти движения. Мы также проанализируем случайную часть движения цены акций, так называемый белый шум, и включим в нашу модель прогнозирования.


Следующие пункты являются последовательными шагами в прогнозировании:

1. Скачиваем набор данных в формате mothly из Quandl.
2. Строим регрессионные модели «m1» и «m3»
3. Создаем модель ARIMA «p2.df» и «p4.df».
4. Объединяем регрессию и модель ARIMA «p1.df» и «p3.df».
5. Набор данных прогнозирования имеет такие параметры, как цена закрытия, доверительные интервалы (“lwr(lower)” & “upr(Upper)”, Key (Prediciton/Actual)).
6. Добавляем переменную Date в набор данных predcition для трех месяцев: октябрь, ноябрь и декабрь.
7. Переупорядочиваем столбцы наборов данных для прогнозирования.
8. Модифицируем фактические наборы данных для Axis Bank и PNB, сохраняем только дату и цену закрытия с помощью пакета dplyr.
9. Добавляем переменные, такие как доверительный интервал («lwr» и «upr»), «Key».
10. Объединяем прогнозный и фактический набор данных в новый фрейм данных, такой как «Axis_com».
11. Применяем ggplot для обоих наборов данных.
12. Используем пакет gridExtra, чтобы разместить графики.

Примечание: ggplot показывает прогноз и фактические цены. Предсказанные цены на предсказания имеют полосу для нижнего и верхнего предела.
    ## Download the data Set
PNB = Quandl("NSE/ICICIBANK",collapse="monthly",start_date="2016-09-01",type="raw")
Axis=Quandl("NSE/AXISBANK",collapse="monthly",start_date="2016-09-01",type="raw")

## Convert the PNB & Axis Data Set into df for regression model

PNB_df=PNB
Axis_df=Axis
colnames(PNB_df)<-c("Date","Open","High","Low","Last","Close","TTQ","Turnover")
colnames(Axis_df)<-c("Date","Open","High","Low","Last","Close","TTQ","Turnover")

## Change the scale of Trade quantity

PNB_df$TTQ<-PNB_df$TTQ/100000
Axis_df$TTQ<-Axis_df$TTQ/100000

## Regression models

m1=lm(PNB_df$Close~PNB_df$High+PNB_df$Low+PNB_df$TTQ)

p1.df=as.data.frame(predict(m1,interval="predict"))

m3=lm(Axis_df$Close~Axis_df$High+Axis_df$Low+Axis_df$TTQ)

p3.df=as.data.frame(predict(m3, interval="predict"))

## Forecast using ARIMA to take out the seasonality and cyclic part of the stock

m2=arima(diff(PNB_df$Close),order=c(1,0,0))
m4=arima(diff(Axis_df$Close),order=c(1,0,0))
p2.df=as.data.frame(predict(m2,n.ahead=3))
p4.df=as.data.frame(predict(m4,n.ahead=3))

## Combining the Random and Stock  together

p1.df=p1.df[1:3,]
p1.df$fit=p1.df$fit+p2.df$pred
p3.df=p3.df[1:3,]
p3.df$fit=p3.df$fit+p4.df$pred

## Create the date df for next three months

date<-as.data.frame(as.Date(c("2017-10-31","2017-11-30","2017-12-31")))
colnames(date)=c("date")

## Modify the predict dataset and add "key" variable for PNB

p1.df<-cbind(p1.df,date)
p1.df["Key"]<-"Predicted"
p1.df<-p1.df[,c("date","fit","lwr","upr","Key")]

## Modify the predict dataset for Axis and add variable "Key"

p3.df<-cbind(p3.df,date)
p3.df["Key"]<-"Predicted"
p3.df<-p3.df[,c("date","fit","lwr","upr","Key")]


## Rename the columns
colnames(p1.df)<-c("Date","Close","lwr","upr","Key")
colnames(p3.df)<-c("Date","Close","lwr","upr","Key")

## Modify the PNB_df dataset

PNB_df<-PNB%>%select("Date","Close")
Axis_df<-Axis%>%select("Date","Close")

## Add two variable for confidence interval "lwr" and "upr"
var<-c("lwr","upr")

PNB_df[var]<-NA
Axis_df[var]<-NA

## Add the Key variable for Actual data

PNB_df["Key"]<-"Actual"
Axis_df["Key"]<-"Actual"

## Rbind the predicted and actual value for both of the Stocks

PNB_com=rbind(PNB_df,p1.df)
PNB_com$Date<-as.Date(PNB_com$Date)

Axis_com=rbind(Axis_df,p3.df)
Axis_com$Date<-as.Date(Axis_com$Date)

## Visualisation

PNB_Plot<-ggplot(data=PNB_com,aes(x= Date, y = Close,color=Key,label=Close)) +
  # Prediction intervals
  geom_ribbon(aes(ymin = lwr, ymax = upr, fill = Key), 
              fill = "khaki2", size = 0)+
  geom_line(size = 1.7) + 
  geom_point(size = 2)+
  labs(title = "Actual and Predicted Price, PNB", x = "Date",y="Price") +
  theme(text = element_text(family = 'Gill Sans', color = "#444444",hjust=0.5)
        ,panel.background = element_rect(fill = "honeydew")
        ,panel.grid.minor = element_blank()
        ,panel.grid.major = element_blank()
        ,plot.title = element_text(size = 20,hjust=0.5,colour="orangered4")
        ,axis.title = element_text(size = 18, color = '#555555')
        ,axis.title.y = element_text(hjust=0.5,size=15)
        ,axis.title.x = element_text(hjust = 0.5,size=15))

Axis_Plot<- ggplot(data=Axis_com,aes(x= Date, y = Close,color=Key,label=Close)) +
  # Prediction intervals
  geom_ribbon(aes(ymin = lwr, ymax = upr, fill = Key), 
              fill = "khaki2", size = 0)+
  geom_line(size = 1.7) + 
  geom_point(size = 2)+
  labs(title = "Actual and Predicted Price, Axis Bank", x = "Date",y="Price") +
  theme(text = element_text(family = 'Gill Sans', color = "#444444",hjust=0.5)
        ,panel.background = element_rect(fill = "honeydew")
        ,panel.grid.minor = element_blank()
        ,panel.grid.major = element_blank()
        ,plot.title = element_text(size = 20,hjust=0.5,colour="orangered4")
        ,axis.title = element_text(size = 18, color = '#555555')
        ,axis.title.y = element_text(hjust=0.5,size=15)
        ,axis.title.x = element_text(hjust = 0.5,size=15))

## Plots

grid.arrange(PNB_Plot,Axis_Plot,ncol = 1, nrow = 2)


Заключение

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

Комментариев нет:

Отправить комментарий