Datação de recessões no R com o algoritmo de Harding-Pagan
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:
# Carregar pacotes
library(magrittr) # CRAN v2.0.1
library(BCDating) # CRAN v0.9.8
library(sidrar) # CRAN v0.2.6
library(dplyr) # CRAN v1.0.7
library(lubridate) # CRAN v1.7.10
library(timetk) # CRAN v2.6.1
library(zoo) # CRAN v1.8-9
library(ggplot2) # CRAN v3.3.5
library(ggthemes) # CRAN v4.2.0
library(ggtext) # CRAN v0.1.1
library(purrr) # CRAN v0.3.4
library(tidyr) # CRAN v1.1.3
library(flextable) # CRAN v0.6.1
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()
# Inspeção dos dados
pib
## # A tibble: 102 x 2
## date value
## <date> <dbl>
## 1 1996-01-01 99.6
## 2 1996-04-01 100.
## 3 1996-07-01 104.
## 4 1996-10-01 103.
## 5 1997-01-01 104.
## 6 1997-04-01 105.
## 7 1997-07-01 106.
## 8 1997-10-01 107.
## 9 1998-01-01 105.
## 10 1998-04-01 107.
## # ... with 92 more rows
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")
# Inspeção do objeto
class(bc_dates)
## [1] "BCDating"
## attr(,"package")
## [1] "BCDating"
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()
:
# Informações adicionais
summary(bc_dates)
## Phase ]Start ;End] Duration LevStart LevEnd Amplitude
## 1 Expansion <NA> 2001Q1 NA NA 114 NA
## 2 Recession 2001Q1 2001Q4 3 114 112 1.5
## 3 Expansion 2001Q4 2002Q4 4 112 118 5.8
## 4 Recession 2002Q4 2003Q2 2 118 116 1.5
## 5 Expansion 2003Q2 2008Q3 21 116 152 35.1
## 6 Recession 2008Q3 2009Q1 2 152 144 7.7
## 7 Expansion 2009Q1 2014Q1 20 144 177 33.2
## 8 Recession 2014Q1 2016Q4 11 177 163 14.5
## 9 Expansion 2016Q4 2019Q4 12 163 172 8.9
## 10 Recession 2019Q4 2020Q2 2 172 153 19.0
## 11 Expansion 2020Q2 <NA> NA 153 NA NA
##
## Amplitude Duration
## Exp=]T;P] 20.8 14.2
## Rec=]P;T] 8.8 4.0
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:
# Transformar resultados em tibble
bc_dates_tbl <- purrr::quietly(show)(bc_dates)$result %>%
dplyr::as_tibble() %>%
dplyr::mutate(
`Peaks` = zoo::as.yearqtr(`Peaks`),
`Troughs` = zoo::as.yearqtr(`Troughs`)
)
# Formatar dados do PIB para "year/quarter"
pib %<>%
dplyr::mutate(date = zoo::as.yearqtr(date))
# Gerar gráfico
ggplot2::ggplot() +
ggplot2::geom_rect(
data = bc_dates_tbl,
ggplot2::aes(
xmin = `Peaks`, xmax = `Troughs`, ymin = -Inf, ymax = Inf,
fill = "Recessão"
),
alpha = 0.3
) +
ggplot2::geom_line(
data = pib,
ggplot2::aes(x = date, y = value, colour = "PIB s. a. (1995 = 100)"),
size = 1.5
) +
ggplot2::labs(
title = "Datação de ciclos econômicos: PIB vs. Recessões",
subtitle = "Recessão datada pelo algoritmo de Harding-Pagan (2002)",
y = "Índice",
caption = "**Fonte:** IBGE | **Elaboração:** fortietwo.com"
) +
ggthemes::theme_calc() +
zoo::scale_x_yearqtr(
NULL,
breaks = seq(from = min(pib$date), to = max(pib$date), by = 1),
format = "%Y T%q"
) +
ggplot2::scale_colour_manual(NULL, values = c("dodgerblue4")) +
ggplot2::scale_fill_manual(NULL, values = c("grey70")) +
ggplot2::theme(
plot.title = ggplot2::element_text(face = "bold"),
axis.text.x = ggplot2::element_text(angle = 90, hjust = 1),
legend.position = "bottom",
plot.background = ggplot2::element_rect(colour = NA),
plot.caption = ggtext::element_markdown()
)
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:
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:
bc_dates_tbl %>%
dplyr::mutate(`Peaks` = `Peaks` + 0.25) %>%
tidyr::unite(col = `Período`, 1:2, sep = " - ") %>%
dplyr::rename("Duração" = `Duration`) %>%
dplyr::mutate(
`Período ` = c(
"2001 Q2 - 2001 Q4",
"2003 Q1 - 2003 Q2",
"2008 Q4 - 2009 Q1",
"2014 Q2 - 2016 Q4",
"2020 Q1 - ?"
),
`Duração ` = c(3, 2, 2, 11, "?")
) %>%
flextable::flextable() %>%
flextable::add_header_row(
colwidths = c(2, 2),
values = c("Algoritmo H. & P.", "Cronologia CODACE")
) %>%
flextable::theme_vanilla() %>%
flextable::add_footer_lines("Fonte: fortietwo.com e CODACE.") %>%
flextable::set_caption("Datação de recessões - Ciclo de negócios do PIB brasileiro") %>%
flextable::autofit()
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.