Category

mercado financeiro

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.

Especial Renda Fixa: Avaliando títulos pós-fixados

By | mercado financeiro

Especial Renda Fixa: Calculando taxas a termo na ETTJ

By | mercado financeiro

Juro Real vs. Juro Neutro

By | mercado financeiro

Nosso objetivo no Curso Mercado Financeiro e Gestão de Portfólios é o de proporcionar tanto uma introdução dos alunos ao mercado financeiro quanto o de munir os mesmos com ferramentas analíticas para gestão de portfólios e tratamento/visualização de dados. Para ilustrar, vamos ver como é possível construir o juro real e o juro neutro a partir de bases de dados disponíveis na internet e visualizar os mesmos com o pacote ggplot2 do R.

O juro real e o juro neutro têm importância fundamental para dizer a direção da política monetária operacionalizada pelo Banco Central. Em termos contemporâneos, inspirados no trabalho pioneiro de Knut Wicksell, dizemos que a política monetária é expansionista ou contracionista se, respectivamente, o juro real estiver abaixo ou acima da taxa de juros neutra. Taxa de juros neutra, por outro lado, é aquela consistente com a estabilidade da taxa de inflação ao longo do tempo. Variável não observável, que deve ser estimada e que depende de diversos fatores. Nesses termos, cabe ao Banco Central manter a taxa de juros real próxima à taxa de juros neutra, se o objetivo é controlar a inflação.

Pela equação de Fisher, sabemos que

(1)   \begin{align*} i = r + \pi \end{align*}

Onde, i é a taxa de juros nominal, r é a taxa de juros real e \pi é a taxa de inflação. Rearranjando os termos, definimos o juro real ex-post como:

(2)   \begin{align*} r = i - \pi \end{align*}

Para tornar a análise ex-ante, devemos substituir \pi pela expectativa de inflação, isto é, \pi^{e}, de modo que o juro real ex-ante será dado por:

(3)   \begin{align*} r = i - \pi^{e} \end{align*}

Em outras palavras, o juro real ex-ante será dado, de forma aproximada, pela diferença entre o juro nominal e a expectativa de inflação. Essa é, em geral, a forma como o mercado calcula a taxa de juros real no país. Em termos exatos, o cálculo se dá pela fórmula:

(4)   \begin{align*} (1+r_{t+1}) = (1+i_t)/(1+E_t\pi_{t+1}) \end{align*}

Na sequência, nós iremos construir o juro real e o juro neutro, com dados disponíveis na internet e colocar ambas as variáveis em um mesmo gráfico, de modo a visualizar a direção da política monetária sobre o ciclo econômico.

O script de R começa com alguns pacotes sendo carregados.


library(GetTDData)
library(readr)
library(xts)
library(forecast)
library(scales)
library(ggplot2)
library(mFilter)
library(grid)
library(png)
library(rbcb)
library(Quandl)

Na sequência, nós iremos pegar três séries: a taxa Selic, a expectativa de inflação e a taxa de juros associada à NTN-B 2050.


## Taxa de Juros
selic = Quandl('BCB/1178', order='asc', start_date='2012-06-01')

## Expectativa de Inflação 12 meses à frente
expinf = get_twelve_months_inflation_expectations('IPCA',
start_date = '2012-06-01')

## Taxa de Juros da NTN-B 2050
download.TD.data('NTN-B')
ntnb50 <- read.TD.files(dl.folder = 'TD Files',
maturity = '150850')

O juro real é então criado como abaixo.


selic = xts(selic$Value, order.by = selic$Date)
expinf12 = xts(expinf$mean[expinf$smoothed=='S'],
order.by = expinf$date[expinf$smoothed=='S'])
dataex = cbind(selic, expinf12)
dataex = dataex[complete.cases(dataex),]
juro_ex = (((1+(dataex[,1]/100))/(1+(dataex[,2]/100)))-1)*100

Na sequência, nós comparamos o juro real com o juro neutro extraído da taxa de juros associada à NTN-B.


juro_ntnb = xts(ntnb50$yield.bid*100, order.by = ntnb50$ref.date)
df = cbind(juro_ex, juro_ntnb)
df = df[complete.cases(df),]
df = data.frame(time=index(df), juroreal=df[,1],
ntnb=df[,2])

hp = hpfilter(df$juro_ntnb, fre=10000, type='lambda')
dfneutro = hptrend

Por fim, geramos um gráfico que compara as duas séries.

________________

(*) Isso e muito mais você irá aprender no nosso Novo Curso Mercado Financeiro e Gestão de Portfólios.

Especial Renda Fixa: Precificando o NTN-F

By | mercado financeiro

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente
{"cart_token":"","hash":"","cart_data":""}