Este material tem como objetivo ensinar como usar diversos pacotes do R para coletar dados financeiros e econômicos de fontes públicas como Banco Central do Brasil, BM&F Bovespa, IBGE, IPEA, Google Finance, Yahoo Finance, FED, etc.
Imagine que você precisa analisar uma ação qualquer e tomar a decisão de comprar ou não tal ação. Possivelmente, você terá que pagar por algum serviço que tenha dados do histórico do preço desta ação, os resultados operacionais da empresa bem como notícias vinculadas à empresa na mídia. Outra opção é você acessar o site de relacionamento com investidores da empresa e tentar pegar os dados do site. Para isso, será necessário fazer o download dos dados, talvez manuseá-los para que fiquem no formato de seu interesse e após isso fazer suas análises.
Note que para chegar no objetivo crucial que é analisar os dados da empresa e tomar uma decisão de comprar ou não a ação, você provavelmente perdeu bastante tempo tentando acessar as informações necessárias.
Felizmente, por meio do R conseguimos acessar fontes públicas que nos ajudam com a disponibilização de dados de uma forma mais simples e eficiente. Dentre as várias fontes, temos:
Para tanto, temos duas alternativas. Uma delas é acessar as APIs destas instituições por meio do R e coletar os dados. Outra alternativa, é fazer uso de pacotes do R que facilitam o acesso às APIs por meio de funções que são bem mais simples de utilizar.
Neste material, vamos usar pacotes, mas caso queira entender como manusear uma API, observe a explicação contida no material Programação em R - Importar Dados. Os pacotes que permitirão acessar os dados das instituições citadas são:
O Quandl é uma plataforma que disponibiliza milhares de fontes de dados públicos e privados para usuários de diversas tecnologias e linguagens de programação. Além disso, a plataforma fornece uma API que pode ser facilmente incorporada em outras tecnologias. Maiores detalhes de todas as opções de uso do Quandl, podem ser encontrados neste link.
Especificamente para o R, o Quandl tem um pacote (Quandl) que permite acessar todos os dados (públicos e privados) diretamente do R. Para tanto, o pacote tem funções que usam a API do Quandl para buscar e processar as requisições.
Lembrando que é necessário se cadastrar no site do Quandl para ter uma Quandl.api_key que permitirá acessar uma maior quantidade de dados (sem ela você tem um limite diário) ou até mesmo dados que você adquiriu do Quandl (dados privados e que são pagos). Na imagem abaixo, você encontrará as instruções necessárias para criar sua conta no Quandl.
Para coletar dados do Banco Central do Brasil (BACEN) no R via Quandl precisamos dos seguintes passos:
# Instalar pacotes (só executar uma vez)
# install.packages(c("Quandl", "dygraphs", "magrittr", "PerformanceAnalytics", "quantmod"))
# Carregar pacotes necessários
suppressMessages(require(Quandl))
suppressMessages(require(dygraphs))
suppressMessages(require(magrittr))
suppressMessages(require(PerformanceAnalytics))
suppressMessages(require(quantmod))
# Definir sua api key
Quandl.api_key('3gMh2BSgyDSpD4qxrsaT')
#Quandl.api_key('NjGc22-41R7zD_K7Pt7z')
# Coletar o dado do IPCA. Observe que adicionamos BCB/ ao código da série temporal. Sempre usaremos BCB/
# para coletar dados do BACEN por meio do Quandl. Ele tem o significado de determinar de qual banco de
# dados o Quandl deve buscar pela série que o número definido. Como padrão o Quandl coletará os dados na
# periodicidade divulgada pelo BACEN.
ipca <- Quandl('BCB/433')
# Coletar a mesma informação para um período específico
ipca <- Quandl('BCB/433', start_date = "1996-01-01", end_date = "2017-12-31")
# Coletar definindo apenas a data inicial
ipca <- Quandl('BCB/433', start_date = "1996-01-01")
# Coletar definindo a periodicidade de interesse
# Opções: daily, weekly, monthly, quarterly, annual
ipca <- Quandl("BCB/433", collapse = "quarterly", start_date = "1996-01-01")
# Coletar fazendo alterações nos dados. Transformações nos dados permitidas pelo Quandl:
# - diff: z[t] = y[t] – y[t-1] (diferença)
# - rdiff: z[t] = (y[t] – y[t-1]) / y[t-1] (diferença %)
# - rdiff_from: z[t] = (y[latest] – y[t]) / y[t] (incremento % em relação à última observação)
# - cumul: z[t] = y[0] + y[1] + … + y[t] (soma acumulativa)
# - normalize: z[t] = y[t] ÷ y[0] * 100 (série iniciar em 100)
ipca <- Quandl("BCB/433", transform = "diff", start_date = "1996-01-01")
# Coletar definido o tipo de dado que queremos no R
# - ts: série temporal
# - zoo: objeto zoo
# - xts: no formato xts
# Detalhes sobre a diferença entre os tipos no link abaixo
# https://stackoverflow.com/questions/33714660/what-is-the-difference-the-zoo-object-and-ts-object-in-r
ipca <- Quandl("BCB/433", start_date = "1996-01-01", type = "ts")
ipca <- Quandl("BCB/433", start_date = "1996-01-01", type = "xts")
# Alterar o nome da coluna do objeto para VALE3.SA
colnames(ipca) <- "IPCA"
# Visualizar os dados usando o pacote dygraphs. Mais detalhes em
# https://rstudio.github.io/dygraphs/
dygraphs::dygraph(ipca, main = "Índice Nacional de Preços ao Consumidor-Amplo (IPCA)") %>% dyRangeSelector()
Observe que o Quandl retornará uma série temporal no formato especificado. A partir disso, você pode fazer as transformações de interesse nos dados bem como visualizá-los.
O quantmod (Quantitative Financial Modelling & Trading Framework for R) é um pacote que tem como objetivo facilitar o acesso a dados financeiros e disponibilizar funcionalidades que permitam a análise de tais dados. Em função disto, permite acessar dadod do Yahoo Finance, Google Finance, dentre outros.
Com relação às funcionalidades, você pode acessar a lista delas neste link, mas dentre elas temos: alterar a periodicidade de uma série, calcular o retorno de um ativo financeiro, selecionar períodos específicos de uma série temporal, transformar a periodicidade dos retornos e muito mais.
Vamos mostrar como coletar dados do Yahoo Finance no R via quantmod. Neste momento (27/04/2018) o Google Finance não está disponibilizando dados de algumas bolsas. Por este motivo, vamos usar apenas o Yahoo Finance como fonte de dados para o quantmod. Porém, posteriormente você pode testar coletar dados do Google Finance.
Para coletar os dados do Yahoo Finance, precisamos dos seguintes passos:
Acessar o site do Yahoo Finance (https://finance.yahoo.com/), escolher uma ação de interesse e seu código. Por exemplo, a ação da Vale negociada na BM&F BOVESPA que tem o código \(VALE3.SA\). Atenção para o caso de ações negociadas em várias bolsas. Ao pesquisar pelo nome da empresa aparecerá a bolsa na qual ela está sendo negociada e você deve escolher para a bolsa que quer coletar os dados.
No R, execute o seguinte código:
# Coletar os dados da VALE3.SA do Yahoo Finance. Temos as seguintes opções:
# - google: Google Finance
# - FRED: Federal Reserve Bank of St. Louis
# A opção auto.assign define se os dados devem ser incorporados no R com o nome
# do symbol ou um nome específico (auto.assign = FALSE). No nosso caso, optamos
# pelo nome vale.
vale <- quantmod::getSymbols("VALE3.SA", src = "yahoo", auto.assign = FALSE)
# Coletar os dados para um período específico
vale <- quantmod::getSymbols("VALE3.SA", src = "yahoo", auto.assign = FALSE, from = '2015-01-01', to = '2015-12-31')
# Coletar os dados de uma data específica até a última observação disponível sobre a ação
vale <- quantmod::getSymbols("VALE3.SA", src = "yahoo", auto.assign = FALSE, from = '2017-01-01')
# Coletar definido o tipo de dado que queremos no R
# - ts: série temporal
# - zoo: objeto zoo
# - xts: no formato xts
# Detalhes sobre a diferença entre os tipos no link abaixo
# https://stackoverflow.com/questions/33714660/what-is-the-difference-the-zoo-object-and-ts-object-in-r
vale <- quantmod::getSymbols("VALE3.SA", src = "yahoo", auto.assign = TRUE, from = '2017-01-01', return.class = 'xts')
# Formato da saída
knitr::kable(head(VALE3.SA), align = "c")
| VALE3.SA.Open | VALE3.SA.High | VALE3.SA.Low | VALE3.SA.Close | VALE3.SA.Volume | VALE3.SA.Adjusted |
|---|---|---|---|---|---|
| 25.28 | 25.49 | 25.05 | 25.06 | 1118500 | 23.06044 |
| 25.51 | 26.17 | 25.40 | 26.17 | 5658500 | 24.08187 |
| 26.06 | 26.23 | 25.36 | 25.70 | 2144400 | 23.64937 |
| 25.98 | 26.90 | 25.78 | 26.68 | 4031600 | 24.55118 |
| 26.29 | 26.59 | 25.86 | 25.97 | 4213500 | 23.89783 |
| 26.30 | 26.85 | 26.27 | 26.50 | 3407800 | 24.38554 |
Observe que o pacote quantmod entregará um objeto com várias colunas (Open, High, Low, Close, Volume, Adjusted) com o seguinte significado:
Desta forma, você pode escolher com qual dado vai trabalhar em sua análise. Para retornos diários, geralmente fazemos uso do Close que é o preço de fechamento da ação na data. Para tanto, basta fazer o seguinte:
# Calcular o retorno diário usando o log(p_t) - log(p_t-1).
daily_return <- PerformanceAnalytics::Return.calculate(VALE3.SA$VALE3.SA.Close, method = "log")
daily_return <- periodReturn(VALE3.SA$VALE3.SA.Close,type="log",period="daily")
# Alterar o nome da coluna do objeto para VALE3.SA
colnames(daily_return) <- "VALE3.SA"
# Outra opção é o retorno diário por meio da opção method = "discrete"
daily_return <- PerformanceAnalytics::Return.calculate(VALE3.SA$VALE3.SA.Close, method = "discrete")
daily_return <- periodReturn(VALE3.SA$VALE3.SA.Close,type="arithmetic",period="daily")
# Outra opção é alterar a periodicidade dos retornos, neste caso tem-se o log-retorno mensal
monthly_return <- periodReturn(VALE3.SA$VALE3.SA.Close,type="log",period="monthly")
# Visualizar os dados usando o pacote dygraphs. Mais detalhes em
# https://rstudio.github.io/dygraphs/
dygraphs::dygraph(daily_return, main = "Retorno Diário da VALE3.SA") %>% dyRangeSelector()
dygraphs::dygraph(monthly_return, main = "Retorno Mensal da VALE3.SA") %>% dyRangeSelector()
# limpando a memória
rm(list=ls())
# carregando pacotes
library(quantmod) # cotações das ações e do Ibov
library(Quandl) # Selic BACEN
library(ggplot2) # para gerar os gráficos
library(lmtest) # testes: breusch-godfrey, breuch-pagan
library(tseries) # jarque-bera test
########
## COLETA DE DADOS
#####
# Coleta das cotações mensais da petrobras e do ibovespa
getSymbols(c("PETR4.SA","^BVSP"),
periodicity='monthly',
from='2000-01-01',
to='2019-07-01'
)
[1] "PETR4.SA" "^BVSP"
# Coleta da taxa selic mensal
Quandl.api_key('3gMh2BSgyDSpD4qxrsaT') # set your API key = Comando necessário pra acessar o Quandl
selic <- Quandl("BCB/4390",type = 'xts', start_date = "2000-01-01", end_date = "2019-07-01") # importando a serie do selic do Bacen
selic <- Quandl("BCB/4390",type = 'xts') # importando a serie do selic do Bacen
# Checando a periodicidade dos dados da petrobras
periodicity(PETR4.SA)
Monthly periodicity from 2000-01-01 to 2019-06-01
periodicity(BVSP)
Monthly periodicity from 2000-01-01 to 2019-06-01
periodicity(selic)
Monthly periodicity from Jun 1986 to Aug 2019
# Gerando gráficos de cotações e índices
# petr4
dygraphs::dygraph(PETR4.SA$PETR4.SA.Adjusted, main = "Preço Diário da PETR4.SA") %>% dyRangeSelector()
# ibov
dygraphs::dygraph(BVSP$BVSP.Adjusted, main = "Índice Bovespa") %>% dyRangeSelector()
########
## CÁLCULO DOS RETORNOS
#####
# calculando retornos mensais petr4 e ibov com base no preço ajustado
dados <- merge(monthlyReturn(PETR4.SA[,6],type='log')[-1,],
monthlyReturn(BVSP[,6],type="log")[-1,]
)
# juntando os dados petr4, ibov e selic
dados <- merge(dados,as.xts(selic/100),join="inner")
# renomeando as colunas
names(dados) <- c("petr4","ibov","selic")
head(dados)
petr4 ibov selic
2000-02-01 0.12410188 0.074752835 0.0145
2000-03-01 0.02141390 0.009019227 0.0145
2000-04-01 -0.09300750 -0.137032786 0.0130
2000-05-01 -0.02600491 -0.038109219 0.0149
2000-06-01 0.26281939 0.111904544 0.0139
2000-07-01 -0.15189025 -0.016454580 0.0131
# Gerando gráficos dos retornos
# petr4
dygraphs::dygraph(dados[,1], main = "Retorno Mensal da PETR4.SA") %>% dyRangeSelector()
# ibov
dygraphs::dygraph(dados[,2], main = "Retorno Mensal do Índice Bovespa") %>% dyRangeSelector()
# selic
dygraphs::dygraph(dados[,3], main = "Retorno Mensal SELIC") %>% dyRangeSelector()
# estimando o modelo de regressão do CAPM
mod1 <- lm(I(petr4 - selic) ~ I(ibov - selic), data=dados)
# mostrando os resultados
summary(mod1)
Call:
lm(formula = I(petr4 - selic) ~ I(ibov - selic), data = dados)
Residuals:
Min 1Q Median 3Q Max
-0.239427 -0.046591 -0.004919 0.051128 0.292055
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.001412 0.005062 0.279 0.781
I(ibov - selic) 1.208198 0.072082 16.761 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.07722 on 231 degrees of freedom
Multiple R-squared: 0.5488, Adjusted R-squared: 0.5468
F-statistic: 280.9 on 1 and 231 DF, p-value: < 2.2e-16
g6 <- ggplot(dados, aes(x=(ibov-selic), y=(petr4-selic))) + geom_point() + geom_smooth(method=lm, se=FALSE)
g6
########
## ANÁLISE DOS RESÍDUOS
#####
g7 <- plot(mod1$residuals)
g8 <- plot.ts(mod1$residuals)
g9 <- hist(mod1$residuals)
# testando se os resíduos são normais
jarque.bera.test(mod1$residuals)
Jarque Bera Test
data: mod1$residuals
X-squared = 12.862, df = 2, p-value = 0.001611
# testando se os resíduos da regressão estimada são homocedásticos (Breuch-Pagan)
# heteroscedasticidade
bptest(mod1)
studentized Breusch-Pagan test
data: mod1
BP = 0.47641, df = 1, p-value = 0.4901
# testando se há autocorrelação nos resíduos da regressão estimada (Breuch-Godfrey)
# autocorrelação
bgtest(mod1)
Breusch-Godfrey test for serial correlation of order up to 1
data: mod1
LM test = 5.9347, df = 1, p-value = 0.01485
Apesar de apresentarmos aqui algumas opções de como usar os pacotes Quandl e quantmod para coletar dados públicos diretamente do R, existem outros pacotes que recomendo. Para tanto, use o link abaixo:
Além disso, existe um novo pacote no R chamado tidyquant que tem funcionalidades importantes para quem trabalha com dados financeiros. Você pode descobrir tais funcionalidades por meio dos link abaixo:
Costa Ferreira, Pedro, Jonatha Costa, and Talitha Speranza. 2018. BETS Brazilian Economic Time Series. https://CRAN.R-project.org/package=BETS.
Raymond, McTaggart, Daroczi Gergely, and Leung Clement. 2016. Quandl API Wrapper for Quandl.com. https://CRAN.R-project.org/package=Quandl.
Ryan, Jeffrey A., and Joshua M. Ulrich. 2017. Quantmod Quantitative Financial Modelling Framework. https://CRAN.R-project.org/package=quantmod.