Category

Dados Macroeconômicos

Datação de recessões e ciclos econômicos no R com o algoritmo de Harding-Pagan

By | Artigos de Economia, Dados Macroeconômicos, Data Science, Economia

Ao longo do tempo a economia apresenta o que se chama de ciclos econômicos, ou seja, períodos de expansão e recessão. Mas de que forma podemos saber em qual ponto do ciclo econômico a economia se encontra? Como sabemos se a economia está em recessão? Estas são perguntas de grande interesse para acadêmicos e profissionais da área, e neste breve exercício demonstramos como replicar a datação de ciclos econômicos que instituições como NBER (EUA) e CODACE (Brasil) tradicionalmente publicam.

De maneira prática, neste exercício replicamos o algoritmo de Harding & Pagan (2002) para datar o ciclos de negócios do Produto Interno Bruto (PIB) brasileiro. Em resumo, o método considera algumas regras impostas ao comportamento de uma série temporal para classificar picos e vales. Recessão é o período entro o pico da atividade econômica e seu subsequente vale, ou ponto mínimo. Entre o vale e o pico, diz-se que a economia está em expansão.

O método é bastante simples e poderoso, conseguindo praticamente replicar a cronologia de recessões desenvolvidas pelas instituições mencionadas acima.

Pacotes

Para aplicar o algoritmo utilizaremos o pacote BCDating na linguagem R, criado por Majid Einian (Central Bank of Islamic Republic of Iran) e Franck Arnaud (National Institute of Statistics and Economic Studies, France). Outros pacotes são utilizados para coleta, tratamento e visualização de dados:


# Instalar/carregar pacotes
if(!require("pacman")) install.packages("pacman")
pacman::p_load(
"magrittr",
"BCDating",
"sidrar",
"dplyr",
"lubridate",
"timetk",
"zoo",
"ggplot2",
"ggthemes"
)

Dados

Neste exercício utilizaremos a série do PIB a preços de mercado (série encadeada do índice de volume trimestral com ajuste sazonal, média de 1995 = 100), disponível no SIDRA/IBGE. Para coletar os dados via API pode-se usar o pacote sidrar, especificando o código de coleta. Além disso realizamos a preparação dos dados para utilização posterior:


# Coleta e tratamento de dados
pib <- sidrar::get_sidra(api = "/t/1621/n1/all/v/all/p/all/c11255/90707/d/v584%202") %>%
dplyr::select("date" = `Trimestre (Código)`, "value" = `Valor`) %>%
dplyr::mutate(value = value, date = lubridate::yq(date)) %>%
dplyr::as_tibble()

Algoritmo de Harding & Pagan (2002)

Para aplicar o algoritmo e obter as datações de ciclo de negócios, primeiro transformamos o objeto pro formato de série temporal e, em seguida, utilizamos a função BBQ() do pacote BCDating. Optamos por deixar com os valores predefinidos os demais argumentos da função, que servem para definir os valores mínimos de duração do ciclo (pico ao pico ou vale ao vale) e da fase do ciclo (pico ao vale ou vale ao pico).


# Obter datação de ciclo de negócios
bc_dates <- pib %>%
timetk::tk_ts(select = value, start = c(1996, 1), frequency = 4) %>%
BCDating::BBQ(name = "Ciclo de Negócios do PIB do Brasil")

Resultados

Como pode ser visto abaixo, o objeto retornado traz como resultado as datas (trimestres) de picos e vales, assim como a duração do ciclo.


# Exibir resultados
show(bc_dates)

## Peaks Troughs Duration
## 1 2001Q1 2001Q4 3
## 2 2002Q4 2003Q2 2
## 3 2008Q3 2009Q1 2
## 4 2014Q1 2016Q4 11
## 5 2019Q4 2020Q2 2

Outras informações podem ser obtidas com a função summary(), porém o mais interessante é avaliar o resultado visualmente através de um gráfico. Para tal, fazemos um tratamento dos dados retornados pela função BBQ() e utilizamos o ggplot2 para gerar o gráfico com as áreas sombreadas referente às datas de recessão que foram identificadas pelo algoritmo, acompanhadas do comportamento do PIB no período:

Comparação com cronologia do CODACE/FGV

Por fim, vamos comparar os resultados aqui encontrados com a Cronologia de Ciclos de Negócios Brasileiros elaborada pelo Comitê de Datação de Ciclos Econômicos (CODACE). A última reunião do comitê foi em 29 de junho de 2020, na qual reportou a seguinte situação do ciclo de negócios:

Fonte: CODACE/FGV

Percebe-se que a série utilizada pelo comitê inicia-se em 1980, mas se analisarmos a partir de 1996 (período de início da série utilizada em nosso exercício), verificamos que 5 de 6 recessões datadas pelo CODACE são identificadas pelo algoritmo de Harding & Pagan (2002). Apenas a recessão do 1º trimestre de 1998 ao 1º trimestre de 1999 não foi detectada. Apesar disso, o resultado é empolgante!

Por fim, vamos comparar os resultados de ambas as datações mais a fundo na tabela a seguir, na qual contabilizamos o período de recessão partindo do trimestre imediatamente posterior ao pico até o subsequente vale:

Perceba que ambas as datações são idênticas! A única diferença está na última datação, a qual o CODACE ainda não definiu o próximo vale. Dessa forma, fica demonstrado o poder e facilidade de uso do algoritmo de Harding & Pagan para datação de ciclos econômicos.

Como deflacionar uma série no R

By | Dados Macroeconômicos, Data Science, Economia, Hackeando o R

Algumas pessoas ainda devem se lembrar de quando era possível "fazer o rancho", as compras do mês, com apenas cem reais no bolso, mas já faz bastante tempo que uma simples ida ao supermercado é deveras custosa. O carro popular que podia ser adquirido por menos de R$ 30 mil nos anos 1990 é facilmente vendido por não menos de R$ 50 mil hoje. Ou seja, com uma nota de R$ 100 não se compra a mesma quantidade de bens hoje do que era possível há 20 anos e isso constitui um problema econômico básico, motivo pelo qual devemos deflacionar valores monetários para poder compará-los no tempo.

Sendo assim, se queremos ter uma visão realística quando analisando uma série de preços, devemos transformar os valores nominais para valores deflacionados, ou reais, contabilizando o efeito inflacionário do período. Apesar de ser um procedimento padrão, costumam haver alguns equívocos, de modo que iremos esclarecer alguns pontos e explorar uma abordagem moderna da técnica usando a linguagem R.

Para transformar uma série de preços para valores reais, são necessárias duas coisas: os dados nominais e um índice de preços adequado. A série de dados nominais pode ser qualquer uma que mede algo em valores correntes (R$), como por exemplo a série do salário mínimo, disponibilizada pelo IPEADATA. Já o índice de preços adequado pode vir de diversas fontes, os mais conhecidos no Brasil são o Índice Nacional de Preços ao Consumidor Amplo (IPCA), o Índice Nacional de Preços ao Consumidor (INPC) e o Índice Geral de Preços - Mercado (IGP-M), este divulgado pela FGV e aqueles pelo IBGE. O que esses índices fazem é medir o preço de uma cesta de produtos em um dado período de tempo, geralmente um mês cheio, em relação a um outro período de tempo base.

Com esses dois dados, basta aplicar a fórmula de deflacionamento a seguir:

Onde:

é o valor real, ou deflacionado, no período i na data-base j

 

é o índice de preços fixado na data-base j

 

é o índice de preços no período i

 

é o valor ou preço nominal no período i

 

Com esta fórmula é possível obter o valor deflacionado a partir da multiplicação do valor nominal em um dado período pela razão entre o índice de preços na data-base de referência em relação ao índice no período de análise/interesse. Agora vamos exemplificar com dados para facilitar o entendimento.

Como exemplo, usaremos os dados do salário mínimo do Brasil a partir de 2000 e o INPC para deflacionar a série. Podemos obter esses dados no R com o código a seguir:

# Instalar/carregar pacotes
if(!require("pacman")) install.packages("pacman")
pacman::p_load(
"deflateBR",
"dplyr",
"lubridate",
"httr",
"sidrar",
"purrr",
"ggplot2",
"deflateBR",
"tidyr",
"magrittr"
)

## Coletar dados
# Salário mínimo nominal (código IPEADATA = MTE12_SALMIN12) usando web-scrapping
dados_nominal <- httr::GET(
"http://ipeadata.gov.br/api/odata4/ValoresSerie(SERCODIGO='MTE12_SALMIN12')"
)

# Dados do INPC usando API do Sidra/IBGE
dados_indice <- sidrar::get_sidra(api = "/t/1736/n1/all/v/2289/p/all/d/v2289%2013")

## Tratar dados e filtrar desde o ano 2000
# Salário mínimo nominal
nominal <- httr::content(dados_nominal)[[2]] %>% 
dplyr::bind_rows() %>% 
dplyr::select("date" = `VALDATA`, "nominal" = `VALVALOR`) %>% 
dplyr::mutate(date = lubridate::as_date(date)) %>% 
dplyr::filter(date >= as.Date("2000-01-01"))

# INPC
indice <- dados_indice %>% 
dplyr::select(
"date" = `Mês (Código)`,
"indice" = `Valor`
) %>%
dplyr::mutate(date = lubridate::ym(date))

## Juntar dados
salario_minimo <- dplyr::left_join(nominal, indice, by = "date") %>% 
tidyr::drop_na()

Os dados obtidos podem ser visualizados na tabela abaixo:

Agora vamos supor que queremos saber o salário mínimo real de novembro de 2020 na data-base de abril de 2021. Primeiro calculamos o chamado fator de deflacionamento, que é a fração entre parênteses na fórmula acima, fixando a data-base em abril/2021. O resultado e o cálculo podem ser vistos a seguir:

# Calcular fator de deflacionamento
salario_minimo %<>% 
dplyr::mutate(
fator = (indice[date == "2021-04-01"]/indice)
)

Em seguida, para transformar o valor nominal (R$ 1.045,00) em valor real, basta multiplicá-lo por 1,0384, isto é, R$ 1.045,00 de novembro de 2020 equivale a R$ 1.085,12 em abril de 2021.

Agora que sabemos o procedimento passo a passo do cálculo de deflacionamento, vamos aplicar a fórmula na série do salário mínimo e plotar um gráfico comparativo.

# Calcular salário mínimo real
salario_minimo %<>% 
dplyr::mutate(
real = (indice[date == "2021-04-01"]/indice) * nominal
)

# Visualização de dados
ggplot2::ggplot(salario_minimo, ggplot2::aes(x = date))+
ggplot2::geom_line(
ggplot2::aes(y = nominal, colour = "Salário Mínimo - Nominal"), size = 1.5
) +
ggplot2::geom_line(
ggplot2::aes(y = real, colour = "Salário Mínimo - Real"), size = 1.5
) +
ggplot2::scale_colour_manual(NULL, values = c("#282f6b", "#b22200")) + 
ggplot2::scale_y_continuous(n.breaks = 8) +
ggplot2::labs(
x = NULL,
y = "R$",
title = "Salário Mínimo no Brasil",
subtitle = "Valores em Reais deflacionados pelo INPC a preços de abril/2021.",
caption = "Fonte: analisemacro.com.br com dados de IBGE e IPEA."
) +
ggplot2::theme(
legend.position = "bottom",
plot.title = ggplot2::element_text(face = "bold"),
plot.subtitle = ggplot2::element_text(face = "italic"),
legend.text = ggplot2::element_text(face = "bold")
)

 

Perceba que, apesar de ser simples e fácil, é um pouco trabalhoso obter os dados do índice, tratar, fazer o cálculo, etc., para enfim obter nossa série deflacionada, mesmo que em nosso exemplo tenhamos "quebrado" o procedimento em etapas adicionais para fins de didática. Felizmente, existe um pacote no R chamado deflateBR que facilita essas tarefas em uma única função, criado pelo Fernando Meireles.

Com a função deflate, tudo que precisamos é apontar a série que queremos deflacionar, o vetor de datas correspondentes, uma data-base e um índice de preços que pode ser: IPCA, IGP-M, IGP-DI, IPC ou INPC. Vamos ao exemplo anterior usando essa função. criaremos uma outra coluna em nosso objeto nomeando-a "deflacionado" para diferenciar dos valores anteriores já calculados:

# Deflacionar usando o pacote deflateBR
salario_minimo %<>% 
dplyr::mutate(
deflacionado = deflateBR::deflate(
nominal_values = nominal,
nominal_dates = date %m+% months(1), # evitar que a função pegue valor com 1 lag
real_date = format(tail(date, 1), "%m/%Y"), 
index = "inpc"
)
)

# Verificar se valores são iguais
all.equal(salario_minimo$real, salario_minimo$deflacionado)

# [1] TRUE

Note que o cálculo foi exatamente o mesmo, mas bastou que indicássemos para a função o que e por qual índice necessitamos deflacionar, muito mais simples e prático.

Por fim, vamos confrontar nossos cálculos com os cálculos do IPEA, haja visto que o mesmo disponibiliza em sua plataforma a série do salário mínimo real. Assim certificamos de que fizemos tudo corretamente:

# Salário mínimo real IPEA (código IPEADATA = GAC12_SALMINRE12) usando web-scrapping
dados_real <- httr::GET(
"http://ipeadata.gov.br/api/odata4/ValoresSerie(SERCODIGO='GAC12_SALMINRE12')"
)

# Salário mínimo real IPEA
real <- httr::content(dados_real)[[2]] %>% 
dplyr::bind_rows() %>% 
dplyr::select("date" = `VALDATA`, "ipea" = `VALVALOR`) %>% 
dplyr::mutate(date = lubridate::as_date(date)) %>% 
dplyr::filter(date >= as.Date("2000-01-01"))

# Juntar dados e arredondar casas decimais
salario_minimo <- left_join(salario_minimo, real, by = "date") %>% 
dplyr::mutate(dplyr::across(real:ipea, ~round(.x, 2)))

# Verificar se valores são iguais
all.equal(salario_minimo$real, salario_minimo$ipea)

# [1] TRUE

Assim, demonstramos duas formas de deflacionar valores usando o R, ambas equivalentes entre si.

 

Coleta e tratamento de dados das Contas Nacionais Trimestrais com o R

By | Dados Macroeconômicos

No nosso Curso de Teoria Macroeconômica com Laboratórios de R, incentivamos nossos alunos a aplicarem os conhecimentos de R aprendidos em laboratórios aplicados. Para ilustrar o que vemos no Curso, vou mostrar o laboratório 5, onde é solicitado aos alunos a coleta e tratamento dos dados de poupança e da Formação Bruta de Capital com o R.

O código abaixo pega os dados diretamente do SIDRA/IBGE:


## Importação dos dados da poupança e da fbc
library(sidrar)
data = get_sidra(api='/t/2072/n1/all/v/933,940,941/p/all')

Na sequência, nós fazemos a organização dos dados.


library(tidyverse)
library(lubridate)
library(zoo)

dados <- data %>% select(`Trimestre (Código)`, Variável, Valor) %>%
pivot_wider(names_from=Variável, values_from=Valor) %>%
mutate(date=as.yearqtr(parse_date_time(`Trimestre (Código)`, '%y%q'))) %>%
select(-`Trimestre (Código)`)

Com os dados organizados, nós podemos anualizá-los com o código abaixo.


anuais <- dados %>%
mutate(`Produto Interno Bruto` = rollsum(`Produto Interno Bruto`, k=4, align='right', fill=NA),
`(=) Poupança bruta` = rollsum(`(=) Poupança bruta`, k=4, align='right', fill=NA),
`(-) Formação bruta de capital` = rollsum(`(-) Formação bruta de capital`, k=4, align='right', fill=NA))

Por fim, nós normalizamos nossos dados pelo PIB de forma poder compará-los.


pct <- anuais %>%
mutate(FBC=`(-) Formação bruta de capital`/`Produto Interno Bruto`*100,
Poupança=`(=) Poupança bruta`/`Produto Interno Bruto`*100,
.keep='unused')

O gráfico abaixo ilustra as séries obtidas.

________________

(*) Isso e muito mais você irá aprender no nosso Curso de Teoria Macroeconômica com Laboratórios de R.

Deflacionando variáveis macroeconômicas com o R

By | Dados Macroeconômicos

Nosso objetivo no Curso de Teoria Macroeconômica com Laboratórios de R é o de fornecer uma introdução aplicada à macroeconomia. Serve tanto para alunos e professores de economia, em busca de ferramentas mais aplicadas para lidar com variáveis macroeconômicas, quanto para profissionais de outras áreas em busca de conhecimentos em macroeconomia.

Para ilustrar o que vemos no Curso, vou mostrar aqui nesse post como é possível deflacionar uma série econômica, dúvida muito comum entre nossos alunos. Sabemos todos que R$ 100 em dezembro de 1997 não é a mesma coisa que R$ 100 em dezembro de 2016, não é mesmo? Logo, para comparar valores no tempo é preciso que levemos em consideração a taxa de crescimento do nível geral de preços, ou simplesmente a inflação. Para comparar valores nominais em dois períodos distintos, é preciso que tenhamos a mesma base de preços. Para ilustrar, vamos dar um exemplo utilizando a despesa com benefícios previdenciários do governo central. Para deflacionar, vamos utilizar o Índice de Preços ao Consumidor Amplo (IPCA).


library(readxl)
library(tidyverse)
library(ggplot2)
library(magrittr)
library(lubridate)
library(sidrar)

data = read_excel("primario.xlsx")

data %>% pivot_longer(-date, names_to='Variável', values_to='valor') %>%
ggplot(aes(x=date, y=valor, color=Variável)) + geom_line() +
labs(title='Receitas e despesas com benefícios previdenciários', x='Data',
y='Valor', color='') +
theme_light()

O gráfico acima ilustra as nossas séries em valores nominais. Na sequência, fazemos o ajuste para valores reais com base no IPCA.


ipca = get_sidra(api='/t/1737/n1/all/v/2266/p/all/d/v2266%2013')

ipca %<>% mutate(date = parse_date_time(`Mês (Código)`, 'ym'))

ajuste <- left_join(ipca, data, by='date') %>%
select(date, Valor, receita, despesa) %>%
na.omit() %>%
mutate('Receita ajustada' = receita/Valor*Valor[274],
'Despesa ajustada' = despesa/Valor*Valor[274])

ajuste %>% select(date, receita, 'Receita ajustada') %>%
pivot_longer(-date, names_to = 'Variáveis', values_to = 'Valor') %>%
ggplot(aes(x=date, y=Valor, color=Variáveis)) + geom_line() +
labs(title='Receitas com benefícios previdenciários nominais e reais', x='Data',
color='') +
theme_light()

No gráfico acima, vemos os valores nominais e reais das receitas com benefícios previdenciários. A título de comparação, é necessário sempre usar valores reais.

________________

(*) Isso e muito mais você irá aprender no nosso Curso de Teoria Macroeconômica com Laboratórios de R.

Incerteza permanece elevada no Brasil

By | Dados Macroeconômicos

Ontem, a FGV divulgou o seu Índice de Incerteza Econômica Brasil. Como esperado, houve um aumento em agosto. Com efeito, a incerteza permanece acima da média histórica. Para ilustrar, podemos usar o ggplot2 para construir um gráfico da série. Para começar, carregamos alguns pacotes.


library(readr)
library(ggplot2)
library(scales)
library(png)
library(grid)
library(ggrepel)

Nós importamos, então, o arquivo incerteza.csv com o pacote readr, que faz parte dos pacotes tidyverse.


data = read_csv2('incerteza.csv',
col_types =
list(col_date(format='%d/%m/%Y'),
col_double()))

E agora que temos os dados, podemos gerar um gráfico com o código abaixo.


img <- readPNG('logo.png')
g <- rasterGrob(img, interpolate=TRUE)

ggplot(tail(data,72), aes(tail(date,72), tail(iie_br,72)))+
annotate("rect", fill = "#336666", alpha = 0.3,
xmin = as.Date('2015-08-01'),
xmax = as.Date('2015-10-01'),
ymin = -Inf, ymax = Inf)+
annotate("rect", fill = "#336666", alpha = 0.3,
xmin = as.Date('2018-05-01'),
xmax = as.Date('2018-07-01'),
ymin = -Inf, ymax = Inf)+
geom_line(size=.8)+
geom_hline(yintercept=mean(data$iie_br),
colour='red', linetype='dashed')+
scale_x_date(breaks = date_breaks("3 month"),
labels = date_format("%b/%Y"))+
theme(axis.text.x=element_text(angle=45, hjust=1))+
labs(x='', y='Índice',
title='Índice de Incerteza Econômica Brasil',
caption = 'Fonte: analisemacro.com.br com dados da FGV')+
theme(panel.background = element_rect(fill='#acc8d4',
colour='#acc8d4'),
plot.background = element_rect(fill='#8abbd0'),
axis.line = element_line(colour='black',
linetype = 'dashed'),
axis.line.x.bottom = element_line(colour='black'),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.background = element_rect((fill='#acc8d4')),
legend.key = element_rect(fill='#acc8d4',
colour='#acc8d4'),
plot.margin=margin(5,5,15,5))+
annotation_custom(g,
xmin=as.Date('2013-08-01'),
xmax=as.Date('2015-01-01'),
ymin=110, ymax=130)+
geom_label_repel(label=round(tail(data$iie_br,72),2),
hjust=0,
vjust=-.2,
color = c(rep(NA,72-1), rep('black',1)),
fill = c(rep(NA,72-1), rep('lightblue',1)))

E o gráfico...

 

O índice registrou 114,2 pontos em agosto, acima da média representada pela linha vermelha tracejada. Aliás, diga-se, o índice vem se mantendo acima da média histórica desde 2015. Abaixo, colocamos um boxplot da série.


ggplot(data, aes(date, iie_br))+
geom_boxplot(fill='#8abbd0', color="black")+coord_flip()+
theme_classic()+xlab('')+ylab('')+
labs(title='Boxplot IIE-Br',
caption='Fonte: analisemacro.com.br')

Como se pode ver no boxplot acima, o valor registrado em agosto está no último quartil. Em outras palavras, a incerteza permanece elevada no país.

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":""}