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
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.
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)
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.
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 |
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.
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.
chartSeries(BSESN)
addBBands()
chart_Series(BSESN)
getSymbols("^BSESN",src="yahoo" , from ="2016-03-23", to = Sys.Date())
## [1] "BSESN"
chart_Series(BSESN,type = "candlesticks")
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.
library(dplyr)
library(rbmfbovespa)
library(xts)
library(quantmod)
library(tidyquant)
library(ggplot2)
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)
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)
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)
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)
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))
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)
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.
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")
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"))
get <- getFX('USD/BRL' , from = '2015-08-01')
chart <- chartSeries(USDBRL)
addBBands()