O GDPNow é um modelo de nowcasting desenvolvido pelo Federal Reserve Bank of Atlanta para fornecer estimativas em tempo real do crescimento do PIB real dos Estados Unidos. O modelo foi apresentado no Working Paper 2014-7 por Higgins (2014).
Este documento apresenta tanto a metodologia original do paper quanto a implementação em Python desenvolvida como replicação do modelo.
1.1 Resumo Executivo da Metodologia
1.1.1 O que é o GDPNow?
O GDPNow é um modelo estatístico que prevê o PIB atual (daí “now-casting” = previsão do agora) antes da divulgação oficial dos dados. Diferente de modelos tradicionais que preveem o futuro distante, o GDPNow quer saber: “Como está a economia AGORA?”
1.1.2 Por que é necessário?
O Bureau of Economic Analysis (BEA) divulga os dados do PIB com cerca de 1 mês de atraso. Por exemplo: - Janeiro, Fevereiro, Março = 1º trimestre de 2024 - Final de Abril = BEA divulga o PIB do 1º trimestre
Durante esse mês de espera, diversos indicadores econômicos são divulgados (vendas no varejo, produção industrial, comércio exterior, etc.). O GDPNow usa esses dados para estimar o PIB antes da divulgação oficial.
1.1.3 Como funciona? (Versão Simples)
O modelo funciona em 3 passos principais:
1.1.3.1 1. Decomposição: Quebrar o PIB em Pedaços
Em vez de prever o PIB total diretamente, o modelo separa em 13 componentes:
Consumo: o que as famílias compram (bens e serviços)
Por quê fazer isso? Cada componente tem seus próprios indicadores. Por exemplo: - Vendas no varejo → prevê consumo - Produção industrial → prevê investimento em equipamentos - Dados de comércio → prevê exportações/importações
1.1.3.2 2. Modelagem: Dois Modelos Trabalhando Juntos
Modelo A: BVAR (Bayesian Vector Autoregression) - Captura como os 13 componentes se relacionam ao longo do tempo - Exemplo: se exportações sobem, importações tendem a subir também - Usa dados históricos desde 1968 - Fornece previsão “base” quando não há dados novos
Modelo B: Equações Bridge - Conecta indicadores mensais (vendas, produção) aos componentes trimestrais do PIB - Exemplo: “vendas no varejo subiram 2% → consumo de bens deve crescer X%” - Atualiza as previsões quando novos dados são divulgados
Filtro de Kalman: O Árbitro - Combina as previsões dos dois modelos de forma ótima - Pergunta: “Qual modelo está mais confiável agora?” - Se há muitos dados novos → dá mais peso às equações bridge - Se há poucos dados → dá mais peso ao BVAR
1.1.3.3 3. Agregação: Juntar os Pedaços
Depois de prever os 13 componentes, soma tudo para obter o PIB total:
Os pesos refletem o tamanho de cada componente na economia. Por exemplo: - Consumo ≈ 70% do PIB → peso maior - Exportações ≈ 12% do PIB → peso menor
1.1.4 Exemplo Prático: Como o GDPNow Funciona no Dia a Dia
Cenário: Estamos em Fevereiro de 2024, no meio do 1º trimestre.
Dia 1 de Janeiro: - Trimestre começou, sem dados novos ainda - GDPNow usa apenas o BVAR: “Baseado no histórico, prevejo crescimento de 2.0%”
Dia 15 de Janeiro: - Saem dados de vendas no varejo de Dezembro - Equação bridge: “Vendas caíram → consumo pode crescer só 1.5%” - Filtro de Kalman combina: Nova previsão = 1.8%
Dia 1 de Fevereiro: - Saem dados de produção industrial de Janeiro - Equação bridge: “Produção forte → investimento vai bem!” - Nova previsão = 2.1%
Dia 1 de Março: - Saem dados de comércio exterior de Fevereiro - Equação bridge: “Exportações em alta!” - Nova previsão final = 2.3%
Final de Abril: - BEA divulga: PIB cresceu 2.4% - Erro do GDPNow: apenas 0.1 ponto percentual!
1.1.5 Principais Vantagens
Atualização contínua: Nova previsão a cada dado divulgado
Transparência: Metodologia totalmente documentada
Granularidade: Mostra qual setor está impulsionando/freando a economia
Acurácia: Historicamente muito próximo dos dados oficiais
1.1.6 Principais Desafios
Volatilidade inicial: No início do trimestre, com poucos dados, a previsão é menos confiável
Dependência de dados: Se indicadores são revisados, previsão muda
Apenas estatístico: Não incorpora informações qualitativas (guerras, pandemias, etc.)
1.1.7 Resumo em Uma Frase
O GDPNow quebra o PIB em 13 pedaços, prevê cada pedaço usando indicadores mensais e dados históricos, depois junta tudo para estimar o crescimento econômico atual antes da divulgação oficial.
1.2 Objetivo
O objetivo principal do GDPNow é produzir uma estimativa atual (“nowcast”) do crescimento do PIB real antes da divulgação oficial dos dados pelo Bureau of Economic Analysis (BEA). O modelo atualiza suas previsões conforme novos dados econômicos são divulgados ao longo do trimestre.
1.3 Conceito de Nowcasting
Nowcasting refere-se à previsão do presente, do passado muito recente e do futuro muito próximo. Diferentemente de previsões tradicionais que se concentram em horizontes mais distantes, o nowcasting busca estimar o estado atual da economia usando dados parciais e indicadores de alta frequência.
\(\mathbf{y}_t\) é o vetor 13×1 das variáveis (12 em log + 1 razão)
\(\mathbf{c}\) é o vetor de constantes
\(\mathbf{\Phi}_1, ..., \mathbf{\Phi}_5\) são matrizes 13×13 de coeficientes
\(\mathbf{u}_t\) é o vetor de erros com \(\mathbf{u}_t \sim N(\mathbf{0}, \mathbf{\Sigma})\)
3.1.3 Minnesota Prior
O modelo usa Minnesota Prior (Litterman, 1986) implementado via dummy observations (Banbura, Giannone, Reichlin, 2008):
λ: Tightness do prior (0.15 para quantidades, 0.12 para preços)
τ: Prior no termo constante (τ = 10λ)
δ: Peso no random walk prior (δ = 1 para log-levels)
3.1.4 Período de Estimação
O modelo BVAR é estimado usando dados trimestrais de 1968Q1 a 2013Q4 (179 observações).
3.1.5 Propriedades do Modelo
Frequência: Trimestral
Lags: 5 trimestres (conforme Appendix do paper)
Método: Bayesiano via dummy observations
Uso: O BVAR captura as relações dinâmicas entre as subcomponentes e fornece previsões de médio prazo
3.2 Função do BVAR no GDPNow
O modelo BVAR tem duas funções principais:
Fornecer previsões de longo prazo para as subcomponentes quando não há dados de indicadores disponíveis
Capturar spillovers entre componentes: mudanças em uma subcomponente podem afetar outras através das correlações capturadas pelo VAR
3.3 Implementação em Python
3.3.1 1. Download dos Dados do FRED
Primeiro, baixamos os 13 componentes do PIB diretamente do FRED:
Código
import pandas as pdfrom pandas_datareader import data as webimport numpy as npimport matplotlib.pyplot as plt# API key do FREDfred_key ='e8f25a1732f12c324ad37204f2cb1fa3'# Definir códigos FRED para os 13 componentescomponents = {'consumption_goods': {'growth': 'DGDSRL1Q225SBEA','level': 'DGDSRX1Q020SBEA' },'consumption_services': {'growth': 'DSERRL1Q225SBEA','level': 'PCESVC96' },'equipment': {'growth': 'Y033RL1Q225SBEA','level': 'Y033RX1Q020SBEA' },'ipp': {'growth': 'Y001RL1Q225SBEA','level': 'Y001RX1Q020SBEA' },'structures': {'growth': 'A009RL1Q225SBEA','level': 'B009RX1Q020SBEA' },'residential': {'growth': 'A011RL1Q225SBEA','level': 'PRFIC1' },'exports_goods': {'growth': 'A253RL1Q225SBEA','level': 'A253RX1Q020SBEA' },'exports_services': {'growth': 'A646RL1Q225SBEA','level': 'A646RX1Q020SBEA' },'imports_goods': {'growth': 'A255RL1Q225SBEA','level': 'A255RX1Q020SBEA' },'imports_services': {'growth': 'A656RL1Q225SBEA','level': 'B656RX1Q020SBEA' },'federal_govt': {'growth': 'A823RL1Q225SBEA','level': 'FGCEC1' },'state_local_govt': {'growth': 'A829RL1Q225SBEA','level': 'SLCEC1' },'inventories': {'level': 'CBIC1' }}# Baixar dados e reconstruir séries históricas# (Ver build_gdp_from_fred.py para código completo)
3.3.2 2. Implementação da Classe BVAR
Classe que implementa BVAR com Minnesota Prior via dummy observations:
Código
import numpy as npfrom scipy import linalgclass BVAR:""" Bayesian VAR com Minnesota Prior via dummy observations. Implementação baseada em Banbura, Giannone, Reichlin (2008). """def__init__(self, lags=5, lambda_param=0.15, tau=None, delta=1):""" Parâmetros: ----------- lags : int Número de defasagens lambda_param : float Tightness do prior (0.15 para quantidades, 0.12 para preços) tau : float Prior no termo constante (default: 10*lambda) delta : float Peso no random walk prior (1 para log-levels) """self.lags = lagsself.lambda_param = lambda_paramself.tau = tau if tau isnotNoneelse10* lambda_paramself.delta = deltadef _create_dummy_observations(self, Y, X):""" Cria dummy observations para implementar Minnesota Prior. Três tipos de dummies: 1. Prior nos coeficientes (favorece random walk) 2. Prior na constante (evita explosão) 3. Prior na soma dos coeficientes (co-persistência) """ T, n = Y.shape k = X.shape[1]# Calcular desvios-padrão das primeiras observações s = np.std(Y[:self.lags], axis=0)# Dummy 1: Prior nos coeficientes Y_dummy1 = np.diag(s *self.delta /self.lambda_param) X_dummy1 = np.zeros((n, k))for i inrange(n): X_dummy1[i, i::n] = s[i] *self.delta /self.lambda_param# Dummy 2: Prior na constante Y_dummy2 = np.diag(s) X_dummy2 = np.zeros((n, k)) X_dummy2[:, -1] = s /self.tau# Dummy 3: Prior na soma dos coeficientes Y_dummy3 = np.tile(s *self.delta /self.tau, (self.lags, 1)) X_dummy3 = np.kron(np.ones((1, self.lags)), np.diag(s *self.delta /self.tau)) X_dummy3 = np.hstack([X_dummy3, np.zeros((self.lags, 1))])# Concatenar dados reais com dummies Y_star = np.vstack([Y, Y_dummy1, Y_dummy2, Y_dummy3]) X_star = np.vstack([X, X_dummy1, X_dummy2, X_dummy3])return Y_star, X_stardef fit(self, data):""" Estima o BVAR. Parâmetros: ----------- data : array-like (T, n) Dados observados """ data = np.asarray(data) T, n = data.shapeself.n_vars = n# Criar defasagens Y = data[self.lags:] X = np.column_stack([data[i:T-self.lags+i] for i inrange(self.lags)]) X = np.column_stack([X, np.ones(len(Y))]) # adicionar constante# Criar dummy observations Y_star, X_star =self._create_dummy_observations(Y, X)# Estimação via OLS nos dados aumentadosself.coef_ = linalg.lstsq(X_star, Y_star)[0]# Calcular resíduos e matriz de covariância fitted = X @self.coef_ residuals = Y - fittedself.sigma_ = (residuals.T @ residuals) /len(residuals)# Guardar últimas observações para previsãoself.last_obs = data[-self.lags:]returnselfdef forecast(self, last_obs=None, steps=1):""" Faz previsão h passos à frente. Parâmetros: ----------- last_obs : array-like (lags, n_vars) Últimas observações (se None, usa últimas do fit) steps : int Número de passos à frente Retorna: -------- forecasts : array (steps, n_vars) """if last_obs isNone: last_obs =self.last_obselse: last_obs = np.asarray(last_obs) forecasts = [] current = last_obs.copy()for _ inrange(steps):# Construir vetor de regressores X_new = np.concatenate([current[::-1].flatten(), [1]])# Prever y_new = X_new @self.coef_ forecasts.append(y_new)# Atualizar para próximo passo current = np.vstack([current[1:], y_new])return np.array(forecasts)def information_criteria(self, data):""" Calcula AIC e BIC. """ data = np.asarray(data) T, n = data.shape T_eff = T -self.lags# Número de parâmetros k = n * (n *self.lags +1)# Log-likelihood det_sigma = np.linalg.det(self.sigma_) log_lik =-0.5* T_eff * (n * np.log(2*np.pi) + np.log(det_sigma) + n)# Critérios aic =-2* log_lik / T_eff +2* k / T_eff bic =-2* log_lik / T_eff + np.log(T_eff) * k / T_effreturn {'AIC': aic, 'BIC': bic, 'log_likelihood': log_lik}
3.3.3 3. Estimação do BVAR para Quantidades
Estimar BVAR(5) com λ=0.15 para os 13 componentes do PIB:
Código
import pandas as pdimport numpy as npimport pickleimport matplotlib.pyplot as pltfrom bvar_implementation import BVAR# Carregar dadosdf = pd.read_csv('gdp_13_components_for_bvar.csv', index_col=0)# Período de estimação: 1968Q1-2013Q4df_estimation = df.loc['1968Q1':'2013Q4'].copy()print(f"Dados: {df_estimation.shape[0]} observações, {df_estimation.shape[1]} variáveis")print(f"Período: {df_estimation.index[0]} a {df_estimation.index[-1]}")# Instanciar e estimar BVARbvar = BVAR(lags=5, lambda_param=0.15, delta=1)bvar.fit(df_estimation.values)# Calcular critérios de informaçãoinfo = bvar.information_criteria(df_estimation.values)print(f"\nAIC: {info['AIC']:.2f}")print(f"BIC: {info['BIC']:.2f}")print(f"Log-likelihood: {info['log_likelihood']:.2f}")# Prever 2014Q1last_5_obs = df_estimation.iloc[-5:].valuesforecast_2014Q1 = bvar.forecast(last_5_obs, steps=1)[0]# Calcular taxas de crescimentogrowth_rates = {}for idx, col inenumerate(df_estimation.columns): last_value = df_estimation[col].iloc[-1]if col =='inventories_to_gdp': growth_rates[col] = forecast_2014Q1[idx]else: growth_rates[col] = (np.exp(forecast_2014Q1[idx] - last_value) -1) *100# Exibir resultadosprint("\nCrescimento previsto para 2014Q1 (%):\n")for comp, growth in growth_rates.items():print(f"{comp:25s}: {growth:+7.2f}%")# Salvar modelowithopen('bvar_bayesian_model.pkl', 'wb') as f: pickle.dump(bvar, f)print("\n✓ Modelo BVAR salvo em 'bvar_bayesian_model.pkl'")
3.3.4 4. Resultados da Estimação
Critérios de Informação:
AIC: -70.80
BIC: -55.52
Log-likelihood: 6362.19
Previsões de Crescimento para 2014Q1 (%):
Componente
Crescimento
Consumption goods
-0.08%
Consumption services
+0.80%
Equipment
+3.35%
IPP
+1.37%
Structures
+1.63%
Residential
+1.71%
Exports goods
+4.40%
Exports services
-2.77%
Imports goods
+2.43%
Imports services
-2.31%
Federal govt
-0.94%
State/local govt
-0.07%
Visualização das Previsões:
Previsões BVAR para Quantidades - 2014Q1
A figura mostra as previsões do BVAR para cada componente do PIB em 2014Q1 (log-levels), comparadas com o último valor observado em 2013Q4. As barras indicam a direção e magnitude das mudanças previstas.
3.3.5 5. Validação da Implementação
A implementação foi validada comparando com o pacote vars do R:
Código
# Correlação com R vars package: 0.999989# RMSE: 0.009778 (< 1%)# ✓ Implementação validada como correta
A correlação de 0.999989 confirma que a mecânica do VAR está implementada corretamente. As pequenas diferenças vêm do prior bayesiano (shrinkage), que é exatamente o comportamento desejado para prevenir overfitting.
3.3.6 6. BVAR para Deflatores de Preço
Repetimos o processo com λ=0.12 para os 13 deflatores:
Código
# Carregar deflatores de preçodf_prices = pd.read_csv('price_deflators_for_bvar.csv', index_col=0)df_prices_estimation = df_prices.loc['1968Q1':'2013Q4'].copy()# Estimar BVAR com lambda = 0.12 (mais shrinkage para preços)bvar_prices = BVAR(lags=5, lambda_param=0.12, delta=1)bvar_prices.fit(df_prices_estimation.values)# Calcular critérios de informaçãoinfo_prices = bvar_prices.information_criteria(df_prices_estimation.values)print(f"\nAIC: {info_prices['AIC']:.2f}")print(f"BIC: {info_prices['BIC']:.2f}")# Prever 2014Q1last_5_obs_prices = df_prices_estimation.iloc[-5:].valuesforecast_prices_2014Q1 = bvar_prices.forecast(last_5_obs_prices, steps=1)[0]# Calcular inflação trimestral (todas em log)inflation_rates = {}for idx, col inenumerate(df_prices_estimation.columns): last_value = df_prices_estimation[col].iloc[-1] inflation_rates[col] = (np.exp(forecast_prices_2014Q1[idx] - last_value) -1) *100# Exibir resultadosprint("\nInflação prevista para 2014Q1 (%):\n")for comp, inflation in inflation_rates.items():print(f"{comp:25s}: {inflation:+7.2f}%")# Salvar modelowithopen('bvar_prices_bayesian_model.pkl', 'wb') as f: pickle.dump(bvar_prices, f)
Critérios de Informação:
AIC: -95.13
BIC: -79.86
Inflação prevista para 2014Q1 (%):
Componente
Inflação
Consumption goods
+0.96%
Consumption services
+0.51%
Equipment
-0.20%
IPP
+0.01%
Structures
+1.51%
Residential
+0.80%
Exports goods
-0.06%
Exports services
+0.87%
Imports goods
+2.67%
Imports services
+0.73%
Federal govt
+0.73%
State/local govt
+0.85%
Inventories
+0.10%
Visualização das Previsões:
Previsões BVAR para Deflatores - 2014Q1
A figura mostra as previsões de inflação trimestral do BVAR para cada deflator de preço em 2014Q1 (log-levels). Note que a maioria dos deflatores mostra inflação positiva, com destaque para importações de bens (+2.67%) e estruturas (+1.51%).
4 Etapa 2: Equações Bridge
4.1 Conceito
As equações bridge conectam indicadores econômicos de alta frequência (mensais ou semanais) às subcomponentes trimestrais do PIB. Essas equações permitem que o modelo incorpore informações mais recentes conforme novos dados são divulgados.
4.2 Especificação Geral
Para cada subcomponente \(i\) do PIB, existe uma equação bridge da forma:
Esta é a estatística principal reportada pelo GDPNow (“nowcast” do crescimento do PIB).
7 Atualização e Revisão das Previsões
7.1 Calendário de Divulgação
O GDPNow é atualizado várias vezes ao longo do trimestre, conforme novos dados são divulgados:
Início do trimestre: apenas previsões BVAR (sem dados novos)
Durante o trimestre: incorporação de dados mensais (vendas, produção, comércio)
Final do trimestre: incorporação de dados semanais e indicadores de alta frequência
Após o trimestre: incorporação dos primeiros dados oficiais do BEA
7.2 Fontes de Revisão
As previsões do GDPNow podem mudar por três razões:
Novos dados para o trimestre atual: dados mensais mais recentes
Revisões de dados passados: o BEA frequentemente revisa estimativas anteriores
Re-estimação do modelo: o BVAR pode ser re-estimado com dados atualizados
7.3 Convergência
Historicamente, as previsões do GDPNow tendem a convergir para o valor oficial do BEA conforme o trimestre avança e mais dados se tornam disponíveis.
8 Vantagens e Limitações
8.1 Vantagens
Transparência: metodologia totalmente documentada e replicável
Atualização frequente: incorpora novos dados assim que disponíveis
Granularidade: fornece previsões para cada subcomponente, não apenas PIB agregado
Bottom-up: captura dinâmicas específicas de cada setor da economia
8.2 Limitações
Dependência de dados: qualidade da previsão depende da disponibilidade e precisão dos indicadores
Instabilidade inicial: no início do trimestre, quando há poucos dados, as previsões podem ser voláteis
Sem julgamento qualitativo: o modelo é puramente estatístico e não incorpora informações não quantificáveis
Revisões de dados: previsões podem mudar devido a revisões dos dados históricos pelo BEA
9 Implementação Prática
9.1 Dados Necessários
9.1.1 Para Estimação do BVAR (Etapa 1)
Séries históricas trimestrais das 13 subcomponentes do PIB real
Período: de 1968Q1 em diante (quanto mais longo, melhor)
Fonte: FRED (Federal Reserve Economic Data) ou BEA (Bureau of Economic Analysis)
9.1.2 Para Equações Bridge (Etapa 2)
Indicadores mensais relacionados a cada subcomponente
Correspondência conceitual: cada indicador deve ter relação econômica com sua subcomponente
Exemplo: vendas no varejo para consumo de bens
9.1.3 Para Nowcasting (Etapas 3 e 4)
Dados mais recentes dos indicadores mensais/semanais
Calendário de divulgação: saber quando cada dado será divulgado
Pesos das subcomponentes: valores nominais do trimestre anterior
9.2 Ferramentas Computacionais
A implementação do GDPNow requer:
Estimação VAR: pacotes de econometria (ex: statsmodels em Python, vars em R)
Filtro de Kalman: bibliotecas de espaço de estados (ex: statsmodels.tsa.statespace)
Coleta de dados: APIs do FRED, BEA, Census Bureau
Agregação: cálculos matriciais e manipulação de dados temporais
9.3 Fluxo de Trabalho
Setup inicial (uma vez):
Coletar dados históricos
Estimar BVAR e equações bridge
Calibrar filtro de Kalman
Atualização regular (quando novos dados são divulgados):
Baixar novos dados dos indicadores
Atualizar previsões das equações bridge
Rodar filtro de Kalman
Agregar para PIB total
Publicar nowcast atualizado
10 Conclusão
O GDPNow representa um avanço significativo em nowcasting do PIB por combinar:
Modelagem estrutural (BVAR captura relações econômicas entre subcomponentes)
Uso eficiente de dados (equações bridge conectam indicadores de alta frequência)
Rigor estatístico (filtro de Kalman combina informações de forma ótima)
Transparência e replicabilidade (metodologia completamente documentada)
A abordagem bottom-up permite não apenas prever o PIB agregado, mas também entender quais setores estão impulsionando ou freando o crescimento econômico, fornecendo insights valiosos para formuladores de política econômica e analistas de mercado.
11 Referências
Higgins, P. (2014). “GDPNow: A Model for GDP Nowcasting.” Federal Reserve Bank of Atlanta Working Paper 2014-7.
Federal Reserve Bank of Atlanta. GDPNow Methodology. Disponível em: https://www.atlantafed.org/cqer/research/gdpnow
Bureau of Economic Analysis (BEA). National Income and Product Accounts (NIPA).
Federal Reserve Economic Data (FRED). Federal Reserve Bank of St. Louis.