Em vários momentos do nosso Curso de Renda Fixa usando o R, usamos a curva de juros PRÉ da B3 no apreçamento de alguns intrumentos de renda fixa. Essa curva é importantíssima para o mercado financeiro brasileiro. Diversos instrumentos financeiros como títulos de dívida e derivativos são apreçados com as taxas de juros dessa curva. Fora a sua importância como fator de risco primário no mercado financeiro.
Neste post vamos ver como salvar um histórico dessa curva com a função `get_curve` utilizada em outros posts.
Vamos começar importando os pacotes necessários e fazendo a configuração do calendário do `bizdays`.
library(glue) library(xml2) library(stringr) library(bizdays) library(tidyverse) bizdays.options$set(default.calendar="Brazil/ANBIMA")
Segue a função `get_curve`:
get_curve <- function (refdate, ticker="PRE") { print(refdate) refdate <- as.Date(refdate) url <- "http://www2.bmf.com.br/pages/portal/bmfbovespa/lumis/lum-taxas-referenciais-bmf-ptBR.asp" url <- glue("{url}?Data={format(refdate, '%d/%m/%Y')}&Data1={format(refdate, '%Y%m%d')}&slcTaxa={ticker}") doc <- read_html(url) tbl <- xml_find_all(doc, "//table[contains(@id, 'tb_principal1')]") if (length(tbl) == 0) return(NULL) num <- xml_find_all(tbl[[1]], "td") %>% xml_text() %>% str_trim() %>% str_replace(",", ".") %>% as.numeric() dc <- num[c(TRUE, FALSE, FALSE)] tx_252 <- num[c(FALSE, TRUE, FALSE)] terms <- bizdayse(refdate, dc) ix <- (terms %% 21) == 0 terms <- c(terms[1], terms[ix]) rates <- c(tx_252[1], tx_252[ix])/100 log_pu <- log((1 + rates)^(terms/252)) rate <- function(pu, term) pu^(252/term) - 1 log_price_interpolator <- approxfun(terms, log_pu, method="linear") function (term) { pu <- exp(log_price_interpolator(term)) rate(pu, term)*100 } }
É importante notar que essa função retorna outra função, e esta recebe um único argumento que é o prazo para as taxas de juros. Ou seja, a função retornada recebe prazos em dias úteis e retorna as taxas de juros correspondentes a estes prazos.
Vamos fazer o download de diversas curvas para diversas datas, armazenar as funções retornadas por `get_curve` em uma lista e salvar essa lista em um arquivo para que possamos usar posteriormente sem precisar realizar novamente os downloads.
curves <- seq(as.Date("2015-01-01"), as.Date("2021-04-29"), "day") %>% map(get_curve) %>% compact() save(curves, file = "curves.rda")
load("curves.rda")
A variável `curves` é uma lista com todas as curvas baixadas. Uma análise interessante a ser realizada com esse histórico de curvas é avaliar o comportamento dos juros longos, por exemplo, juros de 10 anos, equivalente a 2520 dias úteis.
rates_10Y <- curves %>% map_dbl(~ .x(2520)) dates <- names(rates_10Y) %>% as.Date() tibble(Dates = dates, Rates = rates_10Y) %>% ggplot(aes(x = Dates, y = Rates)) + geom_line()
Como podemos ver, os rentistas já tiveram dias melhores.
____________________________
(*) Conheça nosso Curso de Renda Fixa usando o R.