Introdução

Uma variável fundamental de ser acompanhada por todo investidor do mercado de capitais é a taxa de juro real projetada da economia. A importância de calculá-la reside no fato de o juro real balizar diversas tomadas de decisões econômicas, inclusive decisões de investimentos de empresas e consumidores. Não por acaso, ela tem grande impacto sobre o valor dos ativos, inclusive sobre as ações listadas na bolsa de valores.

Há diversas formas de calculá-la. Uma delas utiliza o contrato swap DI versus a taxa pré-fixada de 360 dias, de um lado, e a expectativa de inflação para os próximos 12 meses, de outro. O contrato de swap nada mais é do que uma “troca de indexador”, por meio de um instrumento derivativo. Neste caso, o investidor “sai” de uma taxa pós-fixada em CDI para determinada taxa pré-fixada pactuada. A taxa do contrato de swap é divulgada pela B3, e a inflação projetada, pelo Banco Central do Brasil. Descontando a inflação do swap de 360 dias, temos uma estimativa da taxa de juro real projetada da economia. Podemos fazer isso por meio da seguinte fórmula:

\[ \begin{aligned} \frac{1 + Swap}{1 + IPCA} - 1 \end{aligned} \]

Nesse post, mostrarei como obter os dados, calcular a taxa e criar o gráfico correspondente.

Desenvolvimento

Primeiramente, prepararemos o ambiente de trabalho do R para o projeto:

# carregar o pacote "pacman" (e instalá-lo, se necessário)
if (!require("pacman")) install.packages("pacman")

# carregar os pacotes que serão utilizados (e instalá-los, se necessário)
p_load(
  ipeadatar,
  tidyverse,
  here,
  rbcb,
  janitor,
  lubridate,
  knitr,
  kableExtra
  )

Em seguida, obteremos os dados. Os dados sobre swaps serão extraídos com o auxílio do pacote ipeadatar. Primeiro consultaremos de que maneira as séries são disponibilizadas pelo pacote.

# consultar séries disponíveis
available_series(language = "br") %>%
  head() %>%
  kable() %>%
  kable_styling("striped", "bordered")
code name theme source freq lastupdate status
ABIA12_ALIM12 Produção física - alimentos - índice (média 1989 = 100) Macroeconômico Abia Mensal 2021-09-17 Ativa
ABINEE_VELETAA Vendas industriais - aspiradores de ambiente - qde. Macroeconômico Abinee Anual 2003-08-19 Inativa
ABINEE_VELETAP Vendas industriais - aspiradores de pó - qde. Macroeconômico Abinee Anual 2005-11-22 Inativa
ABINEE_VELETAR Vendas industriais - auto-rádios - qde. Macroeconômico Abinee Anual 2003-08-19 Inativa
ABINEE_VELETBB Vendas industriais - batedeiras - qde. Macroeconômico Abinee Anual 2005-11-22 Inativa
ABINEE_VELETCA Vendas industriais - circuladores de ar - qde. Macroeconômico Abinee Anual 2003-08-19 Inativa

Como apresentado na tabela acima, cada série possui um nome e um código. Temos que procurar na coluna “nome” as séries que apresentam a palavra swap:

# obter relação de séries com o termo "swap"
search_series(
  terms = "swap",
  fields = "name",
  language = "br"
  ) %>%
  select(code, name) %>%
  head() %>%
  kable() %>%
  kable_styling("striped", "bordered")
code name
BMF12_SWAPDI18012 Taxa referencial - swaps - DI x pré-fixada - 180 dias - média do período
BMF12_SWAPDI180F12 Taxa referencial - swaps - DI x pré-fixada - 180 dias - fim de período
BMF12_SWAPDI36012 Taxa referencial - swaps - DI x pré-fixada - 360 dias - média do período
BMF12_SWAPDI360F12 Taxa referencial - swaps - DI x pré-fixada - 360 dias - fim de período

Utilizaremos a última série. A fim de obter maior compreensão dela, obteremos os metadados:

# obter metadados da série "swap 360 dias - fim do período"
metadata(code = "BMF12_SWAPDI360F12") %>%
  glimpse()
## Rows: 1
## Columns: 14
## $ code       <chr> "BMF12_SWAPDI360F12"
## $ name       <chr> "Taxa referencial - swaps - DI x pré-fixada - 360 dias - fi…
## $ comment    <chr> "Os contratos de swap são aqueles em que as partes trocam u…
## $ lastupdate <date> 2022-07-05
## $ bname      <fct> Macroeconomic
## $ source     <fct> BM&FBovespa
## $ sourcename <fct> "Bolsa de Valores, Mercadorias e Futuros (BM&FBovespa)"
## $ sourceurl  <chr> "www.bmfbovespa.com.br"
## $ freq       <fct> Monthly
## $ unity      <fct> "(% p.y.)"
## $ mf         <fct> NA
## $ status     <fct> Active
## $ scode      <int> 39
## $ tcode      <chr> "BRA"

Ela é disponibilizada pela B3 (antiga BM&FBovespa), tem periodicidade mensal e se trata de série ativa. Para uma explanação mais detalhada sobre do que ela se trata, consultaremos a coluna “comentário”:

# extrair a variável "comentário"
metadata(code = "BMF12_SWAPDI360F12") %>%
  pull(comment)
## [1] "Os contratos de swap são aqueles em que as partes trocam um índice de rentabilidade por outro, com o intuito de fazer \"hedge\", casar posições ativas com posições passivas, eqüalizar preços, arbitrar mercados ou até alavancar sua exposição ao risco. Neste caso, a troca de rentabilidade se dá entre a taxa DI e uma taxa pré-fixada entre as partes do contrato. Fim do mês.“Hedge” é a operação realizada no mercado derivativo que visa fixar antecipadamente o preço de uma mercadoria, ou ativo financeiro, de forma a neutralizar o impacto de mudanças no nível de preços. Mais informações: <a href=\"../doc/CVM-Caderno-9.pdf\">Caderno da Comissão de Valores Mobiliários (CVM) - nº09</a> e  <a href=\"../doc/Livro-TOPDerivativos.pdf\">Mercado de Derivativos no Brasil: Conceitos, Produtos e Operaçoões</a>."
## attr(,"label")
##           comment 
## "Comment (PT-BR)"

Feito isso, obteremos os dados propriamente ditos:

# obter dados de swaps
swap <-
  ipeadata(
    code = "BMF12_SWAPDI360F12",
    language = "br"
    ) %>%
  rename(swap = value) %>%
  select(date, swap)

# imprimir dados
swap %>%
  head() %>%
  kable() %>%
  kable_styling("striped", "bordered")
date swap
1999-09-01 25.74
1999-10-01 24.42
1999-11-01 24.33
1999-12-01 21.71
2000-01-01 20.89
2000-02-01 19.94

Agora, obteremos as expectativas para a inflação (IPCA) dos próximos 12 meses. Ela é obtida por meio do pacote rbcb. Primeiramente, vejamos como vêm os dados, a fim de entender que tipo de transformação teremos que fazer:

# apresentar dados de expectativas de inflação
get_market_expectations(
  type = "inflation-12-months",
  ind = "IPCA"
  ) %>%
  head() %>%
  kable() %>%
  kable_styling("striped", "bordered")
Indicador Data Suavizada Media Mediana DesvioPadrao Minimo Maximo numeroRespondentes baseCalculo
IPCA 2001-11-07 N 5.52 5.48 0.58 4.31 6.24 NA 0
IPCA 2001-11-08 N 5.67 5.79 0.56 4.31 6.27 NA 0
IPCA 2001-11-09 N 5.39 5.53 0.58 4.12 6.17 NA 0
IPCA 2001-11-12 N 5.40 5.42 0.53 4.44 6.38 NA 0
IPCA 2001-11-13 N 5.43 5.48 0.50 4.44 6.38 NA 0
IPCA 2001-11-14 N 5.49 5.53 0.50 4.44 6.38 NA 0

Trata-se de expectativas diárias de inflação. Contudo, os dados de swap são mensais. Desta feita, selecionaremos apenas os primeiros dados de cada mês. Ainda, temos a expectativa de inflação mediana e média. Utilizaremos a mediana.

# obter dados de expectativas de inflação
ipca <-
  get_market_expectations(
    type = "inflation-12-months",
    ind = "IPCA") %>%
  clean_names() %>%
  select(date = data, ipca = mediana) %>%
  arrange(date) %>%
  group_by(year = year(date), month = month(date)) %>%
  filter(date == first(date)) %>%
  ungroup() %>%
  distinct(date, .keep_all = TRUE) %>%
  mutate(date = floor_date(date, unit = "month")) %>%
  select(date, ipca)

# imprimir dados
ipca %>%
  head() %>%
  kable() %>%
  kable_styling("striped", "bordered")
date ipca
2001-11-01 5.48
2001-12-01 5.67
2002-01-01 4.73
2002-02-01 4.83
2002-03-01 4.75
2002-04-01 4.92

Agora que temos as duas séries, combinaremos ambas num único banco de dados, e calcularemos a taxa de juro real projetada, aplicando a fórmula apresentada no início desse post:

# combinar bancos de dados
# calcular a taxa de juro real projetada
data <-
  ipca %>%
  left_join(swap) %>%
  mutate(real = (((1 + (swap / 100)) / (1 + (ipca / 100))) - 1) * 100)

# imprimir banco de dados
data %>%
  head() %>%
  kable() %>%
  kable_styling("striped", "bordered")
date ipca swap real
2001-11-01 5.48 22.95 16.56238
2001-12-01 5.67 20.23 13.77875
2002-01-01 4.73 20.81 15.35377
2002-02-01 4.83 18.96 13.47897
2002-03-01 4.75 18.53 13.15513
2002-04-01 4.92 19.79 14.17270

Por fim, apresentaremos os dados na forma de gráfico:

# construir gráfico
ggplot(data = data, aes(x = date, y = real)) +
  geom_line(aes(color = real > 0, group = 1), size = 1) +
  scale_color_manual(values = c("red", "green4")) +
  geom_area(aes(fill = real > 0), alpha = .1) +
  scale_fill_manual(values = c("red", "grey50")) +
  theme_classic() +
  labs(
    x = "Ano",
    y = "Taxa de Juro (%)",
    title = "Taxa de juro real projetada (%)",
    caption = "Fonte: Banco Central do Brasil; B3"
  ) +
  scale_x_date(
    date_breaks = "2 years",
    breaks = seq(2001, 2021, 1),
    date_labels = "%Y"
  ) +
  scale_y_continuous(breaks = seq(0, 25, 2.5)) +
  theme(
    legend.position = "none",
    plot.caption = element_text(hjust = 0),
    plot.title = element_text(face = "bold")
  ) +
  geom_label(data = filter(data, date == last(date)),
             aes(label = round(real, 2)))

Conclusão

Obtidos os dados de juros reais projetados, é possível utilizá-lo em análises macroeconômicas, incluindo a precificação de ativos. Se considerarmos o juro neutro atual brasileiro como algo entre 3,5% e 4%, ao fim de 2021 a política monetária ingressou em campo contracionista. Se a política monetária leva entre 12 e 18 meses para atingir plena potência, no primeiro semestre de 2023, é possível que tenhamos arrefecimento da inflação. Isso abre espaço para juros menores no futuro, o que pode beneficar empresas de modo geral, mas especialmente aquelas mais sensíveis ao ciclo econômico, tais como companhias do setor de varejo, construção civil ou de crescimento.

Agradecimentos

Agradecimentos a Luiz Eduardo S. Gomes e Jessyka A. P. Goltara, pelo pacote ipeadatar, e a Wilson Freitas, pelo pacote rbcb.