Tesouro Direto – Download de dados com o R

Diversas fontes – Um banco de dados

Primeiros passos

Este é o primeiro post de uma série que aborda as complexidades de se obter, tratar, analisar e visualizar dados. Para isso vamos utilizar os dados do Tesouro Direto os quais deverão passar pelas seguintes fases:

  1. Download dos dados do site do Tesouro
  2. Tratamento e consolidação das bases em uma base única
  3. Análise e visualização

Para este processo vamos utilizar as seguintes bibliotecas: ‘Dplyr’ e ‘Tidyr’ para o trabalho direto com dados, ‘RCurl’ para checar os links, ‘lubridate’ para arrumar as datas, ‘XLConnect’ para trabalhar com o Excel e o ‘Knitr’ para postar tudo no wordpress.

Obviamente existem 1000 maneiras de se preparar Neston de se trabalhar com dados e os métodos aqui presentes tentam levar em consideração alguns parâmetros como simplicidade e familiaridade, portanto, sempre que for possível resolver problemas com as mesmas ferramentas, métodos e as bibliotecas mencionadas acima nós o faremos.

Os dados – Tesouro Direto

O site do tesouro e os das corretoras geralmente tem os dados com o preço de d-1 dos títulos e a posição da sua carteira, em alguns casos específicos precisamos fazer o download dos dados de preços históricos do Tesouro.

Geralmente isso ocorre quando:

  1. Os títulos estão próximos do vencimento e não possuem mais tanta liquidez
  2. Existe a necessidade de fazer uma análise histórica
  3. Queremos comparar o desempenho com outras aplicações

Os preços dos títulos são disponibilizados para download na seguinte página

http://www.tesouro.fazenda.gov.br/tesouro-direto-balanco-e-estatisticas

Download dos dados

A primeira coisa a fazer é pegar o link do arquivo de dados. Um ponto importante sobre esses dados é que eles são dados diários de preços dos títulos do governo, o que faz com que cada arquivo do ano corrente seja ‘descartável’, pois um dia depois ele se torna desatualizado e temos que fazer download dos dados novamente.

A explicação segue logo abaixo.

Primeiro vamos pegar os links de todos os arquivos. Existem várias maneiras de se fazer isso, porém cada uma delas vai merecer um tutorial em separado, então vamos (dessa vez) fazer no método barroco.

Como nessa vida nada é fácil, vamos dar uma olhada na estrutura de links da página de estatísticas do Tesouro.

De 2002 até 2012 os arquivos se encontram em um endereço

http://www3.tesouro.gov.br/tesouro_direto/download/historico/2002/historicoLFT_2002.xls

A partir de 2012 em outro:

http://www.tesouro.fazenda.gov.br/documents/10180/137713/LFT_2012.xls

Vamos lá… O que importa é o nome do arquivo e o seu endereço, então vamos construir na raça os links para não ter que ficar escrevendo um por um. Só temos que combinar os nomes dos títulos com os anos e os endereços corretos.

Vamos começar…

Carregando as bibliotecas

library(dplyr)
library(tidyr)
library(knitr)

Primeiro montamos um vetor com os nomes dos títulos que vamos baixar (todos)

titulos <- c('LFT', 'LTN', 'NTN-C', 'NTN-B', 'NTN-B_Principal', 'NTN-F')

Para cada título vamos ter que cadastrar 14 endereços diferentes, um para cada ano, já que as bases estão desagregadas, então vamos criar uma matriz repetindo cada nome de título 14 vezes…isso vai fazer sentido mais para frente quando tivermos que usar esses dados para classificar nosso banco.

m <- matrix(1,ncol = 14, nrow=length(titulos))
m[1:length(titulos),] <- titulos
t(m)
##       [,1]  [,2]  [,3]    [,4]    [,5]              [,6]
##  [1,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
##  [2,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
##  [3,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
##  [4,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
##  [5,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
##  [6,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
##  [7,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
##  [8,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
##  [9,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
## [10,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
## [11,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
## [12,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
## [13,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"
## [14,] "LFT" "LTN" "NTN-C" "NTN-B" "NTN-B_Principal" "NTN-F"

Depois precisamos cadastrar os endereços, um até 2012 e um de 2012 em diante e precisamos criar um vetor de datas

prefix <- 'http://www3.tesouro.gov.br/tesouro_direto/download/historico/'
prefix2 <- 'http://www.tesouro.fazenda.gov.br/documents/10180/137713/'
ano <- 2002:2015

Agora combinamos tudo em um data.frame

enderecos <- data.frame(END=c(rep(prefix,10),rep(prefix2,4)),ANO=ano, TITULOS=t(m))

Quase…Agora temos todas as informações que precisamos, só que a base está desorganizada. Para organiza-la usamos a função ‘gather’

baseEnd <- gather(enderecos,"COUNT", "TITULO",3:(length(titulos)+2))
baseEnd[1:3,]
##                                                             END  ANO
## 1 http://www3.tesouro.gov.br/tesouro_direto/download/historico/ 2002
## 2 http://www3.tesouro.gov.br/tesouro_direto/download/historico/ 2003
## 3 http://www3.tesouro.gov.br/tesouro_direto/download/historico/ 2004
##       COUNT TITULO
## 1 TITULOS.1    LFT
## 2 TITULOS.1    LFT
## 3 TITULOS.1    LFT

Ótimo, agora é só criar as strings com os endereços que vamos fazer os downloads. Fazemos isso usando o comando ‘paste’ e uma combinação de ANO, END e TITULO para imitar o link do site do tesouro.

sub12 <-  paste(baseEnd$END,baseEnd$ANO,'/historico', baseEnd$TITULO,'_',baseEnd$ANO,'.xls', sep='')
pos12 <- paste(baseEnd$END,baseEnd$TITULO,'_',baseEnd$ANO,'.xls', sep='')

baseEnd$FINAL <- ifelse(baseEnd$ANO>=2012,pos12,sub12)
baseEnd <- baseEnd %>% select(-END)

baseEnd[1:3,]
##    ANO     COUNT TITULO
## 1 2002 TITULOS.1    LFT
## 2 2003 TITULOS.1    LFT
## 3 2004 TITULOS.1    LFT
##                                                                                     FINAL
## 1 http://www3.tesouro.gov.br/tesouro_direto/download/historico/2002/historicoLFT_2002.xls
## 2 http://www3.tesouro.gov.br/tesouro_direto/download/historico/2003/historicoLFT_2003.xls
## 3 http://www3.tesouro.gov.br/tesouro_direto/download/historico/2004/historicoLFT_2004.xls

Quase(2)…Os links das NTNs podem ou não conter um ‘-‘ separando o tipo dependendo do ano (lógico…Qual o sentido de facilitar?). Para arrumar isso faremos uma substituição de ‘string’ dependendo do ano.

baseEnd$FINAL <-  ifelse(baseEnd$ANO<2012,
                          gsub("NTN-",replacement = 'NTN' ,baseEnd$FINAL),
                          baseEnd$FINAL)

baseEnd$FINAL <-  ifelse(baseEnd$ANO<2012,
                          gsub("_Principal",replacement = 'Principal' ,baseEnd$FINAL),
                          baseEnd$FINAL)

Levamos um pouco mais de 20 linhas de código para montar o mapa dos dados que vamos usar. Com esse mapa vamos não só fazer os downloads, mas também ele vai nos auxiliar em arrumar todo o conteúdo.

O que temos até agora?

print(paste(nrow(baseEnd), 'Links!!!'))
## [1] "84 Links!!!"

Nessas horas, independente da linguagem, é melhor resolver esse tipo de problema com programação do que misturando planilhas na raça.

Aqui temos um problema:

  • Montamos todas as combinações de títulos, endereços e datas, porém alguns títulos não existiam há alguns anos atrás, então o download vai falhar. Isso nós vamos tratar mais para frente na hora do download.

Download dos dados

Aqui pagamos pela preguiça do passado, como a matriz de endereço foi montada com todas as combinações existentes de títulos, alguns links não devem existir. Isso vai gerar um erro e o loop vai parar, a não ser que embrulhemos o comando problemático (download.file) com algo que identifique se o link existe ou não. Uma opção seria usar um ‘try’, porém sempre que o ‘try’ falha ele gera um arquivo de tamanho ‘0’ (zero), então a melhor forma é simplesmente checar se o endereço existe mesmo com o comando ‘url.exists’

library(RCurl)
url.exists('www.google.com')
## [1] TRUE
url.exists('zzzzzzzzz')
## [1] FALSE

O que resulta em ‘se o link existir, faça o download, caso contrário, pule para o próximo’.

for (i in 1:nrow(baseEnd)){
        arq <- paste('.\\TD\\', baseEnd$TITULO[i], '_', baseEnd$ANO[i], '.xls', sep='')

        if (url.exists(baseEnd$FINAL[i])){
                download.file(baseEnd$FINAL[i],arq, mode="wb")
        }
}

Vamos checar o que temos até agora:

length(list.files('.\\TD', '*.xls'))
## [1] 78

O download dos dados do tesouro pode ser quebrado em algumas partes:

  • No site do Tesouro identificamos os links que queremos consultar
  • Criamos um data.frame com cada um dos links
    • Como data.frames são basicamente coleções de vetores, podemos nomear cada um desses vetores com o nome do título que estamos baixando, dessa forma quando utilizamos o cifrão (‘$’) depois do nome do objeto – nesse caso ‘FINAL’ podemos chamar exatamente o vetor que queremos.
    • filtrar baseEnd$TITULO resulta em um data.frame com os links resultantes do filtro
  • Por fim o comando download.file() que vai buscar:
    • O caminho contido no data.frame ‘baseEnd’
    • Salva este arquivo como a concatenação de texto do nome do título e .xls usando o comando ‘paste()’ (que é o concatenar do R). Note que paste sempre coloca um espaço entre os textos, então somos obrigados a colocar sep=”.

O resultado são vários arquivos salvos na pasta de trabalho

Por fim, essa operação só precisa ser feita uma vez para os anos anteriores e caso de atualizações podemos usar o código acima e simplesmente filtrar o ano que queremos baixar (2015 e próximos…)

baseEnd %>% filter(ANO==2015)
##    ANO     COUNT          TITULO
## 1 2015 TITULOS.1             LFT
## 2 2015 TITULOS.2             LTN
## 3 2015 TITULOS.3           NTN-C
## 4 2015 TITULOS.4           NTN-B
## 5 2015 TITULOS.5 NTN-B_Principal
## 6 2015 TITULOS.6           NTN-F
##                                                                               FINAL
## 1             http://www.tesouro.fazenda.gov.br/documents/10180/137713/LFT_2015.xls
## 2             http://www.tesouro.fazenda.gov.br/documents/10180/137713/LTN_2015.xls
## 3           http://www.tesouro.fazenda.gov.br/documents/10180/137713/NTN-C_2015.xls
## 4           http://www.tesouro.fazenda.gov.br/documents/10180/137713/NTN-B_2015.xls
## 5 http://www.tesouro.fazenda.gov.br/documents/10180/137713/NTN-B_Principal_2015.xls
## 6           http://www.tesouro.fazenda.gov.br/documents/10180/137713/NTN-F_2015.xls

No próximo post vamos examinar como abrir e trabalhar com esses dados no Excel…

Advertisements

One thought on “Tesouro Direto – Download de dados com o R

  1. Pingback: Tesouro Direto – Do Excel para o R | Dados Dados Dados

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s