Capítulo 5 Importação de Dados via Pacotes

Uma das grandes vantagens de se utilizar o R para realizar pesquisas é a quantidade de dados que podem ser importados através da internet. Isso é especialmente prático pois pode-se atualizar uma base de dados através de um simples comando, evitando todo o trabalho de coleta manual dos dados. É nesse ponto que o conhecimento e uso de pacotes do R torna-se essencial. Neste capítulo iremos tratar dos seguintes pacotes especializados para dados financeiros e econômicos:

  • BatchGetSymbols
  • Quandl
  • BETS
  • rbcb
  • GetDFPData
  • GetHFData
  • GetTDData

Todos esses pacotes são gratuitos e disponíveis no CRAN. Os mesmos foram selecionados por sua facilidade de uso e abrangência.

5.1 Conhecendo os Dados

Antes de aprendermos a utilizar o R para importar dados da Internet, é importante discutirmos as origens destes dados e suas particularidades. Esses são conjuntos de dados que você provavelmente encontrará no seu trabalho. Esta primeira seção irá fornecer contexto e ajudá-lo a entender de onde os dados estão vindo e o que eles representam. Iniciaremos analisando o conjunto de dados do mercados financeiro.

5.1.1 Contratos Financeiros

Sem dúvida, o conjunto de dados mais popular em finanças são os preços de contratos financeiros. No mercado de capitais, investidores podem comprar contratos que lhes dão direito a um fluxo de caixa futuro. Por exemplo, o governo Brasileiro financia suas atividades através da emissão de contratos de dívida. Quando você compra uma dívida do governo, o que você adquire é um acordo formal onde o governo promete pagar-lhe de volta o empréstimo em datas especificadas e dentro de um período de tempo. Do ponto de vista do investidor, dinheiro é gasto hoje para adquirir um dinheiro no futuro.

O que difere um contrato financeiro do outro é a incerteza subjacente, a estrutura de como os pagamentos são definidos e os direitos adquiridos pelo comprador. Quando uma empresa privada precisa de dinheiro, pode levantar capital externo através da venda de propriedade acionária. Vários direitos, incluindo uma parcela de lucros futuros, são concedidos a quem compra suas novas ações. Uma vez que é difícil prever os lucros futuros, o contrato de ação é geralmente mais arriscado do que um contrato de dívida.

A emissão de ações é um processo elaborado. Quando uma empresa abre seu capital, o primeiro passo é a venda no mercado primário, composto por investidores selecionados. É nessa etapa que ocorre a oferta pública inicial das ações (IPO - Initial Public Offering). A empresa geralmente mantém parte das novas ações em sua propriedade (tesouraria), para que possa vender mais tarde ou oferecer como remuneração variável para seus administradores. Na segunda etapa do IPO, o mercado secundário, as ações são negociadas no mercado comum, onde todos têm acesso. É do mercado secundário que a maior parte dos dados financeiros dos mercados financeiros é proveniente. Investidores ganham dinheiro vendendo ações de volta ao mercado com um preço mais alto, ou recebendo proventos (parcelas do lucro) das empresas.

Os preços nos mercados financeiros se movem de acordo com oferta e demanda. Por exemplo, se muitos investidores comprarem ações, seu preço provavelmente aumentará. Toda vez que um vendedor encontra um comprador, uma operação é registrada e o dinheiro troca de mãos. Novas informações e expectativas do mercado sobre a lucratividade futura da empresa desempenham um papel proeminente na dinâmica da demanda. Se o mercado entender que uma empresa irá ter muito lucro nos próximos anos, os investidores provavelmente comprarão a ação e seu preço aumentará. Os preços dos contratos financeiros são, portanto, uma indicação de como o mercado percebe o futuro.

Certos eventos também podem alterar o preço de uma ação, mesmo que nenhuma nova informação ou mudança na demanda seja observada. Esse é o caso típico de uma operação split, em que uma única ação é dividida em várias. Isso geralmente ocorre quando o preço de uma ação está muito alto e, para fomentar liquidez, diminui-se o preço unitário de uma forma arbitrária, porém aumentando o número de ações. Para uma divisão de um para dois, um investidor com 100 ações cotadas a 10 reais agora terá 200 ações a 5 reais cada. O valor do portfólio permanece o mesmo. Ao olhar para a série de preços não-ajustados, uma operação split resulta em uma grande queda de valor entre um dia e outro. Um erro bastante comum entre investidores iniciantes é se deparar com um eventual split e, erroneamente, se desesperar ao ver que o preço de suas ações cairam mais de 50% entre um dia e outro.

Outro evento que afeta o preço é o pagamento de dividendos. Na data anterior ao pagamento, a ação baixará seu preço em relação ao valor do dividendo por ação. Isso ocorre porque um novo comprador perde o direito ao próximo pagamento de dividendos e, portanto, um desconto é esperado. É importante compreender e reconhecer esses eventos, pois você pode ter que lidar com dados de preços brutos. Em geral, os provedores de dados oferecem a opção de preços ajustados, ou seja, o preço já está ajustado a esses eventos. Os preços ajustados oferecem uma visão mais realista sobre o lucro efetivo que um investidor obteve ao comprar as ações no passado.

Dados de preços de contratos financeiros são registrados sempre que há uma operação efetivada, isto é, uma compra por parte de um investidor e venda por parte de outro. Sites como Yahoo Finance e Google Finance oferecem estatísticas diárias sobre os preços das ações: preço mais alto/baixo, volume negociado e preço de fechamento do dia. A variedade de conjuntos de dados é ampla, cobrindo quase todos contratos do mercado nacional e internacional. Qualquer pessoa pode baixar esses dados usando o site ou então via código, o que é mais comum. Logo veremos que existem pacotes no CRAN que facilitam o acesso ao conjunto de dados desses sites.

Dados do Yahoo Finance estão na frequência diária, isto é, agregam estatísticas de preço para um dia. A obtenção de informações sobre operações de compra e venda dentro do dia é muito mais difícil.1 Isso geralmente é chamado de tick-by-tick, ou dados de alta freqüência. Para mercados líquidos, o tamanho desse banco de dados pode ser restritivo. Felizmente, a bolsa Brasileira oferece acesso gratuito aos dados tick-by-tick de ações e outros contratos derivativos. Logo iremos discutir um pacote para baixar este dados de forma fácil, GetHFData.

Do ponto de vista da análise de dados, os conjuntos de dados de preços geralmente têm três dimensões, um identificador da ação (ticker), uma referência de data/hora e um preço. Isso significa que, no formato longo, você pode representar esses dados no R como um dataframe de três colunas. Quando novas ações são adicionadas ao conjunto de dados, este dataframe aumentará em linhas. Quando novas variáveis, como o volume negociado, são inseridas, uma nova coluna pode ser adicionada. Como veremos no capítulo 6, o formato longo facilita tarefas de processamento de dados e é recomendado.

Embora a discussão anterior foi majoritariamente sobre o mercado de ações, outros tipos de mercados possuem conjuntos de dados semelhantes, mas com informações adicionais. Por exemplo, contratos financeiros de dívida e derivativos geralmente têm uma data de validade (prazo de vencimento). Contratos de opção têm um preço de exercício. Informações adicionais sobre contratos de dívida e derivativos podem ser facilmente adicionadas a um dataframe com a adição de colunas.

5.1.2 Relatórios Financeiros de Empresas

Outro conjunto popular de dados em finanças relaciona-se com demonstrações financeiras de empresas. Empresas negociadas na bolsa são legalmente obrigadas a publicar o seu resultado financeiro trimestralmente na forma de relatórios tal como balanço patrimonial, demonstrativo de resultado entre outros. A grosso modo, estes representam bens e dívidas atuais da empresa e o seu desempenho financeiro no último período (Assaf Neto 2010, @matarazzo1994analise).

Esse tipo de divulgação é importante para manter os mercados conscientes da atual saúde financeira da empresa. As informações devem, então, serem utilizadas na decisão de compra e venda das ações. Além disso, qualquer outro evento financeiro ou informação relevante também deve ser anunciado. Isso inclui novo levantamento de capital, estrutura de propriedade, composição de comitês, remuneração do diretores, entre diversas outras informações.

Para o caso Brasileiro, todos dados relativos a empresas estão disponíveis no site da B3 e CVM. Separa-se os mesmos entre quatro distintos sistemas:

  • ITR: Informações trimestrais
  • DFP: Demonstrativos financeiros padronizados
  • FRE: Formulário de referência
  • FCA: Formulário de cadastro

Os sistemas ITR e DFP contém todos os demostrativos e relatórios financeiros das empresas na frequência trimestral e anual, respectivamente. O FRE possui dados de eventos financeiros mais diversos. Essa é a base de dados mais volumosa e heterogênea. O FCA inclui informações básicas de cadastro para cada empresa. Logo veremos que todos esses dados podem ser importados utilizando o pacote GetDFPData.

Dada a quantidade de relatórios financeiros, é impossível explicar cada tipo neste livro. Maiores detalhes sobre informes financeiros dos sistemas DFP e ITR são encontrados na literatura de contabilidade. Nesse caso, indico a obra clássica de Matarazzo and Pestana (2010) e as normas brasileiras de contabilidade.

Vale, porém, destacar como poderíamos organizar dados de demostrativos financeiros no R. Geralmente lida-se com informações para várias empresas e vários períodos de tempo. A melhor forma de representar os dados é através de um dataframe no formato longo com cinco colunas:

  • RefDate - data ou período de referência
  • CompanyID - identificador exclusivo para empresas
  • TypeOfFinStatement - tipo de demonstração financeira (balanços patrimoniais, fluxos de caixa, entre outros)
  • idAccount - Número identificador da conta, oriundo das normas contábeis
  • nameAccount - nome (texto) da conta: total de ativos, ativo circulante, lucro líquido, entre outros
  • Value - o valor da conta

O formato anterior é flexível e pode conter um grande número de demonstrações financeiras diferentes. Novas informações são facilmente adicionadas a este tipo de formato.

5.1.3 Dados Econômicos

Dados econômicos são bastante variados e geralmente publicados por órgãos locais ou internacionais de pesquisa tal como IBGE, IPEA, Banco Mundial, Bancos centrais, ou associações de classe. Tais informações são publicadas e geradas para fins de pesquisa e transparência da situação econômica de um país ou região. A diversidade de informações é grande. Seria impossível discorrer sobre todas possibilidades. Alguns exemplos: poder de compra médio de uma população, distribuição de faixas de renda, inflação anual média de um país, índices de alfabetização, índices de pobreza, entre vários outros.

Aqueles curiosos em descobrir quais informações econômicas estão disponíveis para o Brasil, sugiro ir ao site de estatísticas econômicas do IBGE ou acessar o sistema de séries temporais do Banco Central do Brasil. Logo veremos que pacotes especializados, tal como Quandl, BETS e rbcb, permitem o acesso direto a esses bancos de dados.

No lado do R, os dados econômicos geralmente possuem duas dimensões, um índice de tempo tal como dia ou ano, e um valor. Portanto, a estrutura tabular de um dataframe facilmente acomoda os mais diversos indicadores econômicos. Quando se está trabalhando com diversas séries econômicas, algum tipo de agregação é necessária. No decorrer dos exemplos iremos mostrar como reformatar os dados para a estrutura desejada.

5.2 Pacotes do CRAN

Agora vamos apresentar os principais pacotes do CRAN para o acesso de bases de dados financeiras e econômicas no Brasil. Antes de prosseguir, vamos instalar todos eles de uma vez só. Deves rodar o seguinte código no prompt do R:

my.pkgs <- c('BatchGetSymbols', 'Quandl', 'BETS', 'rbcb',
             'GetDFPData', 'GetHFData', 'GetTDData', 'dplyr')

install.packages(my.pkgs)

Além dos pacotes individuais, também iremos utilizar a função glimpse do pacote dplyr para checar o conteúdo dos dataframes. Após essa operação, todos os pré-requisitos para rodar os códigos apresentados a seguir foram satisfeitos.

5.2.1 BatchGetSymbols

Esse pacote faz a comunicação do R com os dados financeiros disponíveis no Yahoo Finance e Google Finance. Essa gigantesca base de dados inclui valores agregados de preços e volumes negociados de ações na B3 e outras bolsas internacionais na frequência diária. Tudo que se precisa saber para acessar a base de dados são os identificadores das ações (tickers) e um período de tempo.

Antes de começarmos, é importante salientar que, atualmente, os preços do Yahoo Finance não são ajustados a dividendos. O ajuste realizado pelo sistema é apenas para desdobramentos das ações. Isso significa que, ao olhar séries de preços longas, existe um viés de retorno para baixo. Os preços ajustados não são realistas pois ignoram o pagamento de dividendos ao acionista. Caso estiver usando uma série longa de preços, deves procurar alternativas.

Voltando ao código, pacote BatchGetSymbols (Perlin 2016b) é construído com base nas funções do pacote quantmod (Ryan 2015). Os diferenciais do BatchGetSymbols são:

Limpeza e organização: todos os dados financeiros de diferentes tickers são mantidos no mesmo dataframe. O cálculo de retorno diário das ações é automaticamente retornado e não precisa ser realizado pelo usuário;

Controle de erros de importação: caso ocorra um erro no download dos dados, esse será registrado na saída;

Comparação de datas a um benchmark: os dados de ativos individuais são comparados com dados disponíveis para um ativo benchmark, geralmente um índice de mercado. Caso o número de datas faltantes seja maior que um determinado limite imposto pelo usuário, a ação é retirada do dataframe final.

Uso de sistema de cache: no momento de acesso aos dados, os mesmos são salvos localmente no computador do usuário, em uma pasta selecionada. Caso o usuário requisitar os mesmos dados, o sistema de cache será utilizado. Se os dados desejados não estão disponíveis no cache, a função irá comparar e baixar apenas as informações que faltam. Isso aumenta significativamente a velocidade de acesso aos dados, ao mesmo tempo em que minimiza o uso da conexão a Internet;

Acesso a tickers em índices de mercado: O pacote inclui funções para baixar a composição do Ibovespa e SP500. Isso facilita a importação de dados para uma grande quantidade de ações. Podes, por exemplo, baixar cotações de todas as ações que fazem parte de certo índice.

Flexibilidade de formato: O pacote também oferece funções para modificar o formato dos dados. Caso o usuário deseje dataframes no formato largo, onde datas são colunas, existe uma função para transformar os dados.

Veja o exemplo a seguir, onde baixamos dados financeiros referentes a quatro ações nos 30 dias anteriores usando a função de mesmo nome do pacote. Os tickers de cada ação podem ser encontrados nos próprios sites do Yahoo Finance. Note que adicionamos texto .SA a cada um deles. Essa é uma notação específica do site e vale para qualquer ação Brasileira.

Na chamada a função BatchGetSymbols, utilizamos um valor de 0.95 para o input thresh.bad.data e '^BVSP' para bench.ticker. Isso faz com que a função compare as datas obtidas para cada ativo em relação ao nosso benchmark, o índice Ibovespa, cujo ticker no Yahoo Finance é ^BVSP. A função Sys.Date() retorna a data atual do sistema.

library(BatchGetSymbols)
library(dplyr)

# set tickers
my.tickers <- c('PETR4.SA', 'CIEL3.SA',
                'GGBR4.SA', 'GOAU4.SA')

# set dates and other inputs
first.date <- Sys.Date()-30
last.date <- Sys.Date()
thresh.bad.data <- 0.95   # sets percent threshold for bad data
bench.ticker <- '^BVSP'   # set benchmark as ibovespa
cache.folder <- 'data/BGS_Cache' # set folder for cache

l.out <- BatchGetSymbols(tickers = my.tickers,
                         first.date = first.date,
                         last.date = last.date,
                         bench.ticker = bench.ticker,
                         thresh.bad.data = thresh.bad.data,
                         cache.folder = cache.folder)

A saída de BatchGetSymbols é um objeto do tipo lista, o qual ainda não foi explicado. Por enquanto, tudo que precisas saber é que uma lista é um objeto flexível que acomoda outros objetos, tal como dataframes. O acesso a cada elemento de uma lista pode ser feito pelo operador $. No capítulo 6 iremos estudar melhor esta classe de objetos.

Voltando ao nosso exemplo, função BatchGetSymbols retorna uma lista com dois elementos: um dataframe com o resultado do processo de importação e outro dataframe com os dados das ações. Vamos checar o conteúdo do primeiro dataframe.

# print result of download process
print(l.out$df.control)
## # A tibble: 4 x 6
##   ticker src   download.status total.obs perc.benchmark.…
##   <chr>  <chr> <chr>               <int>            <dbl>
## 1 PETR4… yahoo OK                     22                1
## 2 CIEL3… yahoo OK                     22                1
## 3 GGBR4… yahoo OK                     22                1
## 4 GOAU4… yahoo OK                     22                1
## # … with 1 more variable: threshold.decision <chr>

Objeto df.control mostra que todos tickers foram válidos, com um total de 22 observações para cada ativo. Note que as datas batem 100% com o Ibovespa.

Quanto aos dados financeiros, esses estão contidos no elemento df.tickers de l.out:

# print df.tickers
glimpse(l.out$df.tickers)
## Rows: 88
## Columns: 10
## $ price.open          <dbl> 21.34, 21.75, 22.10, 21.95, 2…
## $ price.high          <dbl> 21.80, 22.25, 22.21, 22.18, 2…
## $ price.low           <dbl> 21.09, 21.52, 21.86, 21.80, 2…
## $ price.close         <dbl> 21.55, 21.71, 22.06, 21.98, 2…
## $ volume              <dbl> 65010600, 78983900, 56345900,…
## $ price.adjusted      <dbl> 21.54957, 21.70957, 22.05956,…
## $ ref.date            <date> 2020-06-30, 2020-07-01, 2020…
## $ ticker              <chr> "PETR4.SA", "PETR4.SA", "PETR…
## $ ret.adjusted.prices <dbl> NA, 0.0074245558, 0.016121601…
## $ ret.closing.prices  <dbl> NA, 0.0074245943, 0.016121603…

Como esperado, a informação sobre preços, retornos e volumes está lá, com as devidas classes de dbl (double - numérico) e date. Observe que uma coluna chamada ticker está incluída. Essa indica em que linhas da tabela os dados de uma ação começam e terminam. Mais tarde, no capítulo 9, usaremos essa coluna para fazer diversos cálculos para cada ação.

Outra função útil do pacote é BatchGetSymbols::GetIbovStocks, a qual importa a composição atual do índice Ibovespa diretamente do site da B3. Esse índice é um termômetro do mercado local e as ações que o compõem são selecionadas devido sua alta negociabilidade. Portanto, o conjunto de ações que o compõem é uma ótima amostra de tickers para pesquisa científica. Sequenciando o uso de GetIbovStocks e BatchGetSymbols, podemos facilmente baixar uma volumosa quantidade de dados de ações para o mercado Brasileiro. Considere o seguinte fragmento de código, onde realizamos essa operação:

library(BatchGetSymbols)

# set tickers
df.ibov <- GetIbovStocks()
my.tickers <- paste0(df.ibov$tickers,'.SA')


# set dates and other inputs
first.date <- Sys.Date()-30
last.date <- Sys.Date()
thresh.bad.data <- 0.95   # sets percent threshold for bad data
bench.ticker <- '^BVSP'   # set benchmark as ibovespa
cache.folder <- 'data/BGS_Cache' # set folder for cache


l.out <- BatchGetSymbols(tickers = my.tickers,
                         first.date = first.date,
                         last.date = last.date,
                         bench.ticker = bench.ticker,
                         thresh.bad.data = thresh.bad.data,
                         cache.folder = cache.folder)

Note que utilizamos a função paste0 para adicionar o texto '.SA' para cada ticker em df.ibov$tickers. A saída do código anterior não foi mostrada para não encher páginas e páginas com as mensagens do processamento. Destaco que, caso necessário, poderíamos facilmente exportar os dados em l.out para um arquivo .rds e futuramente carregá-los localmente para realizar algum tipo de análise.

5.2.2 Quandl

Outra fonte importante de dados financeiros e econômicos é a plataforma Quandl, um sistema estabelecido e abrangente que fornece acesso a uma série de dados gratuitos e pagos. Toda a infraestrutura é patrocinada pela empresa de mesmo nome. O sistema fornece informações de várias economias e mercados financeiros. Diversos bancos centrais e instituições de pesquisa, incluindo o Banco Central do Brasil (BCB) e o IBGE, fornecem informações econômicas e financeiras nessa plataforma. Por exemplo, a vasta base de dados do BCB está disponível neste link.

O primeiro passo no uso do Quandl é registrar um novo usuário no site. Logo após, vá para account settings e clique em API KEY. Esta página deve mostrar um código tal como “Asv8Ac7zuZzJSCGxynfG”. Copie este texto para a área de transferência (control + c) e, no R, defina um objeto de caractere que contenha o conteúdo copiado da seguinte maneira:

# set api key to quandl
my.api.key <- 'Asv8Ac7zuZzJSCGxynfG'

Essa chave de API é exclusiva para cada usuário. A chave apresentada aqui não funcionará no seu computador. Você precisa obter a sua própria chave para executar os exemplos a seguir. Cada tabela de dados do Quandl possui um símbolo. Por exemplo, 'FED/RXI_N_B_BZ' representa as séries temporais de preços do dólar em reais, as quais estão contidas na base de dados do FED (US Federal Reserve). Uma maneira de procurar os símbolos é ir até o site do Quandl e utilizar o sistema de busca. Após encontrar a série de interesse, o seu respectivo símbolo deve estar disponível no lado direito superior da tela.

Outra forma mais prática, e recomendada, é usar função Quandl.search para pesquisar um texto diretamente da linha de comando do R. Vamos dar um exemplo para dados de inflação no Brasil, o índice INPC, mantendo apenas os cinco primeiros resultados:

library(Quandl)
library(dplyr)

# set api key
Quandl.api_key(my.api.key)

# search string in quandl
df.search <- Quandl.search('INPC',
                           silent = TRUE,
                           per_page = 5)

Função Quandl.search retornou um dataframe com 5 linhas e 13 colunas. Vamos averiguar o seu conteúdo.

# check content
glimpse(df.search)
## Rows: 5
## Columns: 13
## $ id                    <int> 37897382, 37778793, 23997, …
## $ dataset_code          <chr> "INPC", "INPC", "188", "INP…
## $ database_code         <chr> "XNAS", "OTCB", "BCB", "XNA…
## $ name                  <chr> "Inphonic Inc (INPC) Adjust…
## $ description           <chr> " <b>Ticker</b>: INPC <br> …
## $ refreshed_at          <chr> "2017-09-24T21:37:14.894Z",…
## $ newest_available_date <chr> "2007-11-30", "2008-11-24",…
## $ oldest_available_date <chr> "2006-12-28", "2007-11-21",…
## $ column_names          <list> [<"Date", "Open", "High", …
## $ frequency             <chr> "daily", "daily", "monthly"…
## $ type                  <chr> "Time Series", "Time Series…
## $ premium               <lgl> TRUE, TRUE, FALSE, TRUE, TR…
## $ database_id           <int> 14999, 15099, 35, 14999, 15…

O dataframe inclui diversas informações a respeito da pesquisa. O próximo passo é analisar a saída e decidir qual que melhor satisfaz a necessidade da nossa análise. Para fins de exemplo, vamos selecionar o terceiro resultado, a inflação anual do Brasil publicada pelo BCB (Banco Central Brasileiro). O símbolo final é dado pela junção da coluna database_code com dataset_code, resultando em BCB/433 para a nossa escolha.

Com a informação do API, símbolo da série e intervalo de datas desejado, usamos a função Quandl para baixar os dados:

library(Quandl)
library(dplyr)

# register api key
Quandl.api_key(my.api.key)

# set symbol and dates
my.symbol <- 'BCB/433'
first.date <- as.Date('2000-01-01')
last.date <- Sys.Date()

# get data!
my.df <- Quandl(code = my.symbol,
                type='raw',
                start_date = first.date,
                end_date = last.date)

# check content
glimpse(my.df)
## Rows: 246
## Columns: 2
## $ Date  <date> 2020-06-30, 2020-05-31, 2020-04-30, 2020-0…
## $ Value <dbl> 0.26, -0.38, -0.31, 0.07, 0.25, 0.21, 1.15,…

Um gráfico mostra a série de inflação anual ao longo dos anos:

Observe como usamos type = 'raw' nas opções da função Quandl. Essa entrada força a função a gerar um dataframe nativo. Outras opções incluem a saída de objetos do tipo ts, zoo, xts e timeSeries. Se o uso de Quandl se tornar parte de sua rotina de análise de dados, recomendo ler o manual de ajuda do pacote. Vários parâmetros podem ser passados para a função Quandl, incluindo a escolha para aplicar transformações no conjunto de dados resultante. Você pode encontrar mais detalhes sobre o uso do Quandl no R a partir do seu site de ajuda.

Outro aspecto interessante é a possibilidade de baixar dados de mais de uma série no mesmo código. Como exemplo, vamos acessar a base de dados do BCB no Quandl para baixar dados da SELIC, a taxa de juros básica da economia do Brasil e do CDI, a taxa de empréstimos interbancários. Após consultar o Quandl, vemos que os seus respectivos símbolos são BCB/4389 e BCB/1178

library(Quandl)
library(dplyr)

# register api key
Quandl.api_key(my.api.key)

# set symbol and dates
my.symbol <- c('BCB/4389', # SELIC by year
               'BCB/1178') # CDI by year

first.date <- as.Date('2005-01-01')
last.date <- Sys.Date()

# get data!
my.df <- Quandl(code = my.symbol,
                type='raw',
                start_date = first.date,
                end_date = last.date)

# check content
glimpse(my.df)
## Rows: 3,909
## Columns: 3
## $ Date               <date> 2005-01-03, 2005-01-04, 2005-…
## $ `BCB.4389 - Value` <dbl> 17.76, 17.72, 17.72, 17.72, 17…
## $ `BCB.1178 - Value` <dbl> 17.74, 17.74, 17.74, 17.74, 17…

Note que o dataframe resultante apresenta dois problemas: o formato é esparso (wide), com colunas representando observações e os nomes das colunas são pouco intuitivos. O dataframe deve ser reformatado para utilizarmos as funções de análise do tidyverse. A renomeação dos tipos de dados facilitará a análise futura. Apesar de ainda não termos visto como realizar estas mudanças com funções específicas do tidyverse, iremos apresentar aqui a solução:

# change from wide to long
my.df.long <- tidyr::gather(my.df, type, value, -Date)

# rename values
my.df.long$type <- forcats::fct_recode(factor(my.df.long$type),
                                       'SELIC'= 'BCB.4389 - Value',
                                       'CDI' = 'BCB.1178 - Value')

# check content
glimpse(my.df.long)
## Rows: 7,818
## Columns: 3
## $ Date  <date> 2005-01-03, 2005-01-04, 2005-01-05, 2005-0…
## $ type  <fct> SELIC, SELIC, SELIC, SELIC, SELIC, SELIC, S…
## $ value <dbl> 17.76, 17.72, 17.72, 17.72, 17.71, 17.71, 1…

Agora temos um dataframe aceitável, com o formato longo e informações intuitivas. Esse está pronto para ser analisado! Não se preocupe em entender o código anterior. Iremos tratar a operação de mudança de formato do dataframe no capítulo 9 e a recodificação de fatores no capítulo 7.

Para visualizar os dados importados, vamos mostrar uma figura dos seus valores:

Não é acidental valores da taxa CDI e SELIC serem tão próximos, com um leve viés positivo para o CDI. A SELIC é a taxa que bancos privados se financiam junto ao Banco Central. Ao emprestar dinheiro para outros bancos, os mesmos cobram um juros um pouco maior. Vale destacar que o ano de 2018 começou com a mais baixa taxa SELIC dos últimos tempos.

5.2.3 BETS

O pacote BETS permite acesso ao repositório de dados da Fundação Getúlio Vargas (FGV), o qual inclui bases de dados do BCB, IBGE e o Instituto Brasileiro de Economia da FGV (FGV/IBRE). Segundo sua própria descrição, o BETS permite o acesso a mais de 18,000 séries econômicas do Brasil.

O funcionamento do pacote BETS é semelhante ao Quandl. Seu diferencial é que não necessita de chave de API (ou registro em site) para o acesso e as tabelas disponíveis para o Brasil são mais variadas. Vamos dar um simples exemplo de uso do BETS para baixar dados de desemprego no Brasil. O primeiro passo é procurar o número de identificação da série com função BETSsearch:

library(BETS)
library(dplyr)

# search for id
df.res <- BETSsearch('unemployment', view = FALSE)

# chech res
glimpse(df.res)
## Rows: 30
## Columns: 7
## $ code        <chr> "10777", "10778", "10779", "10780", "…
## $ description <chr> "Open unemployment rate - by metropol…
## $ unit        <chr> "%", "%", "%", "%", "%", "%", "%", "M…
## $ periodicity <chr> "M", "M", "M", "M", "M", "M", "M", "M…
## $ start       <chr> "31/10/2001", "31/10/2001", "31/10/20…
## $ last_value  <chr> "feb/2016", "feb/2016", "feb/2016", "…
## $ source      <chr> "IBGE", "IBGE", "IBGE", "IBGE", "IBGE…

Com o argumento view = FALSE, a função retorna um dataframe com os resultados. Caso contrário, uma nova janela aparece para o usuário. Encontramos 30 resultados para o nosso critério de busca. Temos várias séries sobre desemprego disponíveis, algumas até para diferentes países. Vamos acessar a série divulgada pelo PNAD/IBGE, cujo número de identificação é 24369.

# set id
my.id <- 24369

# set dates
first.date = '2010-01-01'
last.date  = as.character(Sys.Date())

# get data
df.bets <- BETSget(code = my.id, 
                   data.frame = TRUE,
                   from = first.date,
                   to = last.date)

# check data
glimpse(df.bets)
## Rows: 99
## Columns: 2
## $ date  <date> 2012-03-01, 2012-04-01, 2012-05-01, 2012-0…
## $ value <dbl> 7.9, 7.7, 7.6, 7.5, 7.4, 7.3, 7.1, 6.9, 6.8…

A saída de BETSget é um dataframe com duas colunas. Vamos verificar o comportamento do índice de desemprego importado com uma figura:

Como podemos ver, o desemprego atual está em um nível alto em relação aos demais anos, atigindo um pico no início de 2017.

Assim como o Quandl, o BETS também possibilita o acesso a mais de uma série. O objeto de saída, porém, é diferente. A função BETSget não agrega os dados e retorna uma lista onde cada elemento é uma série. No exemplo a seguir iremos baixar dados de desemprego de diferentes países e compará-los em uma figura. Os ids de cada país estão disponíveis no dataframe de busca de séries.

my.id <- 3785:3791

# set dates
first.date = '2010-01-01'
last.date  = as.character(Sys.Date())

# get data
l.out <- BETSget(code = my.id, 
                 data.frame = TRUE,
                 from = first.date, 
                 to = last.date)

# check data
dplyr::glimpse(l.out)
## List of 7
##  $ ts_3785:'data.frame':	79 obs. of  2 variables:
##   ..$ date : Date[1:79], format: "2010-01-01" ...
##   ..$ value: num [1:79] 7.4 7.4 7.3 7.2 7 6.9 6.8 6.8 6.7 6.7 ...
##  $ ts_3786:'data.frame':	80 obs. of  2 variables:
##   ..$ date : Date[1:80], format: "2010-01-01" ...
##   ..$ value: num [1:80] 8.3 8.2 8.2 8.1 8 7.9 8.1 8.1 8.1 7.8 ...
##  $ ts_3787:'data.frame':	80 obs. of  2 variables:
##   ..$ date : Date[1:80], format: "2010-01-01" ...
##   ..$ value: num [1:80] 9.8 9.8 9.9 9.9 9.6 9.4 9.4 9.5 9.5 9.4 ...
##  $ ts_3788:'data.frame':	79 obs. of  2 variables:
##   ..$ date : Date[1:79], format: "2010-01-01" ...
##   ..$ value: num [1:79] 9.4 9.4 9.3 9.3 9.3 9.2 9.2 9.2 9.2 9.2 ...
##  $ ts_3789:'data.frame':	79 obs. of  2 variables:
##   ..$ date : Date[1:79], format: "2010-01-01" ...
##   ..$ value: num [1:79] 8.5 8.5 8.4 8.6 8.5 8.3 8.2 8.1 8.1 8.5 ...
##  $ ts_3790:'data.frame':	79 obs. of  2 variables:
##   ..$ date : Date[1:79], format: "2010-01-01" ...
##   ..$ value: num [1:79] 5 5 5.1 5.1 5.1 5.2 5 5.1 5.1 5.1 ...
##  $ ts_3791:'data.frame':	77 obs. of  2 variables:
##   ..$ date : Date[1:77], format: "2010-01-01" ...
##   ..$ value: num [1:77] 7.9 8 7.9 7.8 7.8 7.7 7.7 7.6 7.7 7.8 ...

Cada série de desemprego está alocada em um elemento de l.out. Esses dados não estão no formato desejável. O ideal é agregarmos todos em um único dataframe, com uma coluna designando o nome da série. Note também que a informação sobre o país não está clara. Afinal, qual é o país identificado por 'ts_3785'?

No próximo código iremos tratar estes problemas utilizando a linguagem funcional do R. Deixo claro que o código ficou mais complicado do que deveria. Novamente, não se preocupe se não entender. Iremos tratar do assunto loops e funções no capítulo 8.

clean.bets <- function(df.in, name.in) {
  # function for cleaning data from BETS
  #
  # ARGS: df.in - dataframe within a list
  #       name.in - name for dataframe
  #
  # VALUE: a new dataframe with new column type

  #set column
  df.in$type <- name.in

  # return df
  return(df.in)
}

# set names
name.in <- c("Germany", "Canada", "United States", "France",
             "Italy", "Japan", "United Kingdom"   )

# loop for changeing contents of l.out
for (i.l in 1:length(l.out )){
  l.out[[i.l]] <- clean.bets(l.out[[i.l]], name.in[i.l])
}

# bind all dfs together
my.df.long <- do.call(what = dplyr::bind_rows, args = l.out)

# check it
dplyr::glimpse(my.df.long)
## Rows: 553
## Columns: 3
## $ date  <date> 2010-01-01, 2010-02-01, 2010-03-01, 2010-0…
## $ value <dbl> 7.4, 7.4, 7.3, 7.2, 7.0, 6.9, 6.8, 6.8, 6.7…
## $ type  <chr> "Germany", "Germany", "Germany", "Germany",…

Agora sim os dados estão no formato desejado. Vamos visualizar o desemprego nos diferentes países ao longo dos anos com uma figura.

Como podemos ver, a maioria dos países está em uma trajetória decrescente de desemprego, com excessão da França e Itália.

5.2.4 rbcb

Como vimos anteriormente, os pacotes Quandl e BETS permitem o acesso a base de dados de séries temporais do Banco Central Brasileiro (BCB). Nessa mesma função, um diferencial do pacote rbcb é o acesso direto ao API do BCB. Não é necessário cadastro, o pacote possui um baixo número de dependências para a instalação e é bastante estável. O formato de entrada dos símbolos é intuitivo e permite a definição do nome das colunas no objeto retornado.

Vamos usar o pacote para estudar a inadimplência de crédito no sistema financeiro Brasileiro. O primeiro passo no uso de rbcb é procurar o símbolo da série de interesse. Acessando o sistema de séries temporais do BCB, vemos que o símbolo para o percentual total de inandimplência é 21082.

library(rbcb)
library(dplyr)

# set ids and dates
id.series <- c(perc.default = 21082)
first.date = '2010-01-01'

# get series from bcb
df.cred <- get_series(code = id.series,
                      start_date = first.date,
                      end_date = Sys.Date())

# check it
glimpse(df.cred)
## Rows: 112
## Columns: 2
## $ date         <date> 2011-03-01, 2011-04-01, 2011-05-01,…
## $ perc.default <dbl> 3.17, 3.24, 3.37, 3.32, 3.42, 3.45, …

Note que indicamos o nome da coluna na própria definição da entrada code. Vamos verificar os dados importados visualmente:

Como podemos ver, a percentagem de inadimplência aumentou a partir de 2015. Para ter uma idéia mais clara do problema, vamos incluir no gráfico a percentagem para pessoa física e pessoa jurídica. Olhando novamente o sistema do BCB, vemos que o símbolos de interesse são 21083 e 21084, respectivamente. O próximo código baixa os dados das duas séries.

# set ids
id.series <- c(people = 21083,
               companies = 21084)
first.date = '2010-01-01'

# get series from bcb
l.out <- get_series(code = id.series,
                    start_date = first.date ,
                    end_date = Sys.Date())

# check output
class(l.out) # or dplyr::glimpse
## [1] "list"

Note que a saída, nesse caso, é uma lista. Assim como para o caso do pacote BETS, teremos que reformatar os dados para um único dataframe no formato longo. Utilizaremos a mesma estratégia anterior, criaremos uma função para reestruturar os dados e depois chamaremos do.call para agregar os dados.

clean.rbcb <- function(df.in) {
  # function for cleaning data from rbcb
  #
  # ARGS: df.in - dataframe within a list
  #
  # VALUE: a new dataframe with new column type

  #set column
  df.in$type <- names(df.in)[2]
  names(df.in) <- c('date', 'value', 'type')

  # return df
  return(df.in)
}

# call clean.rbcb for each element of l.out
l.out <- lapply(X = l.out, FUN = clean.rbcb)

# bind all dataframes in l.out
df.cred <- do.call(rbind, l.out)

# check result
dplyr::glimpse(df.cred)
## Rows: 224
## Columns: 3
## $ date  <date> 2011-03-01, 2011-04-01, 2011-05-01, 2011-0…
## $ value <dbl> 1.96, 2.04, 2.15, 2.09, 2.18, 2.15, 2.14, 2…
## $ type  <chr> "people", "people", "people", "people", "pe…

Após estruturarmos os dados para o formato correto, partimos para a visualização das séries:

p <- ggplot(df.cred, aes(x=date, y = value, linetype = type)) +
  geom_line() + labs(y = 'Percentage of Credit Default',
                     x = '')

print(p)

Como podemos ver, a inadimplência de crédito para pessoa física aumentou muito mais do que a para pessoa jurídica (empresas) nos últimos anos. Poderiámos, facilmente, integrar o código anterior para uma análise mais completa dos dados em algum problema de pesquisa.

Sugiro o leitor se familiarizar com o sistema de séries temporais do BCB e o pacote rbcb. A quantidade e diversidade de series econômicas e financeiras é muito grande. Além disso, os dados estão sempre atualizados. O uso do rbcb permite uma sinergia entre a etapa de coleta de dados e o estudo em questão.

5.2.5 GetDFPData

Pacote GetDFPData (Perlin 2017) fornece uma interface aberta para todas as demonstrações financeiras distribuídas pela B3 e pela CVM nos sistemas DFP, FRE e FCA. Ele não só faz o download dos dados, mas também consolida as diferentes notações contábeis, ajusta à inflação e torna as tabelas prontas para pesquisa dentro de um formato tabular. Isso inclui a situação da empresa (ativa ou não-ativa), setor, código CVM2, tickers relacionados, histórico de dividendos, estrutura de dívida, remuneração de diretores, e diversos outros eventos e informações corporativas. Os diferenciais do pacote em relação a outros distribuidores de dados comerciais são: livre acesso, facilidade para baixar dados em larga larga escala e a variedade de dados disponíveis.

Uma versão web de GetDFPData foi desenvolvida e publicada na internet como um aplicativo shiny em http://www.msperlin.com/shiny/GetDFPData/. Esse fornece uma interface gráfica direta e simples para as principais funcionalidade do pacote. Usuários podem selecionar as empresas disponíveis, o intervalo de datas e baixar os dados como uma planilha do Excel ou um arquivo compactado com vários arquivos csv.

O ponto de partida no uso de GetDFPData é baixar informações atuais sobre empresas disponíveis. Esta informação é coletada por um script externo que importa e mescla bases de dados atualizadas da B3 e CVM. A tabela resultante é salva como um arquivo csv no Github. Os dados desse arquivo são atualizados periodicamente para acomodar mudanças, tal como a chegada de novas empresas e novos relatórios financeiros.

O acesso a tabela é possível com a função gdfpd.get.info.companies. Estabelecemos argumento type.data = 'companies' para que a função retorne apenas informações sobre empresas, e não arquivos.

library(GetDFPData)

df.info <- gdfpd.get.info.companies(type.data = 'companies')
## Found cache file. Loading data..
dplyr::glimpse(df.info)
## Rows: 525
## Columns: 16
## $ name.company         <chr> "521 PARTICIPAÇOES S.A. - EM…
## $ id.company           <int> 16330, 16284, 24732, 21725, …
## $ cnpj                 <dbl> 1.547749e+12, 1.851771e+12, …
## $ date.registration    <date> 1997-07-11, 1997-05-30, 201…
## $ date.constitution    <date> 1996-07-30, 1997-04-02, 201…
## $ city                 <chr> "RIO DE JANEIRO", "RIO DE JA…
## $ estate               <chr> "RJ", "RJ", "SP", "SP", "SP"…
## $ situation            <chr> "ATIVO", "ATIVO", "ATIVO", "…
## $ situation.operations <chr> "LIQUIDAÇÃO EXTRAJUDICIAL", …
## $ listing.segment      <chr> NA, "Tradicional", NA, "Trad…
## $ main.sector          <chr> NA, "Outros", NA, "Saúde", "…
## $ sub.sector           <chr> NA, "Outros", NA, "Serv.Méd.…
## $ segment              <chr> NA, "Outros", NA, "Serv.Méd.…
## $ tickers              <chr> NA, "QVQP3B", NA, "ADHM3", "…
## $ first.date           <date> 2009-12-31, 2009-12-31, 201…
## $ last.date            <date> 2019-12-31, 2019-12-31, 201…

Essa tabela disponibiliza os identificadores numéricos das empresas, setores de atividades, atual segmento de governança, tickers negociados na bolsa e situação atual (ativa ou não). O número atual de empresas ativas e inativas, a partir de 2020-07-30, está disponível na coluna situation. Observa-se 524 empresas ativas e 1 canceladas. Essa é uma excelente fonte de informação para um estudo exploratório. Pode-se facilmente filtrar empresas para datas, setores, tickers ou segmentos de governança corporativa.

Toda empresa no banco de dados pode ser identificada pelo seu nome oficial ou identificação numérica da CVM. Por uma questão de conveniência, escolhemos selecionar empresas pelo nome. A função gdfpd.search.company permite que o usuário procure o nome oficial de uma instituição. Dado um texto, a função procurará uma correspondência parcial com os nomes de todas as empresas disponíveis no banco de dados. Em seu uso, caracteres latinos e maiúsculas e minúsculas são ignorados. Vamos encontrar o nome oficial nome da Ambev, uma das maiores empresas do Brasil. Para isso, basta usar o comando gdfpd.search.company('ambev'). Após isso, vemos que o nome oficial da Ambev é 'AMBEV S.A.'. Dados estão disponíveis de 2012 até final de 2017. Note que a situação da empresa também é apresentada. Isso ajuda a verificar a disponibilidade dos dados.

Usamos a função principal do pacote, gdfpd.GetDFPData, para baixar informações. Definimos o nome oficial da empresa como entrada name.companies e o período de tempo como entradas first.date e last.date. Vamos baixar os dados disponíveis para a Ambev:

library(GetDFPData)
library(dplyr)

# set options
name.companies <- 'AMBEV S.A.'
first.date <- '2017-12-31'
last.date  <- '2018-12-31'

# download data
df.reports <- gdfpd.GetDFPData(name.companies = name.companies,
                               first.date = first.date,
                               last.date = last.date)
## Found cache file. Loading data..
## 
## Downloading data for 1 companies
## First Date: 2017-12-31
## Laste Date: 2018-12-31
## Inflation index: dollar
## 
## Downloading inflation data
## 	Caching inflation RDATA into tempdir()	Done
## 
## Inputs looking good! Starting download of files:
## 
## AMBEV S.A.
## 	Available periods: 2017-12-31	2018-12-31
## 
## 
## Processing 23264 - AMBEV S.A.
## 	Finding info from Bovespa
## 		Found BOV cache file
## 	Processing 23264 - AMBEV S.A. | date 2017-12-31
## 		Acessing DFP data | Found DFP cache file
## 		Acessing FRE data | Found FRE cache file
## 		Acessing FCA data | Found FCA cache file
## 	Processing 23264 - AMBEV S.A. | date 2018-12-31
## 		Acessing DFP data | Found DFP cache file
## 		Acessing FRE data | Found FRE cache file
## 		Acessing FCA data | Found FCA cache file

As mensagens de gdfpd.GetDFPData relatam os estágios do processo, desde a aquisição de dados da tabela de referência ao download e leitura dos arquivos da B3. Observe que os arquivos de três sistemas são acessados: DFP (Demostrativos Financeiros Padronizados), FRE (Formulário de Referência) e FCA (Formulário Cadastral). Observe também o uso de um sistema de cache, o qual acelera significativamente o uso do software ao salvar localmente as informações importadas.

O objeto resultante de gdfpd.GetDFPData é um tibble, um tipo de objeto tabular que permite colunas do tipo lista (Wickham 2016c). Isso possibilita salvar a informação financeira em uma estrutura tabular. Vamos dar uma olhada no conteúdo de df.reports:

glimpse(df.reports)
## Rows: 1
## Columns: 46
## $ company.name                     <chr> "AMBEV S.A."
## $ company.code                     <int> 23264
## $ cnpj                             <chr> "07526557000100"
## $ date.company.constitution        <date> 2005-07-08
## $ date.cvm.registration            <date> 2013-10-30
## $ company.tickers                  <chr> "ABEV3"
## $ min.date                         <date> 2017-12-31
## $ max.date                         <date> 2018-12-31
## $ n.periods                        <int> 2
## $ company.segment                  <chr> "Tradicional"
## $ current.stockholders             <list> [<data.frame[6 …
## $ current.stock.composition        <list> [<data.frame[3 …
## $ history.files                    <list> [<data.frame[1 …
## $ fr.assets                        <list> [<data.frame[31…
## $ fr.liabilities                   <list> [<data.frame[50…
## $ fr.income                        <list> [<data.frame[52…
## $ fr.cashflow                      <list> [<data.frame[60…
## $ fr.value                         <list> [<data.frame[52…
## $ fr.assets.consolidated           <list> [<data.frame[30…
## $ fr.liabilities.consolidated      <list> [<data.frame[52…
## $ fr.income.consolidated           <list> [<data.frame[56…
## $ fr.cashflow.consolidated         <list> [<data.frame[54…
## $ fr.value.consolidated            <list> [<data.frame[52…
## $ fr.auditing.report               <list> [<data.frame[2 …
## $ history.dividends                <list> [<data.frame[22…
## $ history.stockholders             <list> [<data.frame[12…
## $ history.capital.issues           <list> [<data.frame[4 …
## $ history.mkt.value                <list> [<data.frame[2 …
## $ history.capital.increases        <list> [<data.frame[12…
## $ history.capital.reductions       <list> [<data.frame[0 …
## $ history.stock.repurchases        <list> [<data.frame[2 …
## $ history.other.stock.events       <list> [<data.frame[0 …
## $ history.compensation             <list> [<data.frame[2 …
## $ history.compensation.summary     <list> [<data.frame[6 …
## $ history.transactions.related     <list> [<data.frame[10…
## $ history.debt.composition         <list> [<data.frame[13…
## $ history.governance.listings      <list> [<data.frame[2 …
## $ history.board.composition        <list> [<data.frame[59…
## $ history.committee.composition    <list> [<data.frame[15…
## $ history.family.relations         <list> [<data.frame[2 …
## $ history.family.related.companies <list> [<data.frame[40…
## $ history.auditing                 <list> [<data.frame[8 …
## $ history.responsible.docs         <list> [<data.frame[4 …
## $ history.stocks.details           <list> [<data.frame[2 …
## $ history.dividends.details        <list> [<data.frame[2 …
## $ history.intangible               <list> [<data.frame[12…

Como podemos ver, os dados retornados são vastos. Cada coluna em df.reports é um tabela indexada ao tempo. A explicação de cada coluna não cabe aqui mas vamos dar uma olhada no balanço patrimonial da empresa, disponível em df.reports$fr.assets[[1]]:

# save assets in df
fr.assets <- df.reports$fr.assets[[1]]

# check it
dplyr::glimpse(fr.assets)
## Rows: 31
## Columns: 6
## $ name.company       <chr> "AMBEV S.A.", "AMBEV S.A.", "A…
## $ ref.date           <date> 2017-12-31, 2017-12-31, 2017-…
## $ acc.number         <chr> "1", "1.01", "1.01.01", "1.01.…
## $ acc.desc           <chr> "Ativo Total", "Ativo Circulan…
## $ acc.value          <dbl> 91568737, 11272513, 2017034, 6…
## $ acc.value.infl.adj <dbl> 27686018.32, 3408270.24, 60985…

Para uma melhor visualização dos demostrativos financeiros, o pacote também inclui função gdfpd.convert.to.wide para converter os dados para formato wide, com as datas preenchendo colunas. Veja a seguir:

# convert assets to wide
fr.assets.wide <- gdfpd.convert.to.wide(fr.assets)

# display it
print(fr.assets.wide)
##    acc.number                       acc.desc name.company
## 1           1                    Ativo Total   AMBEV S.A.
## 2        1.01               Ativo Circulante   AMBEV S.A.
## 3     1.01.01  Caixa e Equivalentes de Caixa   AMBEV S.A.
## 4     1.01.02         Aplicações Financeiras   AMBEV S.A.
## 5     1.01.03               Contas a Receber   AMBEV S.A.
## 6     1.01.04                       Estoques   AMBEV S.A.
## 7     1.01.05              Ativos Biológicos   AMBEV S.A.
## 8     1.01.06           Tributos a Recuperar   AMBEV S.A.
## 9     1.01.07           Despesas Antecipadas   AMBEV S.A.
## 10    1.01.08      Outros Ativos Circulantes   AMBEV S.A.
## 11       1.02           Ativo Não Circulante   AMBEV S.A.
## 12    1.02.01 Ativo Realizável a Longo Prazo   AMBEV S.A.
## 13    1.02.02                  Investimentos   AMBEV S.A.
## 14    1.02.03                    Imobilizado   AMBEV S.A.
## 15    1.02.04                     Intangível   AMBEV S.A.
## 16    1.02.05                       Diferido   AMBEV S.A.
##    2017-12-31 2018-12-31
## 1    91568737   88820730
## 2    11272513   10646666
## 3     2017034    2273875
## 4      631637    1037821
## 5     3055953    2864662
## 6     2107274    2603847
## 7           0          0
## 8     2625960    1069011
## 9      572117     631365
## 10     262538     166085
## 11   80296224   78174064
## 12    4148374    6105588
## 13   64593359   60773044
## 14   10806139   10514553
## 15     748352     780879
## 16          0          0

A exportação dos dados também é fácil, basta selecionar um formato ('csv' ou 'xlsx') e usar gdfpd.export.DFP.data:

my.basename <- 'MyExcelData'
my.type.export <- 'xlsx'

gdfpd.export.DFP.data(df.reports = df.reports,
                      base.file.name = my.basename,
                      type.export = my.type.export)
## File  MyExcelData.xlsx  already exists. Deleting it..
## Start Copying Dataframes to MyExcelData.xlsx
## 	Copying table metadata - 1 rows, 5 columns
## 	Copying table metadata - 1 rows, 5 columns
## 	Copying table current.stockholders - 6 rows, 6 columns
## 	Copying table current.stock.composition - 3 rows, 4 columns
## 	Copying table history.files - 1 rows, 2 columns
## 	Copying table fr.assets - 31 rows, 6 columns
## 	Copying table fr.liabilities - 50 rows, 6 columns
## 	Copying table fr.income - 52 rows, 6 columns
## 	Copying table fr.cashflow - 60 rows, 6 columns
## 	Copying table fr.value - 52 rows, 6 columns
## 	Copying table fr.assets.consolidated - 30 rows, 6 columns
## 	Copying table fr.liabilities.consolidated - 52 rows, 6 columns
## 	Copying table fr.income.consolidated - 56 rows, 6 columns
## 	Copying table fr.cashflow.consolidated - 54 rows, 6 columns
## 	Copying table fr.value.consolidated - 52 rows, 6 columns
## 	Copying table fr.auditing.report - 2 rows, 6 columns
## 	Copying table history.dividends - 22 rows, 12 columns
## 	Copying table history.stockholders - 12 rows, 15 columns
## 	Copying table history.capital.issues - 4 rows, 6 columns
## 	Copying table history.mkt.value - 2 rows, 6 columns
## 	Copying table history.capital.increases - 12 rows, 9 columns
## 	Copying table history.capital.reductions - 0 rows, 0 columns
## 	Copying table history.stock.repurchases - 2 rows, 13 columns
## 	Copying table history.other.stock.events - 0 rows, 0 columns
## 	Copying table history.compensation - 2 rows, 19 columns
## 	Copying table history.compensation.summary - 6 rows, 10 columns
## 	Copying table history.transactions.related - 106 rows, 14 columns
## 	Copying table history.debt.composition - 13 rows, 10 columns
## 	Copying table history.governance.listings - 2 rows, 5 columns
## 	Copying table history.board.composition - 59 rows, 19 columns
## 	Copying table history.committee.composition - 15 rows, 19 columns
## 	Copying table history.family.relations - 2 rows, 11 columns
## 	Copying table history.family.related.companies - 40 rows, 12 columns
## 	Copying table history.auditing - 8 rows, 11 columns
## 	Copying table history.responsible.docs - 4 rows, 6 columns
## 	Copying table history.stocks.details - 2 rows, 13 columns
## 	Copying table history.dividends.details - 2 rows, 8 columns
## 	Copying table history.intangible - 120 rows, 7 columns
## 
## Export sucessful. Data available at file MyExcelData.xlsx

O arquivo Excel resultante conterá cada tabela de df.reports em uma aba diferente da planilha.

Apenas tocamos nos pontos principais do pacote GetDFPData. Aos interessados, sugiro a leitura do artigo em Perlin (2017), o qual inclui maiores detalhes sobre os dados disponíveis e o funcionamento das funções.

5.2.6 GetHFData

Pacote GetHFData (Perlin and Ramos 2016) foi projetado para facilitar a importação e análise de dados de negociação de alta frequência na B3. Esses dados são comumente utilizados para a realização de pesquisa na área de microestrutura de mercado. Os dados são coletados diretamente do site ftp da bolsa, no formato de arquivos zipados. Um grande diferencial do pacote é o acesso a dados não somente do mercado de ações, mas também de contratos derivativos tal como opções e futuros, os quais são particularmente difíceis de encontrar. No momento de escrita do livro, GetHFData é o único pacote disponível no CRAN que permite o acesso direto e gratuito a dados de alta frequência.

Vamos apresentar um exemplo simples, baixando dados de transações em uma data atual para duas ações bastante negociadas no mercado financeiro brasileiro, Petrobras (PETR4) e Gerdau (GGBR4). Iremos agregar os dados em intervalos de 5 em 5 minutos.

library(GetHFData)

# set tickers and type of market
my.ticker <- c('PETR4', 'GGBR4')
my.type.market <- 'equity'

# set last date
last.date <-  '2020-04-06'

# get data!
my.df <- ghfd_get_HF_data(my.assets = my.ticker,
                          type.market = 'equity',
                          first.date = last.date,
                          last.date = last.date,
                          first.time = '10:00:00',
                          last.time = '17:00:00',
                          type.output = 'agg',
                          agg.diff = '5 min')
## 
## Running ghfd_get_HF_Data for:
##    type.market = equity
##    type.data = trades
##    my.assets = PETR4	GGBR4
##    type.output = agg
##       agg.diff = 5 min
## Reading ftp contents for equity(trades) (attempt = 1|10)
##    Found  140  files in ftp
##    First available date in ftp:  2019-11-01
##    Last available date in ftp:   2020-05-20
##    First date to download:  2020-04-06
##    Last date to download:   2020-04-06
## Downloading ftp files/NEG_20200406.7z (1|1) Attempt 1
##    -> Reading files - Imported  2924426 lines, 611 unique tickers
##    -> Processing file - Found 172815 lines for 2 selected tickers
##    -> Aggregation resulted in dataframe with 162 rows
# print results
dplyr::glimpse(my.df)
## Rows: 162
## Columns: 13
## $ InstrumentSymbol <chr> "GGBR4", "GGBR4", "GGBR4", "GGBR…
## $ SessionDate      <date> 2020-04-06, 2020-04-06, 2020-04…
## $ TradeDateTime    <dttm> 2020-04-06 10:10:00, 2020-04-06…
## $ n.trades         <int> 435, 500, 405, 365, 675, 492, 39…
## $ last.price       <dbl> 9.76, 9.71, 9.72, 9.69, 9.75, 9.…
## $ weighted.price   <dbl> 9.783742, 9.759295, 9.686895, 9.…
## $ period.ret       <dbl> -0.004081633, -0.005122951, 0.00…
## $ period.ret.volat <dbl> 0.0006176760, 0.0005054092, 0.00…
## $ sum.qtd          <dbl> 362000, 327200, 368800, 255700, …
## $ sum.vol          <dbl> 3541694, 3193223, 3572522, 24821…
## $ n.buys           <int> 243, 255, 280, 256, 486, 307, 25…
## $ n.sells          <int> 192, 245, 125, 109, 189, 185, 13…
## $ Tradetime        <chr> "10:10:00", "10:15:00", "10:20:0…

A saída de ghfd_get_HF_data é um dataframe com várias colunas: tempo, último preço, volatilidade, número de negociações iniciadas pelo comprador/vendedor, entre outras informações. Aqui não cabe explicar cada coluna. Essa informação pode ser encontrada no artigo dos autores, Perlin and Ramos (2016).

O usuário também pode baixar dados brutos, sem agregação, definindo a entrada type.output como 'raw'. Vamos tentar esta opção:

library(GetHFData)

# set options
my.ticker <- c('PETR4','PETR3')
my.type.market <- 'equity'
my.type.data <- 'trades'
first.time <- '10:00:00'
last.time <- '17:00:00'
type.output <- 'raw'

# set last date
last.date <-  '2020-04-06'

# get data!
my.df <- ghfd_get_HF_data(my.assets = my.ticker,
                          type.market = my.type.market,
                          type.data = my.type.data,
                          first.date = last.date,
                          last.date = last.date,
                          first.time = first.time ,
                          last.time = last.time ,
                          type.output = type.output)
## 
## Running ghfd_get_HF_Data for:
##    type.market = equity
##    type.data = trades
##    my.assets = PETR4	PETR3
##    type.output = raw
## Reading ftp contents for equity(trades) (attempt = 1|10)
##    Found  140  files in ftp
##    First available date in ftp:  2019-11-01
##    Last available date in ftp:   2020-05-20
##    First date to download:  2020-04-06
##    Last date to download:   2020-04-06
## Downloading ftp files/NEG_20200406.7z (1|1) Attempt 1
##    -> Reading files - Imported  2924426 lines, 611 unique tickers
##    -> Processing file - Found 208981 lines for 2 selected tickers
# print results
dplyr::glimpse(my.df)
## Rows: 206,968
## Columns: 10
## $ SessionDate         <date> 2020-04-06, 2020-04-06, 2020…
## $ InstrumentSymbol    <chr> "PETR3", "PETR3", "PETR3", "P…
## $ TradePrice          <dbl> 16.05, 16.05, 16.05, 16.05, 1…
## $ TradedQuantity      <dbl> 100, 2200, 3200, 300, 5000, 4…
## $ Tradetime           <chr> "10:11:10.231", "10:11:10.231…
## $ CrossTradeIndicator <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ BuyMember           <dbl> 23, 3, 8, 114, 114, 3, 3, 3, …
## $ SellMember          <dbl> 3, 23, 3, 3, 386, 308, 3, 23,…
## $ TradeDateTime       <dttm> 2020-04-06 10:11:10, 2020-04…
## $ TradeSign           <dbl> -1, -1, -1, -1, -1, -1, -1, -…

A função retorna um dataframe com diversas colunas. Esses dados não tem agregação temporal e mostram as transações no formato cru, com um irregular espaço de tempo entre cada observação. Assim como para o exemplo anterior, não cabe neste livro explicar a informação disponível em cada coluna. Para os mais interessados, recomendo novamente a leitura do artigo dos autores.

Seguindo em frente, vamos visualizar os dados de preços:

Na última atualização do pacote foi implementado a possibilidade de baixar também dados de ordens financeiras enviadas a bolsa por investidores. Isso abre um novo leque de possibilidades de pesquisa, permitindo a construção de índices de liquidez mais fidedignos, tal como o spread de preços, diferença entre melhor preço de venda e preço de compra, resiliência do livro de negócios, entre outras possibilidades. O acesso aos dados é bastante fácil. Seguindo o exemplo anterior, basta trocar argumento my.type.data para orders. O tempo de processamento, porém, é significativamente maior devido ao tamanho dos arquivos a serem baixados e lidos. Veja o exemplo a seguir:

library(GetHFData)

# set options
my.ticker <- c('PETR4','VALE5')
my.type.market <- 'equity'
my.type.data <- 'orders'
first.time <- '10:00:00'
last.time <- '17:00:00'
type.output <- 'raw'

# get available dates from ftp
df.available.dates <- ghfd_get_ftp_contents(my.type.market, 
                                            type.data = my.type.data)
## 
## Reading ftp contents for equity(orders) (attempt = 1|10)
# set last date
last.date <- max(df.available.dates$dates)

# get data!
my.df <- ghfd_get_HF_data(my.assets = my.ticker,
                          type.market = my.type.market,
                          type.data = my.type.data,
                          first.date = last.date,
                          last.date = last.date,
                          first.time = first.time ,
                          last.time = last.time ,
                          type.output = type.output)
## 
## Running ghfd_get_HF_Data for:
##    type.market = equity
##    type.data = orders
##    my.assets = PETR4	VALE5
##    type.output = raw
## Reading ftp contents for equity(orders) (attempt = 1|10)
##    Found  78  files in ftp
##    First available date in ftp:  2019-11-01
##    Last available date in ftp:   2020-02-12
##    First date to download:  2019-12-30
##    Last date to download:   2019-12-30
## Downloading ftp files/OFER_CPA_20191230.gz (1|2) Attempt 1
##    -> Reading files - Imported  10079433 lines, 959 unique tickers
##    -> Processing file - Found 133524 lines for 1 selected tickers
## Downloading ftp files/OFER_VDA_20191230.gz (2|2) Attempt 1
##    -> Reading files - Imported  10784793 lines, 922 unique tickers
##    -> Processing file - Found 154306 lines for 1 selected tickers
# print results
dplyr::glimpse(my.df)
## Rows: 218,073
## Columns: 16
## $ SessionDate           <date> 2019-12-30, 2019-12-30, 20…
## $ InstrumentSymbol      <chr> "PETR4", "PETR4", "PETR4", …
## $ OrderSide             <fct> Buy, Buy, Buy, Buy, Buy, Bu…
## $ SequentialOrderNumber <dbl> 821647541930, 821647544680,…
## $ SecondaryOrderID      <int> 2772367, 21778139, 14478453…
## $ ExecutionType         <fct> Cancel, Trade, Update, Trad…
## $ PriorityTime          <chr> "10:50:21.235000", "16:05:4…
## $ PriorityIndicator     <chr> "2147483647", "2147483647",…
## $ OrderPrice            <dbl> 25.84, 30.22, 30.20, 30.20,…
## $ TotalQuantity         <dbl> 300, 200, 400, 400, 400, 30…
## $ TradedQuantity        <dbl> 0, 200, 0, 100, 400, 0, 300…
## $ OrderDatetime         <dttm> 2019-12-30 10:50:21, 2019-…
## $ OrderStatus           <fct> Canceled, Filled, Replaced,…
## $ AgressorIndicator     <int> 0, 2, 0, 2, 2, 0, 2, 0, 2, …
## $ Member                <int> 58, 3, 308, 308, 308, 308, …
## $ PriorityDateTime      <dttm> 2019-12-30 10:50:21.235, 2…

Não é incomum o computador travar com esse exemplo. O problema é que o R usa toda a memória da máquina para alocar os dados de ordens financeiras, não deixando memória suficiente para o sistema operacional. Caso isso acontecer, tente fechar o RStudio ou reiniciar a sessão. Em caso extremo, reinicialize o seu computador.

5.2.7 GetTDData

Arquivos com informações sobre preços e retornos de títulos emitidos pelo governo brasileiro podem ser baixados manualmente no site do Tesouro Nacional. O tesouro direto é um tipo especial de mercado onde o governo brasileiro é o credor e formador de mercado ao mesmo tempo (Perlin 2016a). Os títulos vendidos na plataforma são bastante populares devido a atratividade das taxas de retorno e alta liquidez oferecida ao investidor comum. Isso inclui títulos do tipo LFT, LTN, NTN-C, NTN-B, NTN-B Principal e NTN-F.

Pacote GetTDData importa os dados das planilhas em Excel e os organiza. O resultado é um dataframe com formato adequado que torna o uso destes dados muito mais fácil. O usuário apenas precisa indicar o nome dos ativos de renda fixa e as datas de maturidade desejadas.

Como exemplo, vamos baixar dados de um título prefixado do tipo LTN com vencimento em 2021-01-01. Esse é o tipo de contrato de dívida mais simples que o governo brasileiro emite, não pagando nenhum cupom durante sua validade e, na data de vencimento, retorna 1.000 R$ ao comprador. Para baixar os dados da internet, basta usar o código a seguir:

library(GetTDData)

asset.codes <- 'LTN'   # Identifier of assets
maturity <- '010121'  # Maturity date as string (ddmmyy)

# download
my.flag <- download.TD.data(asset.codes = asset.codes)

# read files
df.TD <- read.TD.files(asset.codes = asset.codes,
                       maturity = maturity)

Vamos checar o conteúdo do dataframe:

# check content
dplyr::glimpse(df.TD)
## Rows: 1,106
## Columns: 5
## $ ref.date   <date> 2015-03-10, 2015-03-11, 2015-03-12, 2…
## $ yield.bid  <dbl> 0.1324, 0.1310, 0.1304, 0.1354, 0.1335…
## $ price.bid  <dbl> 487.04, 490.78, 492.53, 480.37, 485.28…
## $ asset.code <chr> "LTN 010121", "LTN 010121", "LTN 01012…
## $ matur.date <date> 2021-01-01, 2021-01-01, 2021-01-01, 2…

Temos informações sobre data de referência, yield (retorno), preço e dia de maturidade. No gráfico a seguir checamos os dados:

Como esperado de um título de dívida pré-fixado, os preços possuem uma tendência positiva. Essa dívida irá valer exatamente 1000 R$ na sua data de maturidade, 2021-01-01. Podemos também visualizar as mudanças do yield do título:

Os retornos do título estão em tendência de queda. Este resultado é esperado pois, como vimos anteriormente, a taxa SELIC está num nível muito baixo.

As funções do GetTDData também funcionam com vários argumentos como asset.codes e maturity. Suponhamos que desejamos visualizar todos os preços de todos os prazos disponíveis para títulos do tipo LTN a partir de 2010. Tudo o que precisamos fazer é adicionar o valor NULL ao argumento maturity e filtrar as datas:

library(GetTDData)

asset.codes <- 'LTN'   # Name of asset
maturity <- NULL      # = NULL, downloads all maturities

# download data
my.flag <- download.TD.data(asset.codes = asset.codes,
                            do.clean.up = F)

# reads data
df.TD <- read.TD.files(asset.codes = asset.codes,
                       maturity = maturity)

# remove data prior to 2010
df.TD <- dplyr::filter(df.TD,
                       ref.date >= as.Date('2010-01-01'))

Após a importação das informações, plotamos os preços dos diferentes ativos:

Note como todos contratos do tipo LTN terminam com valor 1000 R$ em sua data de expiração e possuem uma dinâmica linear de crescimento de preço ao longo do tempo.

Outra funcionalidade do pacote GetTDData é o acesso a curva de juros atual do sistema financeiro brasileiro diretamente do site da Anbima. Para isso, basta utilizar a função get.yield.curve:

library(GetTDData)

# get yield curve
df.yield <- get.yield.curve()

# check result
dplyr::glimpse(df.yield)
## Rows: 108
## Columns: 5
## $ n.biz.days   <dbl> 126, 252, 378, 504, 630, 756, 882, 1…
## $ type         <chr> "real_return", "real_return", "real_…
## $ value        <dbl> -0.7774, -0.4630, -0.0945, 0.2590, 0…
## $ ref.date     <date> 2020-12-02, 2021-04-07, 2021-08-11,…
## $ current.date <date> 2020-07-29, 2020-07-29, 2020-07-29,…

Os dados incluem a curva de juros nominal, juros real e da inflação. Para melhor visualizar as informações, vamos plotá-las em um gráfico:

Observamos um nível relativamente estável da taxa de juros real e uma expectativa de queda do juros nominal nos próximos meses. Esse código pode ser rodado a cada dia, mostrando a curva de juros atualizada.

5.2.8 Rbitcoin

Dada a recente popularidade das criptomoedas, outro pacote que vale a pena mencionar é RBitcoin. Esse permite o acesso a informações de transação do Bitcoin. Aqui, vamos mostrar um exemplo simples de importar dados da bolsa internacional kraken, usando o Euro como a moeda.

library(Rbitcoin)

# set mkt, currency pair and type of action
my.mkt <- "kraken"
my.currency <- c("BTC","EUR")
my.action <- 'trades'

# import data
my.l <- market.api.process(market = my.mkt,
                           currency_pair = my.currency,
                           action = my.action)

# check content
class(my.l)
## [1] "list"

A saída de market.api.process é um objeto do tipo lista com informações sobre Bitcoin no mercado 'kraken'. As informações de negociações estão disponíveis no item trade de my.l. Vamos dar uma olhada no seu conteúdo:

dplyr::glimpse(my.l$trades)
## Rows: 1,000
## Columns: 5
## $ date   <dttm> 2020-07-30 11:40:00, 2020-07-30 11:40:05,…
## $ price  <dbl> 9329.5, 9329.6, 9329.6, 9329.6, 9329.7, 93…
## $ amount <dbl> 0.07157467, 0.05813590, 0.02146581, 0.0923…
## $ tid    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ type   <chr> "ask", "bid", "bid", "bid", "bid", "bid", …

Essas incluem informações sobre preços e horários para os últimos 1000 negócios. O pacote também inclui funções para procurar o livro de ofertas de cada mercado e gerenciar carteiras Bitcoin. Mais detalhes sobre as funcionalidades do pacote são encontrados em seu site do Github.

5.2.9 Outros Pacotes

Nas seções anteriores destacamos os principais pacotes gratuitos para aquisição de dados financeiros e econômicos no Brasil. Esses representam uma pequena parcela da totalidade. No CRAN você encontrará muitos outros. A interface para fontes de dados comerciais também é possível. Várias empresas fornecem APIs para facilitar o envio de dados aos seus clientes. Pacotes como Rblpapi (Bloomberg), IBrokers (Interactive Brokers), TFX (TrueFX), rdatastream (Thomson Dataworks) fazem o R se comunicar com essas APIs e permitir a importação de conjuntos de dados. Se a empresa de fornecimento de dados que você usa no trabalho não for apresentada aqui, a lista de pacotes CRAN pode ajudá-lo a encontrar o pacote, caso existir.

5.3 Acessando Dados de Páginas na Internet (Webscraping)

Os pacotes destacados anteriormente são muito úteis pois facilitam a importação de dados específicos diretamente da internet. Em muitos casos, porém, os dados de interesse não estão disponíveis via API formal, mas sim em uma página na internet - geralmente no formato de uma tabela. O processo de extrair informações de páginas da internet chama-se webscraping (raspagem de dados). Dependendo da estrutura e da tecnologia da página da web acessada, importar essas informações diretamente para o R pode ser um procedimento trivial – mas também pode se tornar um processo extremamente trabalhoso.

Como exemplo, observe o caso da página do Tesouro Direto. Essa página mostra os preços e os retornos atuais dos diferentes títulos da dívida pública que os investidores do tipo pessoa física podem comprar. As informações da página são atualizadas diariamente. Portanto, como os valores refletem as marcações do mercado dos títulos, os dados dessa página podem ser utilizados para atualizar o valor de um portfólio com investimentos em títulos públicos.

A importação desses dados para o R é fácil. O pacote XML possui uma série de funções para ler e criar códigos em xml e html. Uma dessas funções é readHTMLTable, que lê tabelas de páginas da internet, retornando um objeto da classe de listas. Nesse objeto, cada elemento equivale a uma tabela encontrada na página. Veja o seu uso para o caso do Tesouro Direto a seguir:

library(XML)

# set url (EXAMPLE NOT WORKING)
my.url <-paste0('https://www.tesourodireto.com.br/titulos/precos-e-taxas.htm')

# read site
l.out <- readHTMLTable(my.url, encoding = 'UTF-8')

# find table in slot 2
df.out <- l.out[[2]]

# check contents
dplyr::glimpse(df.out)

Observa-se que a tabela importada é exatamente igual à da página. Um lado negativo da importação, porém, é que as informações são importadas exatamente como são apresentadas no site. Por exemplo: os retornos (yields) dos títulos contêm o caractere % e são da classe fator. Além disso, os nomes das colunas da tabela importada devem ser adicionados manualmente. Uma etapa posterior à importação dos dados crus é a limpeza dos mesmos e a modificação das colunas para as classes corretas.

O uso de técnicas de webscraping se torna um forte aliado do pesquisador. Essas lhe dão acesso a uma imensa quantidade de informações disponíveis na web. No entanto, cada cenário de webscraping é particular. Não é sempre o caso que você pode importar dados de forma direta e fácil. Outro problema no webscraping é que o método de captura de dados não é estável. Qualquer mudança na estrutura da página irá quebrar o código. Na minha experiência, é bastante comum que códigos que funcionavam um ano atrás não funcionem mais pois a página de origem foi modificada. Isso requere mais tempo de desenvolvimento do programador. Àqueles leitores interessados nesse tópico, sugiro fortemente o estudo das funcionalidades dos pacotes rvest (Wickham 2016b), XML (Lang and CRAN Team 2016), RSelenium (Harrison 2016) e splashr, disponível no Github.

5.4 Exercícios

  1. Utilizando pacote BatchGetSymbols, baixe os dados da ação MDIA3 no Yahoo Finance para os últimos 30 dias. Qual o preço ajustado mais baixo no período analisado? Qual a data com o preço mais baixo?

  2. Caso não o tenha feito, crie um perfil no site do Quandl e baixe dados sobre preços de café arábica no banco de dados do CEPEA (Centro de Estudos Avançados em Economia Aplicada) para o último mês.

  3. Utilize pacote rbcb para baixar dados do IPCA nos últimos 5 anos. É possível observar algum período com deflação (inflação negativa) mensal?

  4. Visite o site de sistema de séries temporais do Banco Central do Brasil e escolha uma série para análise de acordo com seus próprios interesses de pesquisa. Importe a mesma usando pacote bcb.

  5. Utilizando função GetDFPData::gdfpd.get.info.companies, baixe informações sobre as ações negociadas na B3. Quantas empresas estão atualmente disponíveis no banco de dados? Qual a proporção de empresas ativas? Qual a empresa mais antiga? Quantas empresas existem para o setor de Utilidade Pública?

  6. Com pacote GetDFPData, baixe os demostrativos financeiros mais recentes da Petrobras. Qual foi o seu lucro líquido no exercício? Qual foi o pagamento de proventos para o acionista (dividendo ou JSCP) mais recente?

  7. Com base no pacote GetTDData, baixe dados para títulos do tipo LTN (Letras Financeiras do Tesouro). Entre todas LTNs, qual o título com maior data de vencimento?

Referências

Assaf Neto, Alexandre. 2010. Estrutura E análise de Balanços: Um Enfoque Econômico-Financeiro. Atlas.

Harrison, John. 2016. RSelenium: R Bindings for Selenium Webdriver. https://CRAN.R-project.org/package=RSelenium.

Lang, Duncan Temple, and the CRAN Team. 2016. XML: Tools for Parsing and Generating Xml Within R and S-Plus. https://CRAN.R-project.org/package=XML.

Matarazzo, Dante Carmine, and Armando Oliveira Pestana. 2010. Analise Financeira de Balanços: Abordagem Básica E Gerencial: Livro de Exercı́cios. Atlas.

Perlin, Marcelo. 2016a. “A Microestrutura Do Tesouro Direto: Sazonalidade Do Fluxo de Ordens E O Processo de Formação de Spreads.” Economia Aplicada 20 (3): 253.

Perlin, Marcelo. 2016b. BatchGetSymbols: Downloads and Organizes Financial Data for Multiple Tickers.

Perlin, Marcelo. 2017. GetDFPData: Reading Annual Financial Reports from Bovespa’s Dfp and Fre System. https://github.com/msperlin/GetDFPData/.

Perlin, Marcelo, and Henrique Ramos. 2016. GetHFData: A R Package for Downloading and Aggregating High Frequency Trading Data from Bovespa. Available at SSRN. https://ssrn.com/abstract=2824058.

Ryan, Jeffrey A. 2015. Quantmod: Quantitative Financial Modelling Framework. https://CRAN.R-project.org/package=quantmod.

Wickham, Hadley. 2016b. Rvest: Easily Harvest (Scrape) Web Pages. https://CRAN.R-project.org/package=rvest.

Wickham, Hadley. 2016c. Tidyr: Easily Tidy Data with ‘Spread()‘ and ‘Gather()‘ Functions. https://CRAN.R-project.org/package=tidyr.


  1. Empresas como kibot, pitrading e backtestmarket, vendem esses dados ao público.↩︎

  2. O código CVM é o identificador único que a CVM (Comissão de Valores Mobiliários) define para cada empresa negociada em bolsa. Estas informações são usadas extensivamente por GetDFPData para identificar empresas em outros conjuntos de dados da B3 e da CVM.↩︎