Como construir um Vetor Autoregressivo Estrutural (SVAR) no Python?

Como construir um Vetor Autoregressivo Estrutural (SVAR) no Python?

O modelo Vetor Autoregressivo Estrutural, conhecido como SVAR, tem como objetivo permitir a identificação e interpretação de choques estruturais — como um choque de política monetária ou de oferta — e seus impactos dinâmicos sobre variáveis macroeconômicas. A construção de um SVAR parte da estimação de um modelo VAR tradicional, seguido da imposição de restrições identificadoras com base em fundamentos econômicos.

Para obter o código e o tutorial deste exercício faça parte do Clube AM e receba toda semana os códigos em R/Python, vídeos, tutoriais e suporte completo para dúvidas.

A forma reduzida de um modelo VAR(p) pode ser representada da seguinte maneira:

    \[Y_t = A_1 Y_{t-1} + A_2 Y_{t-2} + \dots + A_p Y_{t-p} + u_t\]

onde Y_t é um vetor com n variáveis endógenas, A_i são as matrizes de coeficientes e u_t representa o vetor de erros. A chave do SVAR está na suposição de que esses erros são combinações lineares de choques estruturais \varepsilon_t, ou seja:

    \[u_t = B \varepsilon_t\]

com B sendo a matriz de impacto contemporâneo e \varepsilon_t \sim N(0, I), implicando que os choques estruturais são ortogonais entre si. O objetivo da modelagem é justamente estimar essa matriz B, que captura como cada choque afeta diretamente as variáveis no mesmo período.

Objetivo do exercício:

  • Preparar os dados macroeconômicos para análise, aplicando diferenciação para garantir estacionariedade.
  • Estimar um modelo VAR com seleção automática da ordem de defasagem.
  • Estruturar e identificar um modelo SVAR com base em restrições econômicas.
  • Gerar e interpretar funções de impulso-resposta (IRFs) a choques estruturais.
  • Analisar a matriz estrutural estimada para entender os impactos contemporâneos dos choques.

A seguir, implementamos esse processo em Python utilizando a biblioteca statsmodels.

1. Preparação dos dados

Neste exemplo, partimos de uma base contendo variáveis mensais da economia brasileira: PIB, IPCA e a taxa Selic. Os dados são trimestralizados e diferenciados para garantir estacionariedade antes da estimação do VAR.

desem ipca juros
Data
2002-07-01 -0.9 1.13 0.1325
2002-10-01 -2.5 3.87 0.5691
2003-01-01 2.3 -1.38 0.6495
2003-04-01 3.3 -3.62 0.1150
2003-07-01 0.5 -0.11 -0.1557

2. Estimação do modelo VAR

Com os dados estacionários, o próximo passo é a estimação do modelo VAR, que será a base para a estruturação do SVAR. Utilizamos critérios de informação para escolher a ordem de defasagem adequada.

Através de uma função do próprio statsmodels, conseguimos obter a seguinte tabela abaixo:

VAR Order Selection (* highlights the minimums)

==================================================
       AIC         BIC         FPE         HQIC   
--------------------------------------------------
0       -2.711      -2.584     0.06648      -2.665
1       -3.179      -2.673     0.04170      -2.996
2       -4.216     -3.329*     0.01493      -3.895
3       -4.562      -3.295     0.01079      -4.104
4       -4.567      -2.920     0.01118      -3.972
5       -4.464      -2.437     0.01327      -3.731
6       -4.342      -1.936     0.01669      -3.472
7       -4.748      -1.961     0.01307      -3.740
8       -5.043      -1.876     0.01235      -3.898
9       -5.495      -1.949     0.01120      -4.213
10     -6.357*      -2.430   0.008146*     -4.937*
--------------------------------------------------

Pelos resultados, vemos que para o critério AIC o número ótimo é de 10 defasagens, para o BIC 2 defasagens, FPE 10 defasgens e HQ 10 defasagens. Prosseguimos escolhendo 2 defasagens conforme BIC.
  Summary of Regression Results   
==================================
Model:                         VAR
Method:                        OLS
Date:           Tue, 15, Apr, 2025
Time:                     09:53:58
--------------------------------------------------------------------
No. of Equations:         3.00000    BIC:                   -2.61454
Nobs:                     48.0000    HQIC:                  -3.12382
Log likelihood:          -100.931    FPE:                  0.0324872
AIC:                     -3.43319    Det(Omega_mle):       0.0215947
--------------------------------------------------------------------
Results for equation desem
===========================================================================
              coefficient       std. error           t-stat            prob
---------------------------------------------------------------------------
const           -0.454634         0.211205           -2.153           0.031
L1.desem         0.075242         0.124081            0.606           0.544
L1.ipca          0.413278         0.237908            1.737           0.082
L1.juros        -2.734034         0.720204           -3.796           0.000
L2.desem        -0.306499         0.126321           -2.426           0.015
L2.ipca          0.549238         0.223798            2.454           0.014
L2.juros         3.399131         0.729298            4.661           0.000
===========================================================================

Results for equation ipca
===========================================================================
              coefficient       std. error           t-stat            prob
---------------------------------------------------------------------------
const           -0.262259         0.091059           -2.880           0.004
L1.desem        -0.185704         0.053497           -3.471           0.001
L1.ipca         -0.279042         0.102572           -2.720           0.007
L1.juros        -0.086323         0.310510           -0.278           0.781
L2.desem        -0.115456         0.054462           -2.120           0.034
L2.ipca         -0.552082         0.096489           -5.722           0.000
L2.juros        -0.617637         0.314431           -1.964           0.049
===========================================================================

Results for equation juros
===========================================================================
              coefficient       std. error           t-stat            prob
---------------------------------------------------------------------------
const           -0.037054         0.035888           -1.032           0.302
L1.desem        -0.028235         0.021084           -1.339           0.181
L1.ipca          0.034067         0.040426            0.843           0.399
L1.juros         0.544050         0.122378            4.446           0.000
L2.desem         0.017286         0.021465            0.805           0.421
L2.ipca          0.150890         0.038028            3.968           0.000
L2.juros        -0.195683         0.123923           -1.579           0.114
===========================================================================

Correlation matrix of residuals
            desem      ipca     juros
desem    1.000000 -0.422901 -0.016842
ipca    -0.422901  1.000000  0.163622
juros   -0.016842  0.163622  1.000000

3. Construção do modelo SVAR

Para identificar o modelo, impomos restrições sobre a matriz A. Quando não impomos restrições sobre a matriz B, assumimos que a matriz de covariância dos erros estruturais é a identidade I, ou seja, não há restrições estruturais sobre os choques, apenas sobre os efeitos contemporâneos entre as variáveis.

desem ipca juros
desem 1.496835 -0.272918 -0.004284
ipca -0.272918 0.278236 0.017943
juros -0.004284 0.017943 0.043219

A matriz de covariância mostra que os valores fora da diagonal são diferentes de zero, implicando que A≠I. Dessa forma, a especificação reduzida pode não ser a mais correta. Assim, de modo a incluir efeitos contemporâneos, devemos impor uma diferente estrutura para a matriz A. Para isso, vamos supor que o desemprego é afetado somente pela taxas de juros contemporaneamente, e que a inflação é afetada pelo desemprego contemporaneamente.

Finalmente, assumimos que a taxa de juros é determinada somente por defasagens das outras variáveis. Esta última hipótese também pode ser interpretada como o Banco Central não sendo capaz de observar o nível de desemprego e preços no mesmo instante que irá determinar a taxa de juros. Assim, nossa matriz A deveria ser algo como

    \[A = \begin{bmatrix} 1 & 0 & \alpha\\ \alpha & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}. \nonumber\]

Abaixo estimamos o modelo estrutural e obtemos os IRFs impondo a restrição acima.

VAR Order Selection (* highlights the minimums)

==================================================
       AIC         BIC         FPE         HQIC   
--------------------------------------------------
0       -2.711      -2.584     0.06648      -2.665
1       -3.179      -2.673     0.04170      -2.996
2       -4.216     -3.329*     0.01493      -3.895
3       -4.562      -3.295     0.01079      -4.104
4       -4.567      -2.920     0.01118      -3.972
5       -4.464      -2.437     0.01327      -3.731
6       -4.342      -1.936     0.01669      -3.472
7       -4.748      -1.961     0.01307      -3.740
8       -5.043      -1.876     0.01235      -3.898
9       -5.495      -1.949     0.01120      -4.213
10     -6.357*      -2.430   0.008146*     -4.937*
--------------------------------------------------

4. Respostas a impulso (IRFs) no SVAR

A Função de Resposta ao Impulso (IRF) apresentada estima o impacto de um choque na taxa de juros sobre o desemprego, a inflação (IPCA) e a própria taxa de juros ao longo do tempo. Importante relembrar que os dados estão em primeira diferença.

É importante ressaltar que esse exercício foi construído com o objetivo didático de mostrar como estruturar e estimar um modelo SVAR no Python. O modelo utilizado conta com apenas três variáveis e uma defasagem, o que limita sua capacidade de capturar as interações reais e complexas da economia.

irf svar

5. Interpretação da matriz estrutural do SVAR

A matriz B, estimada a partir do modelo, expressa como os choques estruturais impactam contemporaneamente as variáveis do sistema. Sua interpretação depende da ordem assumida das variáveis no vetor Y_t.

Matriz B estimada:
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

O exercício acima permite construir um modelo SVAR simples, mas completo, no Python. A escolha da ordem das variáveis, bem como o tipo de identificação adotada, deve sempre seguir uma lógica econômica clara e bem fundamentada. Isso garante que as inferências feitas a partir do modelo tenham validade causal.

Quer aprender mais?

Conheça nossa Formação do Zero à Análise de Dados Econômicos e Financeiros usando Python e Inteligência Artificial. Aprenda do ZERO a coletar, tratar, construir modelos e apresentar dados econômicos e financeiros com o uso de Python e IA.


Referências:

  • Lütkepohl, H. (2005). New Introduction to Multiple Time Series Analysis.
  • Enders, W. (2014). Applied Econometric Time Series.
  • Statsmodels documentation - VAR

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Como choques inflacionários afetam a previsão da Selic?

Como mensurar a importância de choques na inflação sobre o erro de previsão da taxa de juros? Neste exercício quantificamos esta pergunta sob a ótica de um modelo VAR, usando dados recentes da macroeconomia brasileira. Especificamente, estimamos a decomposição da variância dos erros de previsão do modelo, analisando choques na inflação da gasolina e sua importância sobre a variância dos erros de previsão da taxa Selic.

Modelo de previsão para o preço da gasolina

Neste exercício exploramos os dados públicos sobre o preço da gasolina no Brasil, sua composição, evolução temporal, políticas associadas e, por fim, construímos um modelo simples de previsão. Com um modelo em mãos, o analista pode cenarizar o comportamento futuro da série da forma como preferir. Todos os procedimentos foram feitos usando a linguagem de programação Python.

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.