library(Quandl)
<- Quandl("USTREASURY/YIELD") yc_all
No mercado norte americano há cotações para taxas de juros em prazos fixos, 1 ano, 5 anos, 10 anos, e assim por diante. Estas estruturas são conhecidas como Constant Term Maturities.
Estes dados podem ser obtidos do site do Tesouro Americano (US Treasury) com o pacote {Quandl}.
Podemos observar um longo histórico, desde a década de 90, para estas taxas.
library(tidyverse)
|>
yc_all ggplot(aes(x = Date, y = `10 YR` / 100)) +
geom_line() +
labs(
x = NULL, y = NULL,
title = "Histórico de Taxas de Juros Americanos de 10 Anos (Treasury Bonds)",
caption = "Dados do US Treasury obtidos com o pacote Quandl - wilsonfreitas"
+
) scale_y_continuous(labels = scales::percent)
No mercado brasileiro, infelizmente, a vida é um pouco miserável, e não há um histórico disponível com taxas de longo prazo. É necessário construir na unha e na força do ódio.
Os ativos líquidos de onde são extraídas as taxas de juros de longo prazo são os contratos futuros de taxa DI - DI1, que são cotados diariamente na B3 em seus vencimentos. Entretanto, as taxas de juros obtidas destes contratos apresentam um prazo diferente a cada dia. Assim, é necessário construir uma curva de juros com estes contratos e realizar uma interpolação nos prazos fixos, 1 ano, 5 anos, 10 anos, e por aí vai.
Vamos utilizar o pacote {rb3} para obter o histórico com as curvas diárias de juros prefixados do mercado brasileiro e o pacote {fixedincome} para construir os objetos de curvas de juros e realizar a interpolação das curvas nos vértices fixos para obter o histórico de taxas de juros de longo prazo.
Vamos começar importando os pacotes utilizados nessa jornada.
library(rb3)
library(bizdays)
library(fixedincome)
library(tidyverse)
A função rb3::yc_mget
retorna um data.frame com o histórico de curvas de juros. Vamos baixar um histórico desde 2019.
<- yc_mget(
dc first_date = "2019-01-01",
last_date = preceding(Sys.Date() - 1, "Brazil/ANBIMA"),
cache_folder = "../../../rb3-data"
)
Warning: Automatic coercion from double to character was deprecated in purrr 1.0.0.
ℹ Please use an explicit call to `as.character()` within `map_chr()` instead.
ℹ The deprecated feature was likely used in the rb3 package.
Please report the issue at <https://github.com/wilsonfreitas/rb3/issues>.
De posse do histórico, vamos construir as curvas de juros para cada data de referência utilizando a função fixedincome::spotratecurve
. A curva de juros prefixada tem as seguintes características:
- regime de capitalização:
discrete
(juros compostos) - regra de contagem de dias:
business/252
- calendário:
Brazil/ANBIMA
- interpolação: flat-forward
Adicionalmente faço uma limpeza nos eventuais problemas encontrados nos dados, como dias úteis zerados e duplicados. Bem, é de graça, exigir dados corretos deve ser um pouco demais, né?
unique(dc$refdate) |> map(function(date, df) {
<- df |>
df_curve filter(refdate == date, biz_days > 0) |>
filter(!duplicated(biz_days))
<- spotratecurve(
curve $r_252,
df_curve$biz_days,
df_curve"discrete", "business/252", "Brazil/ANBIMA",
refdate = date
)interpolation(curve) <- interp_flatforward()
curvedf = dc) -> curves },
Obtendo um lista com as curvas de juros utilizamos os colchetes [[
para realizar a interpolação no prazo fixo de 10 anos. Como estas curvas utilizam a regra de contagem de dias business/252
, devemos considerar que 1 ano tem 252 dias úteis e portanto, 10 anos tem 2520 dias úteis. Por isso, interpolamos a curva no vértice 2520.
|>
curves map_dfr(\(x) tibble(
refdate = x@refdate,
r_BRL_10y = as.numeric(x[[2520]])
-> rates_10y ))
Já aproveito e retorno o histórico em um data.frame com as colunas refdate
e r_BRL_10y
. Faço isso para juntar com os dados de juros americanos de 10 anos e assim comparar a dinâmica das taxas conjuntamente.
<- rates_10y |>
rates_10y left_join(yc_all |> select(Date, `10 YR`), by = c("refdate" = "Date")) |>
rename(r_USD_us_10y = `10 YR`) |>
mutate(r_USD_us_10y = r_USD_us_10y / 100)
Note que eu nomeio a taxa de juros americana com r_USD_us_10y
, pois essa é uma taxa que capitaliza o dólar (USD) nos Estados Unidos (us). Abaixo faço um malabarismo com tidyr::pivot_longer
para preparar os dados para o ggplot
e assim visualizá-los lado a lado. Note ainda que libero a escala dos gráficos (scales = "free_y"
) para que a diferença de nível entre as taxas de juros, brasileira e americana, não afete a análise. O objetivo é visualizar a dinâmica das taxas de juros ao longo do tempo.
|>
rates_10y ::pivot_longer(
tidyrc(r_BRL_10y, r_USD_us_10y),
names_to = "rates"
|>
) ggplot(aes(x = refdate, y = value, colour = rates)) +
geom_line() +
facet_wrap(. ~ rates, scales = "free_y") +
labs(
x = NULL, y = NULL,
title = "Histórico de Taxas de Juros de 10 Anos",
subtitle = "Americanos (r_USD_us_10y) e Brasileiro (r_BRL_10y)",
caption = "wilsonfreitas"
+
) scale_y_continuous(labels = scales::percent) +
theme(legend.position = "none")