16 anos de Curva Prefixada

Observando a dinâmica da estrutura a termo de juros no Brasil e nos Estados Unidos ao longo dos últimos 16 anos.

R
fixedincome
rb3
opendata
Author

Wilson Freitas

Published

June 18, 2022

library(rb3)
library(bizdays)

Attaching package: 'bizdays'
The following object is masked from 'package:stats':

    offset
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(fixedincome)

Attaching package: 'fixedincome'
The following objects are masked from 'package:dplyr':

    first, last
library(ggplot2)
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/080e2cb9e1e3eb735c8d6dc0c3194e86-parsed.rds that returns NULL.
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/1510e962a774e004d248683fd79b1374-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/d8595c0a5e74dbf205b6146dcfd9ba03-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/18d6b35dd6d2aeb821e9fd9aa07dbc00-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/a4320cd9f9477bf8e373e3b6ae21374c-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/7b3f5d9f3c7f40d438cfb10527e854b3-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/427f326863e9f7e25213268f6330a79e-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/1dcfe447ea262e7a22e5e30b1a90ee3a-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/96156a38c615d754cc941aa54a434f51-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/6c4930212718a60fa6a9094d8c2461a2-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/1adc35776bcd63801ee57ce3f8f65667-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/99ea0e88b0cc34c835f52cdd0049a999-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/479f5927bd05578ed52ef2629cab7056-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/631a5c5accec13616555c0a78a9aa7f2-parsed.rds that returns NULL.
⠙ Fetching data points 199/4054 | ■■                                 5% | ETA: …
⠸ Fetching data points 754/4054 | ■■■■■■■                           19% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/dcd47b0a844e38db6b61b9b63c22f6a3-parsed.rds that returns NULL.
⠸ Fetching data points 754/4054 | ■■■■■■■                           19% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/60d4032989dff49ad0d0c1c9076aff1a-parsed.rds that returns NULL.
⠸ Fetching data points 754/4054 | ■■■■■■■                           19% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/5674c7c054b857c8627674b061592516-parsed.rds that returns NULL.
⠸ Fetching data points 754/4054 | ■■■■■■■                           19% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/4faa28330b3585f9be27a543dea59d86-parsed.rds that returns NULL.
⠸ Fetching data points 754/4054 | ■■■■■■■                           19% | ETA: …
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/f7646668172c0f4a610906fa21a2751c-parsed.rds that returns NULL.
⠸ Fetching data points 754/4054 | ■■■■■■■                           19% | ETA: …
⠼ Fetching data points 1058/4054 | ■■■■■■■■■                         26% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/c8c023431cc0d19c3c95942d3a27b73a-parsed.rds that returns NULL.
⠼ Fetching data points 1058/4054 | ■■■■■■■■■                         26% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/134bc1ec7d0a352b48354d5af68038f0-parsed.rds that returns NULL.
⠼ Fetching data points 1058/4054 | ■■■■■■■■■                         26% | ETA:…
⠴ Fetching data points 1364/4054 | ■■■■■■■■■■■                       34% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/117745dce5d5cb4d890e2230f5cca206-parsed.rds that returns NULL.
⠴ Fetching data points 1364/4054 | ■■■■■■■■■■■                       34% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/68a26da34d9f76552f0305d314d843ef-parsed.rds that returns NULL.
⠴ Fetching data points 1364/4054 | ■■■■■■■■■■■                       34% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/c465388767a41742d3153041e2aa95f4-parsed.rds that returns NULL.
⠴ Fetching data points 1364/4054 | ■■■■■■■■■■■                       34% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/2b1a1b2e121587ad6e9c4d8bf75a69b3-parsed.rds that returns NULL.
⠴ Fetching data points 1364/4054 | ■■■■■■■■■■■                       34% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/03111a15447935a196fccedf36243f1e-parsed.rds that returns NULL.
⠴ Fetching data points 1364/4054 | ■■■■■■■■■■■                       34% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/199c548401f10e0252e2bef33605625a-parsed.rds that returns NULL.
⠴ Fetching data points 1364/4054 | ■■■■■■■■■■■                       34% | ETA:…
⠦ Fetching data points 1652/4054 | ■■■■■■■■■■■■■                     41% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/ae8212a0126585478946aa8eaa3c897d-parsed.rds that returns NULL.
⠦ Fetching data points 1652/4054 | ■■■■■■■■■■■■■                     41% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/769bdbf6414d30e8695c2559b04f9313-parsed.rds that returns NULL.
⠦ Fetching data points 1652/4054 | ■■■■■■■■■■■■■                     41% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/2493a7b1b75c928059789157a2afaed6-parsed.rds that returns NULL.
⠦ Fetching data points 1652/4054 | ■■■■■■■■■■■■■                     41% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/4814b715cfe7655e14c1569734485b13-parsed.rds that returns NULL.
⠦ Fetching data points 1652/4054 | ■■■■■■■■■■■■■                     41% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/d6a37e4f3970da2216baeeade0e9b962-parsed.rds that returns NULL.
⠦ Fetching data points 1652/4054 | ■■■■■■■■■■■■■                     41% | ETA:…
⠧ Fetching data points 1892/4054 | ■■■■■■■■■■■■■■■                   47% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/41aa4082eeec395b7feb3a956bfb1a87-parsed.rds that returns NULL.
⠧ Fetching data points 1892/4054 | ■■■■■■■■■■■■■■■                   47% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/ced216837f9da99582aadad11ca0773d-parsed.rds that returns NULL.
⠧ Fetching data points 1892/4054 | ■■■■■■■■■■■■■■■                   47% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/be44ed0ec4186fc2fafdb47cc9614e87-parsed.rds that returns NULL.
⠧ Fetching data points 1892/4054 | ■■■■■■■■■■■■■■■                   47% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/a2a2abdbb71c86a1941da637bda10f45-parsed.rds that returns NULL.
⠧ Fetching data points 1892/4054 | ■■■■■■■■■■■■■■■                   47% | ETA:…
⠇ Fetching data points 2146/4054 | ■■■■■■■■■■■■■■■■■                 53% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/f80d336c7034dca6d280d5300621956a-parsed.rds that returns NULL.
⠇ Fetching data points 2146/4054 | ■■■■■■■■■■■■■■■■■                 53% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/1921f576fd77dc68dcc361d921f7d33f-parsed.rds that returns NULL.
⠇ Fetching data points 2146/4054 | ■■■■■■■■■■■■■■■■■                 53% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/56ea48877c8a76f9400c87be31f8028e-parsed.rds that returns NULL.
⠇ Fetching data points 2146/4054 | ■■■■■■■■■■■■■■■■■                 53% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/3a377df9574995fcea76277cf66229a4-parsed.rds that returns NULL.
⠇ Fetching data points 2146/4054 | ■■■■■■■■■■■■■■■■■                 53% | ETA:…
⠏ Fetching data points 2382/4054 | ■■■■■■■■■■■■■■■■■■■               59% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/fbfb62bc5bf85827f6a379f1f90ef457-parsed.rds that returns NULL.
⠏ Fetching data points 2382/4054 | ■■■■■■■■■■■■■■■■■■■               59% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/f167df23f63004a18ce9b42308f40f82-parsed.rds that returns NULL.
⠏ Fetching data points 2382/4054 | ■■■■■■■■■■■■■■■■■■■               59% | ETA:…
⠋ Fetching data points 2662/4054 | ■■■■■■■■■■■■■■■■■■■■■             66% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/125bfbd76261eb5f9fb51caa162ff9d4-parsed.rds that returns NULL.
⠋ Fetching data points 2662/4054 | ■■■■■■■■■■■■■■■■■■■■■             66% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/1ebdf89b3c235780cffb64e60a8ef85a-parsed.rds that returns NULL.
⠋ Fetching data points 2662/4054 | ■■■■■■■■■■■■■■■■■■■■■             66% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/26bd082dfaf44bac451a55a5662a2fd6-parsed.rds that returns NULL.
⠋ Fetching data points 2662/4054 | ■■■■■■■■■■■■■■■■■■■■■             66% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/fa3875cac6688b226e699f5d1be8316e-parsed.rds that returns NULL.
⠋ Fetching data points 2662/4054 | ■■■■■■■■■■■■■■■■■■■■■             66% | ETA:…
⠙ Fetching data points 2921/4054 | ■■■■■■■■■■■■■■■■■■■■■■■           72% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/9bae55e162e6d8634116689db1ced4de-parsed.rds that returns NULL.
⠙ Fetching data points 2921/4054 | ■■■■■■■■■■■■■■■■■■■■■■■           72% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/93cedd658d260591bf4b89f2a301d3a6-parsed.rds that returns NULL.
⠙ Fetching data points 2921/4054 | ■■■■■■■■■■■■■■■■■■■■■■■           72% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/e5e67b76c7684e229e92ebf31defddb0-parsed.rds that returns NULL.
⠙ Fetching data points 2921/4054 | ■■■■■■■■■■■■■■■■■■■■■■■           72% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/0cb75e7608014434b910d0f6eed469d6-parsed.rds that returns NULL.
⠙ Fetching data points 2921/4054 | ■■■■■■■■■■■■■■■■■■■■■■■           72% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/60f1cac688426f3548bde90067ff6b57-parsed.rds that returns NULL.
⠙ Fetching data points 2921/4054 | ■■■■■■■■■■■■■■■■■■■■■■■           72% | ETA:…
⠹ Fetching data points 3197/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■         79% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/120615d3cc3e40c40f3da1bc530ee976-parsed.rds that returns NULL.
⠹ Fetching data points 3197/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■         79% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/efd149e6dea0edb26cab44371a11bd9c-parsed.rds that returns NULL.
⠹ Fetching data points 3197/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■         79% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/89377ffb8213ffc3f60c414db22f5194-parsed.rds that returns NULL.
⠹ Fetching data points 3197/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■         79% | ETA:…
⠸ Fetching data points 3494/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■       86% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/d025aaaff9277d60fad129c2a947d288-parsed.rds that returns NULL.
⠸ Fetching data points 3494/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■       86% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/e3685c842eb0d208cb90f72e16d525a7-parsed.rds that returns NULL.
⠸ Fetching data points 3494/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■       86% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/97177d9d007efd4de20b3ce969ced4cb-parsed.rds that returns NULL.
⠸ Fetching data points 3494/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■       86% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/42878d933ac57df3374a4bafbd048175-parsed.rds that returns NULL.
⠸ Fetching data points 3494/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■       86% | ETA:…
⠼ Fetching data points 3752/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■     93% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/2b812e5506888e8c931cb540ae305b09-parsed.rds that returns NULL.
⠼ Fetching data points 3752/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■     93% | ETA:…
! Removed cached file C:/Users/wilso/R/rb3-cache/AjustesDiarios/55ca03ce272d07db0c5ac475424add1a-parsed.rds that returns NULL.
⠼ Fetching data points 3752/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■     93% | ETA:…
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>.
⠴ Fetching data points 3931/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    97% | ETA:…
⠦ Fetching data points 3938/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    97% | ETA:…
⠧ Fetching data points 3945/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    97% | ETA:…
⠇ Fetching data points 3950/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    97% | ETA:…
⠏ Fetching data points 3956/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    98% | ETA:…
⠋ Fetching data points 3962/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    98% | ETA:…
⠙ Fetching data points 3968/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    98% | ETA:…
⠹ Fetching data points 3973/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    98% | ETA:…
⠸ Fetching data points 3979/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    98% | ETA:…
⠼ Fetching data points 3985/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    98% | ETA:…
⠴ Fetching data points 3991/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■   98% | ETA:…
⠦ Fetching data points 3997/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■   99% | ETA:…
⠧ Fetching data points 4003/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■   99% | ETA:…
⠇ Fetching data points 4009/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■   99% | ETA:…
⠏ Fetching data points 4014/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■   99% | ETA:…
! Removed C:\Users\wilso\R\rb3-cache/AjustesDiarios/8efc8696de8165690ea4be9abff3bfe8.html - It hasn't valid content.
⠏ Fetching data points 4014/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■   99% | ETA:…
⠋ Fetching data points 4020/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■   99% | ETA:…
⠙ Fetching data points 4026/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■   99% | ETA:…
⠹ Fetching data points 4032/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■   99% | ETA:…
⠸ Fetching data points 4037/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■  100% | ETA:…
⠼ Fetching data points 4042/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■  100% | ETA:…
⠴ Fetching data points 4048/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■  100% | ETA:…
⠦ Fetching data points 4053/4054 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■  100% | ETA:…

O pacote {rb3} faz extrações de dados do site da B3. Temos diversas informações disponíveis no site inclusive o histórico de diversos dados.

Um conjunto de dados que mais utilizo são os preços de ajuste dos contratos futuros. Este histórico é um dos mais antigos disponível.

Vou baixar todo o histórico de contratos futuros desde 2007. A partir dos preços de ajuste é possível construir o histórico de curvas prefixadas. Depois vou fazer uma segmentação pelo ano da data de referência para que seja possível visualizar, para cada ano, todo o espectro de curvas no ano.

Vou começar baixando todos os dados desde 2007 até a última data disponível. Para isso vou utilizar a função rb3::futures_mget. Isso leva um bom tempo!

df <- futures_mget(
  first_date = "2007-01-01",
  last_date = preceding(Sys.Date() - 1, "Brazil/ANBIMA")
)

É necessário filtrar os contratos futuros de DI1 para construir a curva prefixada.

df_di1 <- df |> filter(commodity == "DI1")

Para construir a curva prefixada é necessário obter as datas de vencimento dos contratos futuros. Para isso utilizo a função rb3::maturity2date que converte o código de vencimento em data. Adicionalmente faço o ajuste da data de referência criando a coluna fixing, calculo os dias úteis (coluna business_days) e a taxa de juros com base no preço de ajuste price gerando a coluna adjusted_tax.

df_di1_futures <- df_di1 |>
  mutate(
    maturity_date = maturity2date(maturity_code),
    fixing = following(maturity_date, "Brazil/ANBIMA"),
    business_days = bizdays(refdate, fixing, "Brazil/ANBIMA"),
    adjusted_tax = implied_rate("discrete", business_days / 252, 100000 / price)
  ) |>
  filter(business_days > 0)

Termino filtrando as linhas com business_days maior que zero, pois não me interessam os futuros na data de vencimento.

Agora vamos gerar a visualização com ggplot2.

df_di1_futures |>
  mutate(year = as.integer(format(refdate, "%Y"))) |>
  ggplot(aes(
    x = business_days, y = adjusted_tax,
    group = refdate
  )) +
  geom_line(alpha = 0.2) +
  facet_wrap(. ~ year) +
  labs(
    x = "Dias Úteis", y = "Taxas",
    title = "16 anos de Curva Prefixada",
    subtitle = "Curvas construídas a partir dos preços de ajuste dos contratos Futuros DI1",
    caption = "Fonte: B3 (obtidos com \U1F4E6 rb3) - wilsonfreitas"
  ) +
  scale_y_continuous(labels = scales::percent)

Curioso ver a mudança de shape da curva entre os anos e ao longo de cada ano. Uma coisa curiosa é observar os anos de 2016, 2017 e 2018. 2016/2017 foram os anos do impechemant da presidente Dilma. Em 2016 a parte curta da curva variou pouco e a parte longa variou muito. Em 2017 aconteceu o oposto, a parte curta da curva variou mais que a parte longa da curva. Nestes anos, as mudanças afetam diretamente o shape da curva. Em 2018, o ano da eleição e da facada do Bolsonaro, há uma grande variação na parte longa da curva, mas sem alterar o shape da curva. Ainda é possível avaliar o comportamento da curva com os demais eventos políticos e econômicos. Em 2021, por exemplo, onde ocorreu uma elevação da taxa SELIC e uma piora do cenário fiscal, temos um espectro muita amplo do shape da curva.

É possível construir uma visualização equivalente utilizando dados da curva americana que podem ser obtidos com o pacote Quandl.

library(Quandl)

yc_all <- Quandl("USTREASURY/YIELD")
Loading required package: xts
Loading required package: zoo

Attaching package: 'zoo'
The following objects are masked from 'package:base':

    as.Date, as.Date.numeric

Attaching package: 'xts'
The following objects are masked from 'package:fixedincome':

    first, last
The following objects are masked from 'package:dplyr':

    first, last

Os dados vem no formato wide onde cada coluna representa um vértice e cada linha uma curva. Dessa maneira, faço a conversão dos dados para o formato longo com a função tidyr::pivot_longer.

yc_all <- as_tibble(yc_all)

yc_all_longer <- yc_all |>
  tidyr::pivot_longer(cols = `1 MO`:`30 YR`)

yc_all_longer
# A tibble: 99,480 × 3
   Date       name  value
   <date>     <chr> <dbl>
 1 2023-02-17 1 MO   4.64
 2 2023-02-17 2 MO   4.81
 3 2023-02-17 3 MO   4.84
 4 2023-02-17 6 MO   4.99
 5 2023-02-17 1 YR   5   
 6 2023-02-17 2 YR   4.6 
 7 2023-02-17 3 YR   4.33
 8 2023-02-17 5 YR   4.03
 9 2023-02-17 7 YR   3.95
10 2023-02-17 10 YR  3.82
# … with 99,470 more rows

Aqui faço o tratamento dos dados para converter os prazos em números, considerando meses de 30 dias e anos de 360 dias.

library(stringr)

n <- str_match(yc_all_longer$name, "\\d+") |> as.numeric()
p <- str_match(yc_all_longer$name, "(MO|YR)$")[, 1]
yc_all_longer$days <- ifelse(p == "MO", 30, 360) * n

yc_all_longer
# A tibble: 99,480 × 4
   Date       name  value  days
   <date>     <chr> <dbl> <dbl>
 1 2023-02-17 1 MO   4.64    30
 2 2023-02-17 2 MO   4.81    60
 3 2023-02-17 3 MO   4.84    90
 4 2023-02-17 6 MO   4.99   180
 5 2023-02-17 1 YR   5      360
 6 2023-02-17 2 YR   4.6    720
 7 2023-02-17 3 YR   4.33  1080
 8 2023-02-17 5 YR   4.03  1800
 9 2023-02-17 7 YR   3.95  2520
10 2023-02-17 10 YR  3.82  3600
# … with 99,470 more rows

Agora fazemos a visualização.

yc_all_longer |>
  mutate(
    year = as.integer(format(Date, "%Y")),
    value = value / 100
  ) |>
  filter(year >= 2007) |>
  ggplot(aes(
    x = days, y = value,
    group = Date
  )) +
  geom_line(alpha = 0.2) +
  facet_wrap(. ~ year) +
  labs(
    x = "Dias Corridos", y = "Taxas",
    title = "16 anos de Curva Prefixada Americana",
    caption = "Fonte: US Treasury (obtidos com \U1F4E6 Quandl) - wilsonfreitas"
  ) +
  scale_y_continuous(labels = scales::percent)

Já na curva americana, a dinâmica é muito mais bem comportada. A parte longo costuma oscilar, mas mantendo a dinâmica. Os anos 2007, 2008 e 2020, onde tivemos crise do subprime e COVID, trouxeram mais volatilidade.