I M P O R T A N T E

O CONTEÚDO CONTIDO AQUI É UM AGREGADO DAS SEGUINTES FONTES:

R-Bloggers: Stock Analysis using R

Big Data Enthusiast - Stock Market Analysis Using R

Wilson Freitas - Usando dados do rbmfbovespa para construir gráficos candlestick no R

Pacote quantmod - Análise quantitativa de séries financeiras.

quantmod - Quantitative Financial Modelling & Trading Framework for R

Introduction

Deseja fazer alguns rápidos, em profundidade análise técnica do preço das ações APPLE, ou até mesmo VALE5 na BM & FBovespa e entre outros usando R? Há um pacote para isso!

O pacote Quantmod (Quantitative Financial Modelling & Trading Framework for R), permite que você desenvolva, teste e implante os modelos de negociação estatisticamente baseados. Ele fornece a infra-estrutura para download e importação de dados de uma variedade de locais, analisar esses dados e produzir gráficos que ajudam a determinar tendências estatísticas. Eu apreciei como este pacote a atenção em um comentário recente, e o uso dele por alguns profissionais da área. Também é notado que a Revolution Analytics havia destacado o pacote em sua página de finanças. Na verdade, tinha me deparado com Quantmod há alguns meses, e instantaneamente me entusiasmou com o poder do R. Para dar uma idéia do uso típico, usou se os seguinte comandos abaixo para criar um gráfico de ações dos últimos três meses de dados da Apple, mas pode ser de qualquer outra empresa.

Os primeiros passos

Primeiramente se instala o pacote dentro do R ou RStudio, usando o comando install.packages(“quantmod”), e logo após a instalação do pacote, usa-se o comando library(“quantmod”), ou require(“quantmod”), neste caso usamos o library(“quantmod”).

install.packages("quantmod")
library("quantmod")

A função getSymbols é usada para ir buscar os dados de ações na bolsa de valores. Os dados podem ser originados em vários locais. No exemplo acima, estamos obtendo uma única ação, a AAPL da Apple. Se você quiser fazer o download de várias cotações de ações diferentes, pode fazê-lo em um único comando, conforme o exemplo:

getSymbols("AAPL")
getSymbols(c("ORCL","IBM"))

Depois de ter buscado os dados de ações, você pode se concentrar nos conjuntos dos dados rapidamente.AAPL[‘2017-01-03::2017-03-03’]. A tabela contendo os dados não será mostrada, pois contem muitos dados. Mas pode ser visualida executando o comando view(AAPL).

view(AAPL)

Gerando o gráficos candlestick.

A função chartSeries é usada para gerar o gráfico dos dados que foi coletado. Neste caso, usamos um comando adicional subset para usar apenas as informações referentes aos ultimos 3 meses.

chartSeries(AAPL, subset="last 3 months")
## [1] "AAPL"

Caso deseje adicionar as Bollinger Bands que para a Análise Técnica, é um indicador caracterizado por uma média móvel com duas bandas, uma superior e outra inferior que se situam respectivamente em N desvios padrões da média móvel.

addBBands()

Logo abaixo o grafico com a adição das Bandas de Bollinger.

Gráfico da Série no Tempo.

chart_Series(AAPL)

Faremos o mesmo para as outras duas ações que coletamos: IBM, ORCL.

getSymbols(c("ORCL","IBM"))
getSymbols(c("ORCL","IBM"))
## [1] "ORCL" "IBM"

chart_Series(ORCL)

chart_Series(IBM)

O comando chart_Series gera os graficos das séries no tempo, e o comando chartSerie cria os gráficos de candlestick ilustrados acima. Ele captura uma grande quantidade de informações, a data, preço de abertura e fechamento e volume de negociação para cada dia. Finalmente, a chamada addBBands () adiciona Bollinger Bands ao gráfico. Informalmente, isso equivale a uma linha indicando média móvel e duas linhas um desvio padrão acima e abaixo desta média móvel. Para os não iniciados, os indicadores técnicos (e sobreposições) podem ser divididos em quatro categorias - Tendência, Volatilidade, Momentum e Volume.

Você também pode mesclar dados para ver comparações, ou montar tabelas com as referentes informações.

tail.matrix(as.xts(merge(ORCL,IBM))) ## para fazer comparação
tail.matrix(as.xts(merge(ORCL))) ## para gerar tabela apenas da ORCL
##            ORCL.Open ORCL.High ORCL.Low ORCL.Close ORCL.Volume
## 2017-02-24     42.74     43.19    42.68      43.17    11384000
## 2017-02-27     43.26     43.26    42.52      42.70    13843900
## 2017-02-28     42.62     42.75    42.42      42.59    14427400
## 2017-03-01     42.75     43.00    42.69      42.92    11391100
## 2017-03-02     42.83     42.93    42.63      42.89     9418200
## 2017-03-03     42.77     42.89    42.59      42.69     8917100
##            ORCL.Adjusted
## 2017-02-24         43.17
## 2017-02-27         42.70
## 2017-02-28         42.59
## 2017-03-01         42.92
## 2017-03-02         42.89
## 2017-03-03         42.69
knitr::kable(tail.matrix(as.xts(merge(ORCL))))
ORCL.Open ORCL.High ORCL.Low ORCL.Close ORCL.Volume ORCL.Adjusted
42.74 43.19 42.68 43.17 11384000 43.17
43.26 43.26 42.52 42.70 13843900 42.70
42.62 42.75 42.42 42.59 14427400 42.59
42.75 43.00 42.69 42.92 11391100 42.92
42.83 42.93 42.63 42.89 9418200 42.89
42.77 42.89 42.59 42.69 8917100 42.69
tail.matrix(as.xts(merge(IBM))) ## para gerar tabela apenas da IBM
##            IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
## 2017-02-24   180.21   181.49  179.89    181.35    3267800       181.35
## 2017-02-27   181.19   181.25  179.28    179.40    3672000       179.40
## 2017-02-28   179.38   180.63  179.35    179.82    3272500       179.82
## 2017-03-01   180.48   182.55  180.03    181.95    2960000       181.95
## 2017-03-02   181.88   181.88  180.43    180.53    2913600       180.53
## 2017-03-03   180.53   181.32  179.76    180.05    1822000       180.05
knitr::kable(tail.matrix(as.xts(merge(IBM))))
IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
180.21 181.49 179.89 181.35 3267800 181.35
181.19 181.25 179.28 179.40 3672000 179.40
179.38 180.63 179.35 179.82 3272500 179.82
180.48 182.55 180.03 181.95 2960000 181.95
181.88 181.88 180.43 180.53 2913600 180.53
180.53 181.32 179.76 180.05 1822000 180.05
tail.matrix(as.xts(merge(AAPL))) ## para gerar tabela apenas da ORCL
##            AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume
## 2017-02-24    135.91    136.66   135.28     136.66    21690900
## 2017-02-27    137.14    137.44   136.28     136.93    20196400
## 2017-02-28    137.08    137.44   136.70     136.99    23403500
## 2017-03-01    137.89    140.15   137.60     139.79    36272400
## 2017-03-02    140.00    140.28   138.76     138.96    26153300
## 2017-03-03    138.78    139.83   138.59     139.78    21108100
##            AAPL.Adjusted
## 2017-02-24        136.66
## 2017-02-27        136.93
## 2017-02-28        136.99
## 2017-03-01        139.79
## 2017-03-02        138.96
## 2017-03-03        139.78
knitr::kable(tail.matrix(as.xts(merge(AAPL))))
AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
135.91 136.66 135.28 136.66 21690900 136.66
137.14 137.44 136.28 136.93 20196400 136.93
137.08 137.44 136.70 136.99 23403500 136.99
137.89 140.15 137.60 139.79 36272400 139.79
140.00 140.28 138.76 138.96 26153300 138.96
138.78 139.83 138.59 139.78 21108100 139.78

Extraindo outros dados do mercado de ações

Usando novamente a função getSymbols mas com alguns comandos adicionais (“SYMBOL”, src = “SOURCE”, de = “AAAA-MM-DD”, para = “AAAA-MM-DD”)

Alguns fontes para colocar no comando src são: yahoo, google, oanda etc.

Primeiramente será extraido o Bombay Stock Exchange Data usando fonte de finanças yahoo. Índice / símbolo da bolsa de valores de Bombaim - BSESN.

Analise dos dados de um mês da Bolsa de Bombaim.

library(quantmod)
 
getSymbols("^BSESN",src="yahoo" , from ="2017-01-03", to = "2017-02-03")
 
View(BSESN)
## [1] "BSESN"
knitr::kable(BSESN)
BSESN.Open BSESN.High BSESN.Low BSESN.Close BSESN.Volume BSESN.Adjusted
26616.92 26724.40 26488.37 26643.24 9800 26643.24
26677.22 26723.37 26606.06 26633.13 8100 26633.13
26738.42 26917.21 26738.42 26878.24 9800 26878.24
26929.69 27009.61 26733.33 26759.23 7800 26759.23
26860.81 26860.88 26701.18 26726.55 6400 26726.55
26811.63 26914.95 26804.17 26899.56 8600 26899.56
26978.44 27174.87 26978.44 27140.41 12000 27140.41
27171.66 27278.93 27166.69 27247.16 11700 27247.16
27378.01 27459.75 27143.07 27238.06 10200 27238.06
27238.35 27335.08 27172.68 27288.17 12600 27288.17
27331.82 27381.43 27179.19 27235.66 8100 27235.66
27261.76 27422.67 27217.65 27257.64 9500 27257.64
27253.34 27348.19 27219.89 27308.60 10800 27308.60
27232.69 27264.41 27009.81 27034.50 8800 27034.50
26990.93 27167.79 26963.58 27117.34 6600 27117.34
27170.88 27393.35 27140.85 27375.58 6800 27375.58
27462.83 27736.83 27439.68 27708.14 12200 27708.14
27761.03 27980.39 27759.48 27882.46 14300 27882.46
27866.80 27947.37 27813.32 27849.56 8600 27849.56
27867.92 27867.92 27624.54 27655.96 10700 27655.96
27669.08 28159.54 27590.10 28141.64 18200 28141.64
28167.83 28299.92 28070.81 28226.61 17200 28226.61
28270.67 28280.58 28127.18 28240.52 10800 28240.52

Aqui está a tabela da BSESN (em objeto xts) Dados de Saída. Nesta tabela pode ser vista as diferentes colunas com dados para Open, High, Low, Close, Volume & Ajusted Stock Price.

High (Alta) refere-se ao preço mais alto da ação tocada no mesmo dia, Low (Baixa) refere-se ao preço mais baixo a ação foi negociada no mesmo dia, Close (Fechar) refere-se ao preço de fechamento daquele estoque específico e o Volume (Volume) referem-se ao número de ações negociadas que dia.

Gráficos de Saída.

chartSeries(BSESN)

addBBands()

chart_Series(BSESN)

Analise dados de um ano da Bolsa de Bombaim

getSymbols("^BSESN",src="yahoo" , from ="2016-03-23", to = Sys.Date())
## [1] "BSESN"
chart_Series(BSESN,type = "candlesticks")

Usando dados do BM&FBovespa com o pacote rbmfbovespa

A BM&FBovespa disponibiliza arquivos de cotações históricas do mercado de ações, que incluem informações diárias de todos os contratos negociados, que são:

ações: mercado à vista e fracionário

UNITS: que são carteiras de ações de uma mesma empresa, por exemplo, a UNIT SANB11 é composta por 1 ação PN + 1 ação ON do Santander.

ETFs e fundos

opções de ações, ETFs e índices

termo de ações

futuros

Estes arquivos podem ser baixados do site da bolsa com informações de

séries anuais

séries mensais

séries diárias (do ano corrente)

veja mais em Séries históricas

O arquivo anual traz informações de diversos contratos para todos os dias do ano fechado, por exemplo, o arquivo COTAHIST_A2016.TXT traz dados de todo o ano de 2016. Eventualmente alguns ativos não apresentam informações para todas as datas, isso acontece quando na data não há negócios no ativo.

Bem, estes arquivos anuais, que contém informação diária para diversos ativos, podem ser utilizados para construir gráficos de histórico de preços, em particular os gráficos candlestick que contem informações de abertura, fechamento, máxima e mínima de ativos negociados, ou simplismente informações OHLC (short for Open, High, Low, Close). Estas informações e também o Volume podem ser obtidas no arquivo de cotações históricas. Estas informações serão extraídas do arquivo para a construção de objetos xts que serão utilizados nas funções de construção de gráficos dos pacotes Quantmod e ggplot2.

Então o objetivo deste exercício é carregar os dados de 2016 utilizando rbmfbovespa, preparar os dados construindo objetos xts para alguns ativos e montar os gráficos.

Primeiramente os pacotes devem ser carregados e todos os pacotes abaixo são necessários neste exercício.

library(dplyr)
library(rbmfbovespa)
library(xts)
library(quantmod)
library(tidyquant)
library(ggplot2)

O arquivo de cotações históricas para 2016 pode ser baixado daqui e carregado com a função rbmfbovespa::read_marketdata.

ch_2017 <- read_marketdata('SEU-DIRETÓRIO/COTAHIST_A2017.TXT', 'COTAHIST')

O arquivo COTAHIST possui múltiplas partes e a função read_marketdata retorna uma lista descrevendo as partes o seu conteúdo, que é um data.frame. A segunda parte contém as informações históricas dos ativos e é a parte que nos interessa, as demais partes em geral ajudam na validação do arquivo.

A segunda parte será filtrada pela coluna cod_negociacao que traz o ticker dos ativos. O filtro será aplicado primeiramente para obter as informações referentes a ETF BOVA11 no dataset BOVA11.x. Em seguida o data.frame BOVA11.df será construído com os nomes das colunas seguindo o padrão de nomes do pacote quantmod para representar as informações OHLC. As variáveis do COTAHIST referentes a OHLC são: preco_abertura, preco_max, preco_min, preco_ult e volume_titulos_negociados. Então o data.frame BOVA11.df é utilizado na função as.xts na criação do objeto xts BOVA11 para uso com as funções do pacote quantmod.

Para conhecer as variáveis dos datasets criados com rbmfbovespa execute o addin do RStudio rbmfbovespa View Template.

Selecione um template para visualizar todas as colunas tratadas pelo dataset com informação de tipo e descrição. Selecione o template COTAHIST e depois feche a janela de templates.

Após é inserido todo o código de construção.

BOVA11.df <- ch_2017[[2]] %>% filter(cod_negociacao == 'BOVA11') %>%
  select(
    Date = data_referencia,
    Open = preco_abertura,
    High = preco_max,
    Low = preco_min,
    Close = preco_ult,
    Volume = volume_titulos_negociados
  )

BOVA11 <- as.xts(select(BOVA11.df, -Date), order.by = BOVA11.df$Date)

Criado o objeto de séries temporais é só passar para função quantmod::candleChart.

## function (filename, template = NULL, parse_fields = TRUE) 
## {
##     template <- .retrieve_template(filename, template)
##     template$read_file(filename, parse_fields)
## }
## <environment: namespace:rbmfbovespa>
## Warning in apply_rule.regex_rule(.rule, data): NAs introduced by coercion
## to integer range
candleChart(BOVA11)

addBBands()

chart_Series(BOVA11)

Trabalhando com uma Série mais longa. COTAHIST_A2016.

ch_2016 <- read_marketdata('SEU-DIRETÓRIO/COTAHIST_A2016.txt', 
                           'COTAHIST')

BOVA11.df <- ch_2016[[2]] %>% filter(cod_negociacao == 'BOVA11') %>%
  select(
    Date = data_referencia,
    Open = preco_abertura,
    High = preco_max,
    Low = preco_min,
    Close = preco_ult,
    Volume = volume_titulos_negociados
  )

BOVA11 <- as.xts(select(BOVA11.df, -Date), order.by = BOVA11.df$Date)
rbmfbovespa::read_marketdata
## function (filename, template = NULL, parse_fields = TRUE) 
## {
##     template <- .retrieve_template(filename, template)
##     template$read_file(filename, parse_fields)
## }
## <environment: namespace:rbmfbovespa>
ch_2016 <- read_marketdata('C:/Users/Eu/Desktop/R/COTAHIST_A2016.txt', 
                           'COTAHIST')
## Warning in apply_rule.regex_rule(.rule, data): NAs introduced by coercion
## to integer range
BOVA11.df <- ch_2016[[2]] %>% filter(cod_negociacao == 'BOVA11') %>%
  select(
    Date = data_referencia,
    Open = preco_abertura,
    High = preco_max,
    Low = preco_min,
    Close = preco_ult,
    Volume = volume_titulos_negociados
  )

BOVA11 <- as.xts(select(BOVA11.df, -Date), order.by = BOVA11.df$Date)

##  Criado o objeto de séries temporais é só passar para função 
##  quantmod::candleChart.

candleChart(BOVA11)

addBBands()

chart_Series(BOVA11)

Construindo as séries temporais para a VALE5 e aplicando o tema white ao gráfico.

VALE5.df <- ch_2017[[2]] %>% filter(cod_negociacao == 'VALE5') %>%
  select(
    Date = data_referencia,
    Open = preco_abertura,
    High = preco_max,
    Low = preco_min,
    Close = preco_ult,
    Volume = volume_titulos_negociados
  )
VALE5 <- as.xts(select(VALE5.df, -Date), order.by = VALE5.df$Date)

### Gerar gráfico.
candleChart(VALE5, theme='white')

addBBands()

chart_Series(VALE5)

O data.frame utilizado na construção do objeto de séries temporais da VALE5 pode ser utilizado com funções do pacote tidyquant para a criação de um gráfico de candlesticks utilizando o ggplot2.

ggplot(BOVA11.df, aes(x = Date, y = Close)) +
  geom_candlestick(aes(open = Open, close = Close, high = High, low = Low))

O pacote tidyquant estende diversas funções do pacote quantmod, de forma que é possível incluir nos gráficos do ggplot2 medidas de análise técnica com média móvel, por exemplo.

ggplot(BOVA11.df, aes(x = Date, y = Close)) +
  geom_candlestick(aes(open = Open, close = Close, high = High, low = Low)) +
  geom_ma(ma_fun = SMA, n = 50, color = "red", linetype = 4, size = 1)

Usando os mesmo exemplos com VALE5.

ggplot(VALE5.df, aes(x = Date, y = Close)) +
  geom_candlestick(aes(open = Open, close = Close, high = High, low = Low))

ggplot(VALE5.df, aes(x = Date, y = Close)) +
  geom_candlestick(aes(open = Open, close = Close, high = High, low = Low)) +
  geom_ma(ma_fun = SMA, n = 15, color = "red", linetype = 4, size = 1)

ggplot(VALE5.df, aes(x = Date, y = Close)) +
  geom_candlestick(aes(open = Open, close = Close, high = High, low = Low)) +
  geom_ma(ma_fun = SMA, n = 5, color = "red", linetype = 4, size = 1)

Estes gráficos com o ggplot2 são particularmente interessantes porque o ggplot2 vem se tornando um padrão na criação de gráficos no mundo R. Por esse motivo iniciativas como o tidyquant tem relevância, além de reforçar a construção de dados em formato tidy, reforçando boas práticas em análise de dados. Entretanto, estes gráficos no ggplot2 ainda precisam de uma melhora significativa no visual, mas isso é work in progress.

Bem, temos aí os gráficos de candlesticks facilmente criados com o R, gráficos estáticos e dinâmicos. O pacote rbmfbovespa ajudando no carregamento dos dados e o restante é apenas manipulação de dados.

podemos fazer o download dos dados dos ativos PETR4.SA e PETR3.SA por meio do seguinte código:

#Cria um novo ambiente para armazenar os dados
stockData <- new.env() 
 
#Especifica as datas de interesse
startDate = as.Date("2010-01-01") 
endDate = as.Date("2011-12-31")
#Obtêm os dados do ativo PETR4 e PETR3
ativos<-c("PETR4.SA","PETR3.SA")
getSymbols(ativos, src="yahoo",from=startDate,to=endDate)
## [1] "PETR4.SA" "PETR3.SA"

No comando acima, os dados dos ativos PETR4.SA e PETR3.SA são obtidos para as datas 01/01/2010 até 31/12/2011. A fonte desses dados é o Yahoo Finance. É possível, utilizar outras fontes como o Google Finance nesse caso basta trocar a opção src="yahoo" pela opção src="google".

#Plota a série temporal dos preços de fechamento
plot.xts(PETR4.SA$PETR4.SA.Close,major.format="%b/%d/%Y",
         main="PETR4.SA.",ylab="Close price.",xlab="Time")

#Calcula o log-retorno.
diffPETR4.SA<-diff(log(PETR4.SA))
 
#Plota a série temporal dos preços de fechamento
plot.xts(diffPETR4.SA$PETR4.SA.Close,major.format="%b/%d/%Y",
         main="PETR4.SA.",ylab="Log-return Close price.",xlab="Time")

Pode-se trabalhar inclusive com um subsets de dados para uma determinada janela:

#Examinando apenas um mês de dados.
petrSubset<-  window(diffPETR4.SA, start = as.Date("2011-05-01"), 
                     end = as.Date("2011-05-31"))

Para finalizar

get <- getFX('USD/BRL' , from = '2015-08-01')
chart <- chartSeries(USDBRL)

addBBands()