Movimento da Parte Longa da Curva de Juros

A reunião do COPOM no começo do mês de agosto de 2022 trouxe um tom que influenciou a dinâmica da parte longa da curva de juros. Aqui apresento uma animação do movimento da curva de juros nas duas primeiras semanas de agosto de 2022.

R
fixedincome
rb3
opendata
Author

Wilson Freitas

Published

August 17, 2022

A reunião do COPOM de 3 de agosto trouxe uma mudança na estrutura da curva de juros, tanto para a parte curta como para a parte longa. A interpretação do comunicado por agentes de mercado é de o ciclo de alta de juros está próximo do fim.

Na prática a dinâmica da parte longa da curva de juros foi bastante afetada. Aqui apresento uma animação onde observa-se o movimento da curva de juros nas duas primeiras semanas do mês de agosto de 2022. A reunião do COPOM aconteceu em 3 de agosto. Fica claro pela animação a mudança nas expectativas de longo prazo para a curva.

Vamos utilizar o 📦 {rb3} para obter as curvas e o 📦 {fixedincome} na construção dos gráficos da estrutura a termo de juros. A animação é construida com o 📦 {animation}.

library(fixedincome)
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:fixedincome':

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

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

    intersect, setdiff, setequal, union
library(ggplot2)

get_di1_curve <- function(refdate) {
  fut <- futures_get(refdate)
  yc <- yc_get(refdate)
  df <- yc_superset(yc, fut)

  df_curve <- bind_rows(
    df |> slice(1) |> select(biz_days, r_252),
    df |> filter(!is.na(symbol)) |> select(biz_days, r_252)
  ) |>
    filter(!duplicated(biz_days))

  spotratecurve(
    df_curve$r_252, df_curve$biz_days, "discrete", "business/252", "Brazil/ANBIMA",
    refdate = refdate
  )
}

Vamos obter as curvas para os dias úteis entre 2022-08-01 e 2022-08-16 e colocá-las em uma lista. Na sequência a animação será construída com cada uma das curvas da lista, sendo que a primeira curva tem a cor vermelha e a última tem cor azul, as demais curvas são em cinza. O objetivo é acompanhar a evolução das curvas tendo em destaque o começo e fim.

dates <- bizseq("2022-08-01", "2022-08-16", "Brazil/ANBIMA")
curves <- lapply(seq_along(dates), function(ix) get_di1_curve(dates[ix]))

anim <- animation::saveGIF(
  {
    g <- autoplot(curves[[1]], curve.x.axis = "terms", colour = "red") +
      autolayer(curves[[1]], curve.geom = "point", curve.x.axis = "terms", colour = "red") +
      ylim(0.11, 0.14) +
      theme_bw() +
      theme(legend.position = "none") +
      labs(
        x = "Prazos", y = NULL, title = "Curvas de Juros Prefixados DI1",
        subtitle = "Entre as datas 2022-08-01 e 2022-08-16",
        caption = "Desenvolvido por wilsonfreitas / Fonte: B3"
      )
    print(g)

    for(curve in curves[-c(1, length(curves))]) {
      g <- g + autolayer(curve, curve.x.axis = "terms", colour = "grey") +
        autolayer(curve,
          curve.geom = "point", curve.x.axis = "terms", colour = "grey"
        )
      print(g)
    }

    g <- g + autolayer(curves[[length(curves)]], curve.x.axis = "terms", colour = "blue") +
      autolayer(curves[[length(curves)]],
        curve.geom = "point", curve.x.axis = "terms", colour = "blue"
      )
    print(g)
  },
  interval = 0.8,
  ani.height = 400,
  ani.width = 704
)
Output at: animation.gif