Você vai reproduzir os fatos estilizados do ciclo americano com dados do FRED, comparar com as previsões do modelo RBC, e fazer uma análise qualitativa do episódio de 2008. Não é econometria: é olhar para os dados e pensar.
O modelo RBC, calibrado com os parâmetros padrão, prevê que as volatilidades relativas ao PIB sejam aproximadamente:
$$\sigma_C / \sigma_Y \approx 0{,}32 \qquad \sigma_I / \sigma_Y \approx 3{,}28 \qquad \sigma_H / \sigma_Y \approx 0{,}38$$
Seu objetivo é calcular esses mesmos números com dados reais americanos, reproduzir o gráfico da Seção 3, e então examinar o episódio de 2008.
O que é o filtro HP — leia antes de rodar o código
Uma série como o PIB tem dois componentes misturados: uma tendência de longo prazo (crescimento estrutural, de décadas) e flutuações de curto prazo em torno dela (o ciclo de negócios, de meses a anos). Macroeconomistas querem estudar só as flutuações, não a tendência.
O filtro Hodrick-Prescott (HP) faz exatamente isso: dado uma série, ele encontra a tendência suave que melhor a acompanha sem seguir cada solavanco. O que sobra — série menos tendência — é o componente cíclico. O parâmetro $\lambda = 1600$ controla quão suave a tendência deve ser; para dados trimestrais, 1600 é o valor padrão da literatura desde Kydland e Prescott (1982).
No código abaixo, hpfilter(x, lamb=1600) devolve dois objetos: a tendência e o ciclo. A função ciclo() já descarta a tendência e retorna só o que interessa.
Dados necessários (FRED — clique para baixar CSV)
GDPC1
PIB real trimestral (bilhões de dólares encadeados de 2017)
PCECC96
Consumo pessoal real trimestral
GPDIC1
Investimento privado bruto real trimestral
HOANBS
Horas trabalhadas no setor não-agrícola (índice trimestral)
Instale antes de começar: pip install pandas numpy matplotlib statsmodels
O código abaixo está completo e roda do início ao fim. Leia cada bloco antes de executar. As perguntas que você precisa responder estão na seção de passos logo abaixo.
# ── Imports e carregamento ────────────────────────────────────
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.filters.hp_filter import hpfilter
gdp = pd.read_csv('GDPC1.csv', index_col=0, parse_dates=True).squeeze()
cons = pd.read_csv('PCECC96.csv', index_col=0, parse_dates=True).squeeze()
inv = pd.read_csv('GPDIC1.csv', index_col=0, parse_dates=True).squeeze()
hours = pd.read_csv('HOANBS.csv', index_col=0, parse_dates=True).squeeze()
# ── Filtro HP: extrai o componente cíclico ────────────────────
# hpfilter retorna (tendência, ciclo). Ficamos só com o ciclo.
def ciclo(s, lamb=1600):
_, c = hpfilter(np.log(s.dropna()), lamb=lamb)
return c
cy_y = ciclo(gdp) # ciclo do PIB
cy_c = ciclo(cons) # ciclo do consumo
cy_i = ciclo(inv) # ciclo do investimento
cy_h = ciclo(hours) # ciclo das horas trabalhadas
# ── Fatos estilizados: volatilidade relativa ao PIB ───────────
std_y = cy_y.std()
modelo_rbc = {'Consumo': 0.32, 'Investimento': 3.28, 'Horas': 0.38}
dados = {
'Consumo': cy_c.std() / std_y,
'Investimento': cy_i.std() / std_y,
'Horas': cy_h.std() / std_y,
}
print("Volatilidade relativa ao PIB:")
for var in dados:
print(f" {var:<14} dados = {dados[var]:.2f} modelo RBC = {modelo_rbc[var]:.2f}")
# ── Correlação com o ciclo do PIB ────────────────────────────
comum = cy_y.index.intersection(cy_c.index)
print("\nCorrelação com ciclo do PIB:")
for cy, nome in [(cy_c, 'Consumo'), (cy_i, 'Investimento'), (cy_h, 'Horas')]:
r = cy.reindex(comum).corr(cy_y.reindex(comum))
print(f" {nome:<14} {r:.3f}")
# ── Gráfico 1: barras agrupadas (reproduz o da Seção 3) ───────
variaveis = list(dados.keys())
x = np.arange(len(variaveis))
fig, ax = plt.subplots(figsize=(8, 4))
ax.bar(x - 0.2, [dados[v] for v in variaveis], 0.38, label='Dados (EUA)', color='#2e7d72', alpha=0.8)
ax.bar(x + 0.2, [modelo_rbc[v] for v in variaveis], 0.38, label='Modelo RBC', color='#ad5f2b', alpha=0.75)
ax.set_xticks(x); ax.set_xticklabels(variaveis)
ax.set_ylabel('Desvio padrão relativo ao PIB')
ax.set_title('Fatos estilizados: dados vs modelo RBC')
ax.legend(); ax.grid(axis='y', alpha=0.3)
plt.tight_layout(); plt.show()
# ── Gráfico 2: zoom em 2008 ──────────────────────────────────
janela = slice('2005', '2013')
fig, axes = plt.subplots(3, 1, figsize=(10, 7), sharex=True)
pares = [(cy_y, 'PIB'), (cy_c, 'Consumo'), (cy_h, 'Horas trabalhadas')]
for ax, (cy, nome) in zip(axes, pares):
ax.plot(cy[janela] * 100, color='#1a1510', lw=1.5)
ax.axhline(0, color='gray', lw=0.6)
ax.axvspan('2007-12-01', '2009-06-01', alpha=0.1, color='#ad5f2b')
ax.set_title(nome, fontsize=10, loc='left')
ax.set_ylabel('% desvio da tendência', fontsize=8)
axes[0].annotate('Recessão NBER', xy=('2008-06-01', ax.get_ylim()[1]*0.85),
fontsize=8, color='#ad5f2b')
plt.tight_layout(); plt.show()
1
Rode o código e observe a tabela de volatilidades. Em qual variável o modelo mais erra? Em qual ele acerta melhor? Isso é coerente com o que a Seção 3 mostrou?
2
Observe as correlações com o PIB. O modelo RBC prevê que consumo, investimento e horas são todos positivamente correlacionados com o produto. Os dados confirmam? Há alguma surpresa?
3
Olhe o Gráfico 1 (barras agrupadas). A barra de horas trabalhadas é o lugar onde o modelo mais falha. Por que isso acontece? Conecte com o resultado da Q8: se $\eta$ é constante no modelo, o que isso implica sobre a volatilidade prevista das horas?
4
Olhe o Gráfico 2 (zoom em 2008). Compare a queda nas horas com a queda no PIB naquele período. A queda nas horas foi proporcionalmente maior ou menor do que o modelo prevê? O que isso sugere sobre o tipo de choque que causou a recessão?
5
Conecte com a Seção 1. O consumo cíclico caiu mais ou menos do que o PIB em 2008? Lembre que a taxa de poupança subiu de 3% para 8% naquele período. Se as pessoas pouparam mais, o consumo deve ter caído relativamente mais que a renda. Isso é compatível com o modelo RBC, onde consumo e produto caem juntos na mesma proporção?
6
Escreva uma conclusão de um parágrafo. Com base nos dois gráficos e nos números da tabela, o ciclo de 2008 parece mais com o que o modelo RBC descreve (choque de tecnologia, resposta ótima) ou com o que um Keynesiano descreveria (colapso de demanda, desemprego involuntário)? Justifique com pelo menos dois elementos concretos dos seus gráficos.
Vale publicar. Um notebook Python que baixa dados do FRED, aplica HP-filter, reproduz uma tabela de fatos estilizados e conclui sobre um debate da literatura é algo concreto para mostrar. Documenta que você sabe ligar teoria a dado, o que é raro entre alunos de graduação. Publique no
GitHub com um README explicando o que foi feito, e coloque o link no LinkedIn. Três linhas: o que o projeto faz, o que você encontrou, qual modelo o dado favorece.