Category

Comentário de Conjuntura

Como anda o juro neutro no Brasil?

By | Comentário de Conjuntura

No mês de dezembro, iremos lançar uma nova versão do Clube do Código. O projeto de compartilhamento de códigos da Análise Macro vai avançar para uma versão 2.0, que incluirá a existência de uma comunidade no Telegram/Whatsapp, de modo a reunir os membros do Novo Clube, compartilhando com eles todos os códigos dos nossos posts feitos aqui no Blog, exercícios de análise de dados de maior fôlego, bem como tirar dúvidas sobre todos os nossos projetos e Cursos Aplicados de R.

Para ilustrar o que vamos compartilhar lá nesse novo ambiente, vou publicar aqui nos próximos dias alguns dos nossos exercícios completos de análise de dados. Esses exercícios fazem parte do repositório atual do Clube, que irá migrar para o novo projeto. Além de todos os exercícios existentes, vamos adicionar novos exercícios e códigos toda semana, mantendo os membros atualizados sobre o que há de mais avançado em análise de dados, econometria, machine learning, forecasting e R.

Para ilustrar o que vamos fazer lá no Clube AM, nesse Comentário de Conjuntura vou atualizar um exercício que fizemos para construir uma proxy para o juro neutro da economia brasileira. O exercício foi baseado no Relatório Trimestral de Inflação de dezembro de 2019, onde o pessoal do Banco Central apresentou uma proxy para a taxa neutra de juros considerando as taxas de inflação e de juros três anos à frente disponibilizadas na pesquisa Focus.

A despeito da simplicidade do exercício, existe um trabalho de coleta e tratamento dos dados da pesquisa Focus para se chegar ao juro real três anos à frente, considerado como proxy para o juro neutro da economia. Isso dito, para mostrar como as coisas ficam mais fáceis com o R, eu resolvi replicar o exercício do Banco Central nesse Comentário de Conjuntura.

O script começa carregando alguns pacotes:


library(lubridate)
library(magrittr)
library(dplyr)
library(ggplot2)
library(scales)
library(ggrepel)
library(rbcb)
library(xts)
library(png)
library(grid)
library(gridExtra)

Na sequência, nós coletamos a inflação esperada.


ipcae = get_annual_market_expectations('IPCA',
start_date = '2010-03-01')

ipca_esperado = ipcae$median[ipcae$reference_year==year(ipcae$date)+3
&ipcae$base==0]

ipca_esp_min = ipcae$min[ipcae$reference_year==year(ipcae$date)+3
&ipcae$base==0]

ipca_esp_max = ipcae$max[ipcae$reference_year==year(ipcae$date)+3
&ipcae$base==0]

dates = ipcae$date[ipcae$reference_year==year(ipcae$date)+3
&ipcae$base==0]

data = data.frame(dates=dates, min=ipca_esp_min,
ipca=ipca_esperado,
max=ipca_esp_max)

Também coletamos a taxa Selic esperada.


selice = get_annual_market_expectations('Meta para taxa over-selic',
start_date = '2010-03-01')

selic_esperado = selice$median[selice$indic_detail=='Fim do ano'&selice$reference_year==year(selice$date)+3]

selic_esp_min = selice$min[selice$indic_detail=='Fim do ano'&selice$reference_year==year(selice$date)+3]

selic_esp_max = selice$max[selice$indic_detail=='Fim do ano'&selice$reference_year==year(selice$date)+3]

dates = selice$date[selice$indic_detail=='Fim do ano'&selice$reference_year==year(selice$date)+3]

data2 = data.frame(dates=dates, min=selic_esp_min,
selic=selic_esperado,
max=selic_esp_max)

Com as duas séries disponíveis, nós podemos construir nossa proxy para o juro neutro.


ipca_min = xts(ipca_esp_min, order.by = dates)
ipca_tmais3 = xts(ipca_esperado, order.by = dates)
ipca_max = xts(ipca_esp_max, order.by = dates)

selic_min = xts(selic_esp_min, order.by = dates)
selic_tmais3 = xts(selic_esperado, order.by = dates)
selic_max = xts(selic_esp_max, order.by = dates)

neutro_min = (((1+(selic_min/100))/(1+(ipca_min/100)))-1)*100
neutro = (((1+(selic_tmais3/100))/(1+(ipca_tmais3/100)))-1)*100
neutro_max = (((1+(selic_max/100))/(1+(ipca_max/100)))-1)*100

df = data.frame(dates=as.Date(time(neutro)), neutro=neutro,
min=neutro_min, max=neutro_max)

Por fim, visualizamos a nossa série.

 

__________________

(*) Cadastre-se aqui na nossa Lista VIP para receber um super desconto na abertura das Turmas 2021.

Explicando a inflação de alimentos

By | Comentário de Conjuntura

No mês de dezembro, iremos lançar uma nova versão do Clube do Código. O projeto de compartilhamento de códigos da Análise Macro vai avançar para uma versão 2.0, que incluirá a existência de uma comunidade no Telegram/Whatsapp, de modo a reunir os membros do Novo Clube, compartilhando com eles todos os códigos dos nossos posts feitos aqui no Blog, exercícios de análise de dados de maior fôlego, bem como tirar dúvidas sobre todos os nossos projetos e Cursos Aplicados de R.

Para ilustrar o que vamos compartilhar lá nesse novo ambiente, vou publicar aqui nos próximos dias alguns dos nossos exercícios completos de análise de dados. Esses exercícios fazem parte do repositório atual do Clube, que irá migrar para o novo projeto. Além de todos os exercícios existentes, vamos adicionar novos exercícios e códigos toda semana, mantendo os membros atualizados sobre o que há de mais avançado em análise de dados, econometria, machine learning, forecasting e R.

Para começar, nesse Comentário de Conjuntura vou replicar um modelo descritivo para a inflação de alimentos. A inflação de alimentos tem sido uma grande incógnita nos últimos anos, influenciando de forma decisiva o erro de previsão da inflação cheia. Isso nos motivou a replicar um modelo do Banco Central do Brasil, exposto em boxe do Relatório de Inflação de junho de 2016, intitulado Evolução recente da inflação de alimentos. O modelo proposto pelo BCB consiste na seguinte equação

(1)   \begin{align*}\pi_t^{AD} = \sum_{i=0}^1 \phi_i \; \Delta \epsilon_{t-i} + \sum_{i=0}^1 \beta_i \;\Delta IC_{t-i}^{agro}+ \delta \; oni_{t-1} + \gamma \; h_t + \sum_{i=1}^4 \alpha_i \; T_i + \varepsilon_t  \end{align*}

onde \pi_t^{AD} é inflação de alimentação no domicílio, \Delta\epsilon_{t} é a variação da taxa de câmbio nominal, \Delta IC_{t-i}^{agro} é a variação do segmento de commodities agropecuárias do Índice de Commodities - Brasil (medido em dólares), oni_{t-1} é a primeira defasagem da dummy se o mundo está ou não sob efeito do El Niño, h_t é o hiato do produto e T_i são dummies sazonais.

Para estimar 1, nosso maior desafio será de coleta e tratamento das variáveis envolvidas. Isso é feito na sequência.

# Coleta e tratamento de dados

Para replicar o modelo proposto em 1, vamos precisar de cinco séries, a saber: a inflação de alimentação no domicílio, o Oceanic Niño Index (ONI), o Produto Interno Bruto, a taxa de câmbio nominal e o Índice de Commodities no seu corte agropecuário. Uma vez obtidas essas séries, elas precisarão ser trimestralizadas e tratadas, de modo a obter as variáveis que serão utilizadas para estimar 1. De modo a replicar os resultados do BCB, vamos obter as séries a partir do primeiro trimestre de 2000.

Antes, porém, o script começa carregando alguns pacotes.


library(BETS)
library(ggplot2)
library(forecast)
library(sidrar)
library(gridExtra)
library(rsoi)
library(xts)
library(mFilter)
library(dynlm)
library(stargazer)

Com efeito, o código abaixo coleta, trata e organiza as séries em uma matriz.


## Obter a série do Oceanic Niño Index (ONI)
oni = download_oni()
oni = xts(oni$ONI, order.by = oni$Date)
oni = window(oni[-1,], start='2000-01-01')
oni = ts(apply.quarterly(oni, FUN=mean),
start=c(2000,01), freq=4)
oni = ifelse(oni>0.5,1,0)
## Obter o Índice de Commodities Agro
icagro = BETSget(20050, from='1999-10-01', data.frame = TRUE)
icagro = xts(icagro$value, order.by = icagro$date)
icagro = ts(apply.quarterly(icagro, FUN=mean), start=c(1999,04),
freq=4)
dicagro = diff(icagro)
## Obter o PIB e o hiato
pib = BETSget(22109, from='2000-01-01', data.frame = TRUE)
hiato = ts(hpfilter(pib$value, freq=1600, type='lambda')$cycle,
start=c(2000,01), freq=4)
## Obter a taxa de câmbio
cambio = BETSget(3697, from='1999-10-01', data.frame = TRUE)
cambio = xts(cambio$value, order.by=cambio$date)
cambio = ts(apply.quarterly(cambio, FUN=mean), start=c(1999,4),
freq=4)
dcambio = diff(cambio)
## Obter a inflação de alimentação no domicílio
alim01 = get_sidra(api='/t/655/n1/all/v/all/p/all/c315/7171/d/v63%202')
alim02 = get_sidra(api='/t/2938/n1/all/v/63/p/all/c315/7171/d/v63%202')
alim03 = get_sidra(api='/t/1419/n1/all/v/63/p/all/c315/7171/d/v63%202')
alimentos = ts(c(alim01$Valor, alim02$Valor, alim03$Valor),
start=c(1999,08), freq=12)
fator = 1+alimentos/100
acumulado = (fator*lag(fator,-1)*lag(fator,-2)-1)*100
alimdom = acumulado
alimentos = xts(alimdom, order.by = as.Date(time(alimdom)))
alimentos = window(alimentos, start='2000-01-01')
alimentos = ts(apply.quarterly(alimentos, FUN=mean),
start=c(2000,01), freq=4)
## Obter as dummies sazonais
dummies = ts(seasonaldummy(alimentos), start=c(2000,01), freq=4)
## Juntar todos os dados em uma matriz
data = ts.intersect(alimentos, dcambio, dicagro,
oni, hiato, dummies)

Abaixo, um gráfico das séries já devidamente tratadas.

# Modelo

Com os dados devidamente tratados, podemos estimar o modelo proposto pelo BCB em 1 para o período replicado no boxe - i.e., até o quarto trimestre de 2016. O código abaixo implementa.


modelo = dynlm(alimentos~dcambio+lag(dcambio,-1)+dicagro+
lag(dicagro,-1)+lag(oni,-1)+hiato+
dummies.Q1+dummies.Q2+dummies.Q3,
data=data, end=c(2016,01))

A tabela 1 traz os resultados do modelo. A variável defasada da variação do câmbio, as variações do índice de commodities, a variável dummy associada ao ONI e o hiato do produto se mostram estatisticamente significativas para explicar a inflação de alimentação no domicílio. Em particular, o coeficiente da variável dummy é de 1.2, o que implica dizer que o fim do El Niño em um determinado trimestre reduz a inflação de alimentos em 1.2 pontos percentuais no trimestre seguinte.

Explicando a inflação de alimentos
Dependent variable:
alimentos
dcambio -2.342
(1.736)
lag(dcambio, -1) 3.940**
(1.787)
dicagro 0.061*
(0.035)
lag(dicagro, -1) 0.090**
(0.036)
lag(oni, -1) 1.173*
(0.591)
hiato 0.193**
(0.094)
dummies.Q1 0.083
(0.666)
dummies.Q2 -0.305
(0.697)
dummies.Q3 -0.537
(0.674)
Constant 1.395***
(0.503)
Observations 64
R2 0.537
Adjusted R2 0.460
Residual Std. Error 1.831 (df = 54)
F Statistic 6.972*** (df = 9; 54)
Note: *p<0.1; **p<0.05; ***p<0.01

______________________

Análise da Produção Industrial com o R

By | Comentário de Conjuntura

O IBGE divulgou hoje pela manhã o resultado da Produção Industrial referente a setembro. A coletatratamento apresentação dos dados da pesquisa com o R é ensinada no nosso Curso de Análise de Conjuntura usando o R. A seguir, apresento uma parte do código que gera a apresentação disponível ao final do post.

O script começa carregando alguns pacotes:


library(tidyverse)
library(lubridate)
library(tstools)
library(sidrar)
library(zoo)
library(scales)
library(gridExtra)
library(tsibble)
library(timetk)
library(knitr)

Na sequência, importamos os dados da indústria geral e das atividades da indústria de transformação diretamente do SIDRA/IBGE com o pacote sidrar. Tanto o número índice encadeado quanto o número índice ajustado sazonalmente.


# Produção Física por Seção e Atividades
## Número-Indice com ajuste sazonal
tabela_sa = get_sidra(api='/t/3653/n1/all/v/3134/p/all/c544/all/d/v3134%201') %>%
mutate(date = parse_date(`Mês (Código)`, format='%Y%m')) %>%
select(date, "Seções e atividades industriais (CNAE 2.0)", Valor) %>%
spread("Seções e atividades industriais (CNAE 2.0)", Valor) %>%
as_tibble()

## Número-Indice sem ajuste sazonal
tabela = get_sidra(api='/t/3653/n1/all/v/3135/p/all/c544/all/d/v3135%201') %>%
mutate(date = parse_date(`Mês (Código)`, format='%Y%m')) %>%
select(date, "Seções e atividades industriais (CNAE 2.0)", Valor) %>%
spread("Seções e atividades industriais (CNAE 2.0)", Valor) %>%
as_tibble()

Feito isso, podemos criar algumas métricas de crescimento com o código abaixo.


## Variação na Margem
tabela_sa_ts = ts(tabela_sa[,-1], start=c(year(tabela_sa$date[1]),
month(tabela_sa$date[1])), freq=12)
margem = (tabela_sa_ts/stats::lag(tabela_sa_ts,-1)-1)*100
colnames(margem) <- colnames(tabela_sa[,-1])
margem = tk_tbl(margem, preserve_index = TRUE,
rename_index = 'date')
margem_long = margem %>%
gather(variavel, valor, -date)

## Variação Interanual
tabela_ts = ts(tabela[,-1], start=c(year(tabela$date[1]),
month(tabela$date[1])), freq=12)
interanual = (tabela_ts/stats::lag(tabela_ts,-12)-1)*100
colnames(interanual) <- colnames(tabela[,-1])
interanual = tk_tbl(interanual, preserve_index = TRUE,
rename_index = 'date')
interanual_long = interanual %>%
gather(variavel, valor, -date)

## Variação acumulada em 12 meses
anual = acum_i(tabela_ts,12) %>%
as_tibble() %>%
mutate(date = tabela$date) %>%
drop_na() %>%
select(date, everything())

anual_long = anual %>%
gather(variavel, valor, -date)

Uma vez que conseguimos criar as métricas de crescimento, podemos apresentar as mesmas. Primeiro, em tabelas.

Produção Industrial: variação na margem
Mês Indústria Geral Indústria Extrativa Indústria de Transformação
abr 2020 -19.52 -0.46 -23.41
mai 2020 8.71 -5.00 13.29
jun 2020 9.59 5.02 10.41
jul 2020 8.62 9.21 9.30
ago 2020 3.61 3.09 3.65
set 2020 2.55 -3.73 3.87

Como se vê, a indústria geral tem apresentado seguidas variações positivas desde maio. O gráfico a seguir ilustra a retomada.


Essa retomada na margem, diga-se, aos poucos deve ser sentida nas outras métricas. Os gráficos abaixo mostram a recuperação quando se considera a variação interanual.

Mais lentamente, contudo, veremos uma recuperação sendo sentida na variação acumulada em 12 meses, como pode ser visto nos gráficos a seguir.

(*) A análise completa está disponível no nosso Curso de Análise de Conjuntura usando o R.

Análise do Mercado de Crédito com o R

By | Comentário de Conjuntura

A disponibilidade de crédito é uma variável de suma importância para impulsionar tanto o consumo das famílias quanto o investimento das firmas. Nesse Comentário de Conjuntura, por suposto, seguindo a análise do mercado de crédito que faço no Curso de Análise de Conjuntura usando o R, vamos dar uma olhada em alguns aspectos desse mercado. Para isso, vou utilizar aqui o pacote Quandl para pegar as séries do Banco Central diretamente para o R.

Para começar, vamos pegar as concessões mensais de crédito.


library(Quandl)
library(ggplot2)
library(scales)

credito_total = Quandl('BCB/20631', order='asc')

Na sequência, podemos pegar os dados divididos por pessoa física e jurídica.

</span>

library(tidyverse)

credito_pj = Quandl('BCB/20632', order='asc')
credito_pf = Quandl('BCB/20633', order='asc')

credito_por_p = inner_join(credito_pj, credito_pf, by = 'Date') %>%
rename(pj = Value.x, pf = Value.y)
<pre>

Na sequência, pegamos os dados divididos por crédito livre crédito direcionado.

</pre>
credito_livre = Quandl('BCB/20634', order='asc')
credito_direc = Quandl('BCB/20685', order='asc')

credito_por_recurso = inner_join(credito_livre,
credito_direc, by = 'Date') %>%
mutate(livre=Value.x, direc=Value.y, .keep='unused')
<pre>

A seguir, fazemos a divisão desse estoque entre crédito público e privado.


## Crédito Público vs. Privado
privado <- Quandl('BCB/2043', start_date = '2000-01-01', order='asc')
publico <- Quandl('BCB/2007', start_date = '2000-01-01', order='asc')

data <- inner_join(privado, publico, by='Date')%>%
mutate(privado=Value.x/(Value.x+Value.y)*100,
publico=Value.y/(Value.y+Value.x)*100,
.keep='unused') %>%
pivot_longer(names_to='variavel', values_to='valor', cols=-Date)

 

Uma recuperação mais pujante do mercado de crédito é crucial para que possamos acelerar o crescimento da economia brasileira. Para isso, contudo, são fundamentais as reformas microeconômicas que estão no radar tanto do Congresso Nacional quanto do próprio Banco Central.

_______________________

(*) A análise completa está disponível no nosso Curso de Análise de Conjuntura usando o R.

Desemprego segue subestimado no Brasil

By | Comentário de Conjuntura

No nosso Curso de Análise de Conjuntura usando o R, ensino os alunos a analisar os dados da Pesquisa Nacional por Amostra de Domicílios Contínua (PNAD Contínua), que traz diversos dados sobre o mercado de trabalho brasileiro. A análise desses dados dá uma dimensão interessante sobre os efeitos da pandemia do Covid-19. Para ilustrar, vamos olhar alguns dados agregados nesse Comentário de Conjuntura.

O script, como de hábito, começa com alguns pacotes...


## Pacotes utilizados nessa apresentação
library(tidyverse)
library(lubridate)
library(sidrar)
library(zoo)
library(scales)
library(timetk)
library(knitr)

Uma vez que os pacotes estejam carregados, eu posso pegar alguns dados agregados da PNAD, como no código abaixo.


populacao = get_sidra(api='/t/6022/n1/all/v/606/p/all') %>%
mutate(date = parse_date(`Trimestre Móvel (Código)`,
format='%Y%m')) %>%
select(date, Valor) %>%
as_tibble()

names = c("date", 'pnea', 'pea', 'desocupada', 'ocupada', 'pia')
condicao = get_sidra(api='/t/6318/n1/all/v/1641/p/all/c629/all') %>%
mutate(date = parse_date(`Trimestre Móvel (Código)`,
format='%Y%m')) %>%
select(date, "Condição em relação à força de trabalho e condição de ocupação", Valor) %>%
spread("Condição em relação à força de trabalho e condição de ocupação", Valor) %>%
`colnames<-`(names) %>%
as_tibble()

Com o código acima, eu pego dados de duas tabelas, a 6022 e 6318. Assim, consigo criar as variáveis que eu mais quero, que são a taxa de desemprego e a taxa de participação com o código a seguir.


agregado_pnad = inner_join(populacao, condicao, by='date') %>%
rename(populacao = Valor) %>%
mutate(inativos = populacao - pia,
desemprego = desocupada/pea*100,
participacao = pea/pia*100) %>%
select(date, populacao, inativos, pia, pea, pnea, ocupada, desocupada,
desemprego, participacao)

Uma vez que os dados estejam disponíveis, posso visualizá-los como abaixo.

Observe que o desemprego se aproxima dos 14% da PEA (População Economicamente Ativa). Porém, isso se dá com uma taxa de participação (PEA sobre a PIA) bastante reduzida por conta da pandemia do Covid-19. Em palavras outras, com o fim do auxílio emergencial e também com a proximidade da vacina e/ou da imunidade de rebanho na maioria das capitais, espera-se que o desemprego dê um salto ainda maior nos próximos meses.

________________

(*) Para ter acesso aos códigos completos de nossos futuros exercícios, cadastre-se na nossa Lista VIP aqui.

(**) As inscrições para as Turmas de Verão começam no próximo dia 27/10. Para ser avisado por e-mail, cadastre-se aqui.

Cadastre-se em nossa lista VIP para descontos e conteúdos exclusivos!

Quero me inscrever
{"cart_token":"","hash":"","cart_data":""}