Juro real vs. juro neutro: qual o efeito da política monetária no Brasil?

By | Comentário de Conjuntura

Essa semana, o Banco Central decide o patamar da taxa básica de juros no país. O consenso de mercado indica mais uma alta de 75 pontos-base, o que levaria a Selic para a casa dos 3,5% ao ano. Com efeito, haverá uma pressão adicional na taxa de juros real da economia. A pergunta que fica é se a política monetária ainda continuará no terreno expansionista ou se mudará o sentido para contracionista. Nesse Comentário de Conjuntura, mostramos como avaliar esse ponto na prática com o R.

Membros do Clube AM, por suposto, têm acesso a todos os códigos desse exercício. Esse tipo de tema é ensinado nos nossos Cursos de Análise de Conjuntura usando o R e de Política Monetária

Afim de obter o sentido da política monetária, devemos basicamente comparar o juro real com o juro de equilíbrio da economia brasileira. A diferença entre os dois vai nos dizer se a política monetária está em sentido expansionista (juro real menor que o juro neutro) ou contracionista (juro real maior que o juro neutro).

O juro real que considerei aqui é o juro real ex-ante, obtido a partir do juro do swap DI 360 deflacionado pela expectativa de inflação para os próximos 12 meses. Já o juro de equilíbrio segue uma proxy definida no Relatório de Inflação de dezembro de 2019, dada pela Selic esperada para t+3 deflacionada pela inflação espera para t+3.

Uma vez definidas as variáveis e como obter o sentido da política monetária, chegamos ao gráfico abaixo.

A área azul representa uma política monetária expansionista enquanto a área vermelha representa uma política monetária contracionista. Como se pode ver, a política monetária vem sendo expansionista desde 2017. Além disso, dado que o juro real está próximo da nulidade e o juro neutro encontra-se, por essa proxy, próximo de 3% a.a., ainda há bastante espaço até que haja uma mudança de sentido na política monetária.

Será que o Banco Central está disposto a promover essa mudança em meio a uma crise sanitária sem precedentes? A conferir...

_________________________

Membros do Clube AM, por suposto, têm acesso a todos os códigos desse exercício. Esse tipo de tema é ensinado nos nossos Cursos de Análise de Conjuntura usando o R e de Política Monetária

Semana de calmaria nos indicadores do FOCUS

By | Indicadores

No boletim FOCUS dessa semana, vemos uma estabilidade quase plena nas previsões, refletindo a falta de choques dos últimos dias. A única variação digna de nota é a do IGP, que aumentou de 13.15% para 14.32%, porém esse movimento parece ser apenas parte da escalada do índice que já vem ocorrendo há meses.

As expectativas do IPCA fecharam a semana com média de 5.4% e desvio-padrão de 0.35%. A SELIC continua sendo estimada com mediana de 5.50%, porém houve um aumento de seu desvio-padrão de 0.59% para 0.6%. Ao mesmo tempo, vemos que sua média continua abaixo da mediana, em 5.41%, indicando que há uma minoria no mercado que ainda vê cenários de valores mais baixos para a SELIC no final do ano. Abaixo, o gráfico das variáveis:

A maior expectativa do IGP foi de 20.17% para 19.10%, porém a média das observações tem se mantido consideravelmente acima da mediana (pelo menos 0.2%) há 8 semanas, indicando que há um menor número de observações mais elevado puxando a estimação média para cima.

Membros do Clube AM, por suposto, têm acesso a todos os códigos desse exercício.

____________________________

Salvando histórico da curva de juros PRÉ

By | mercado financeiro

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.

Dicas de R: usando Python dentro do R

By | Dicas de R

No Dicas de R de hoje, vamos mostrar como você pode rodar código em Python dentro do próprio R, facilitando a integração para pessoas que estão começando no R e já têm conhecimento de Python, ou que querem embutir em seu código o ferramental de Python, que muitas vezes pode agilizá-lo e resolver problemas. Essa integração pode ser feita através do pacote reticulate, como mostraremos a seguir. Vamos supor aqui que você já tem tanto o R como o Python instalados, e também já possui todos os pacotes de Python e de R que quer usar. Para carregar o Python no R, basta rodar:


library(reticulate)

O R irá carregar a sua versão padrão de Python. Se quiser utilizar outra (como ao começar um projeto), basta adicionar o código

use_python("/usr/local/bin/python")

Substituindo o argumento pelo caminho até a versão utilizada. Feito isso, vamos carregar o pandas como exemplo:

 
pd = import('pandas')

Após carregar a library, ela se torna um objeto no R como qualquer outro. Suas funções podem ser acessadas com o operador $, como se fossem colunas. Com isso, o código fica semelhante a um código de Python, usando pd$read_csv ao invés de pd.read_csv, por exemplo.

Para rodar códigos básicos de Python, existem as funções py_run_string(), que recebe strings de código como argumento, e py_run_file(), que recebe um script completo.

Como os objetos de uma linguagem não podem ser operados diretamente por outra, o reticulate transforma objetos de R em objetos de Python sempre que você chama uma função do Python sobre um objeto de seu environment base, e os transforma de volta após finalizar a função. Caso queira trabalhar com objetos de Python ao longo de várias funções, também é possível importar um módulo do Python e impedir que a transformação automática seja feita após suas funções:

 
pd = import('pandas', convert = FALSE)

Com isso, os objetos trabalhados serão de Python, e depois disso para transformá-los em objetos de R basta rodar py_to_r(nome_do_objeto).

O pacote apresentado aqui permite integração total entre o Python e o R, facilitando o uso de ferramentas estatísticas integradas no R para usuários de Python. Para mais informações sobre ele, recomendamos sua página principal, disponível aqui.


NTN-F 2031 vs. Treasury US 10 anos: spread entre taxas de juros aumenta

By | Comentário de Conjuntura

Tem chamado atenção do mercado o aumento da diferença entre as taxas de juros da NTN-F de 10 anos, com vencimento em 2031 e o Treasury de 10 anos dos Estados Unidos. O aumento do spread entre as taxas têm sido associado ao risco fiscal, expresso na discussão do Orçamento no Congresso. Nesse Comentário de Conjuntura, mostramos como se coleta e se visualiza as taxas diretamente do Tesouro Direto e do FRED St. Louis com o R.

Membros do Clube AM, por suposto, têm acesso a todos os códigos desse exercício.

O início do script que coleta os dados é colocado abaixo. Os dados da NTN-F 10 anos são coletados a partir do pacote GetTDData, enquanto os dados do Treasury de 10 anos são coletados a partir do pacote quantmod. Também coletamos os dados das expectativas fiscais contidas no boletim Focus através do pacote rbcb.

#########################################################
########## NTN-F 10 anos vs. Treasury 10 anos ###########

library(GetTDData)
library(quantmod)
library(timetk)
library(tidyverse)
library(scales)
library(ggcorrplot)
library(vars)
library(aod)
library(rbcb)

### NTN-F 10 anos
download.TD.data("NTN-F")
ntnf31 = read.TD.files(dl.folder = 'TD Files',
maturity = '010131')

### Treasury 10 anos
getSymbols('DGS10', src='FRED')
treasury10 = tk_tbl(`DGS10`, preserve_index = TRUE, rename_index = 'date')

### Expectativas fiscais
fiscal = get_annual_market_expectations('Fiscal',
start_date = '2020-01-01')

fiscal$indic_detail = ifelse(fiscal$indic_detail == "Resultado Primário",
'Resultado Primário', fiscal$indic_detail)

fiscal = fiscal %>%
filter(reference_year == '2021' &
base == 0 & indic_detail %in% c('Resultado Primário', 'Resultado Nominal')) %>%
dplyr::select(date, indic_detail, mean) %>%
spread(indic_detail, mean)

### Data
data = ntnf31 %>%
dplyr::select(ref.date, yield.bid) %>%
rename(date = ref.date, ntnf31 = yield.bid) %>%
mutate(ntnf31 = ntnf31*100) %>%
inner_join(treasury10, by='date') %>%
rename(treasury10 = DGS10) %>%
inner_join(fiscal, by='date') %>%
as_tibble() %>%
drop_na()

Com os dados disponíveis, podemos visualizar a seguir o comportamento das taxas de juros associadas aos títulos do BR e do US, a partir do início do ano.

De fato, existe uma correlação positiva forte entre as séries ao longo desse ano, de 0,91. Essa correlação, entretanto, não implica em causalidade. O teste de Wald, seguindo o procedimento de Toda-Yamamoto, não indica causalidade em nenhuma direção, considerando o nível de significância de 5% para a amostra restrita a 2021. Para uma amostra maior, que contém dados desde fevereiro de 2020, o teste sugere que há causalidade em ambas as direções.

Como se pode observar pelos gráficos acima, tem ocorrido um aumento da taxa de juros associada ao Treasury de 10 anos desde julho do ano passado. A seguir, colocamos o spread entre as taxas de juros de ambos os títulos.

A área hachurada traz o aumento do spread entre as taxas a partir do início de 2021. Abaixo, por suposto, colocamos as expectativas coletadas pelo boletim Focus para as variáveis de fluxo do resultado fiscal esse ano.

Como se vê, existe uma percepção de recrudescimento do resultado primário e do nominal ao longo de 2021. De fato, encontramos evidências de que existe uma precedência temporal entre o resultado nominal e o spread de taxas de juros BR/US.

_________________________

Membros do Clube AM, por suposto, têm acesso a todos os códigos desse exercício.

 

Seja avisado da nossa próxima aula ao vivo de R para Análise de Dados, toda terça-feira, às 21h!

Quero ser avisado
{"cart_token":"","hash":"","cart_data":""}