Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Explorando a base de dados de Fratto e Uhlig (2020)

0 votos
30 visitas
perguntada Mai 23 em Economia por Caio Oliveira Dantas (16 pontos)  
editado Jul 26 por Caio Oliveira Dantas

O artigo (https://bit.ly/3wx80wd) simula o modelo DSGE de Smets e Wouters (2007) e decompõe a inflação em sete choques para analisar a contribuição de cada um.
Segue abaixo o código para replicação, criado utilizando principalmente o pacote pydsge (https://github.com/gboehl/pydsge).

Os gráficos produzidos pelo código abaixo são usados no artigo para responder à questão de quais choques seriam os maiores responsáveis pelas flutuações da inflação. Fratto e Uhlig (2020) concluem que, de acordo com o modelo, as flutuações podem ser quase inteiramente atribuídas aos choques nos mark-ups de salário e de preços.

O arquivo com o modelo está disponível em https://github.com/gboehl/projectlib/blob/master/yamls/rank.yaml
A única alteração realizada neste arquivo foi o prior do parâmetro \(\bar{\gamma}\) para igualar os valores utilizados nos artigos originais.

A base de dados foi retirada de https://bit.ly/3hJUDV5, mas foi necessária a conversão do formato, além da criação de uma coluna de datas e a renomeação das demais colunas. Esses ajustes não foram incluídos no código abaixo, mas posso disponibilizar a base já ajustada a quem se interessar.

from IPython import get_ipython
get_ipython().run_line_magic('matplotlib', 'inline')

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pydsge import *
from grgrlib import pplot
//importa o modelo
yaml_file = 'C:\\Users\\Samsung\\anaconda3\\lib\\site-packages\\pydsge\\examples\\rank.yaml'
//importa dados
df = pd.read_excel('C:\\Users\\Samsung\\anaconda3\\lib\\site-packages\\pydsge\\examples\\datasw.xlsx', parse_dates=[0], index_col=[0])
//designa a classe DSGE
mod = DSGE.read(yaml_file)
//carrega parâmetros calibrados
par = mod.set_par('calib')




// acrescenta os dados ao modelo
mod.load_data(df)
// especifica o tipo de filtro
mod.set_par('calib')
mod.create_filter(N=500, seed=0)
// cria matriz de erros de medida proporcionais ao desvio-padrão de cada variável
mod.filter.R = mod.create_obs_cov(1e-1)
// índice da taxa de juros
ind = mod.observables.index('FFR')
// atribui um valor próximo de 0 ao erro de medida da taxa de juros
mod.filter.R[ind,ind] = 1e-4
// passa o filtro
FX = mod.run_filter(verbose=True, smoother=True)



// extrai choques
epd = mod.extract(nsamples=20)


// Cria mascara
msk0 = mod.mask
// Zera todos os choques, menos o de produtividade
msk0['e_z']['1947-07-23':] = 0
msk0['e_u']['1947-07-23':] = 0
msk0['e_r']['1947-07-23':] = 0
msk0['e_i']['1947-07-23':] = 0
msk0['e_p']['1947-07-23':] = 0
msk0['e_w']['1947-07-23':] = 0



cfs0 = mod.simulate(epd, mask=None)[0] # simula com todos os choques
cfs1 = mod.simulate(epd, mask=msk0)[0] # simula só com o choque especificado

// gráfico
v = mod.vix('Pi')
fig, ax, _ = pplot((cfs0[...,v], cfs1[...,v]), mod.data.index, labels="Total factor productivity", styles=('-','--'))

//o restante do código repete o trecho acima para os demais choques

msk0 = mod.mask
msk0['e_g']['1947-07-23':] = 0
msk0['e_u']['1947-07-23':] = 0
msk0['e_r']['1947-07-23':] = 0
msk0['e_i']['1947-07-23':] = 0
msk0['e_p']['1947-07-23':] = 0
msk0['e_w']['1947-07-23':] = 0


cfs1 = mod.simulate(epd, mask=msk0)[0] # simula só com o choque especificado

v = mod.vix('Pi')
fig, ax, _ = pplot((cfs0[...,v], cfs1[...,v]), mod.data.index, labels="Risk premium", styles=('-','--'))


msk0 = mod.mask
msk0['e_g']['1947-07-23':] = 0
msk0['e_z']['1947-07-23':] = 0
msk0['e_r']['1947-07-23':] = 0
msk0['e_i']['1947-07-23':] = 0
msk0['e_p']['1947-07-23':] = 0
msk0['e_w']['1947-07-23':] = 0



cfs1 = mod.simulate(epd, mask=msk0)[0] # simula só com o choque especificado

v = mod.vix('Pi')
fig, ax, _ = pplot((cfs0[...,v], cfs1[...,v]), mod.data.index, labels="Government expenditure", styles=('-','--'))


msk0 = mod.mask
msk0['e_g']['1947-07-23':] = 0
msk0['e_z']['1947-07-23':] = 0
msk0['e_u']['1947-07-23':] = 0
msk0['e_i']['1947-07-23':] = 0
msk0['e_p']['1947-07-23':] = 0
msk0['e_w']['1947-07-23':] = 0


cfs1 = mod.simulate(epd, mask=msk0)[0] # simula só com o choque especificado

v = mod.vix('Pi')
fig, ax, _ = pplot((cfs0[...,v], cfs1[...,v]), mod.data.index, labels='Investment-specific technology', styles=('-','--'))


msk0 = mod.mask
msk0['e_g']['1947-07-23':] = 0
msk0['e_z']['1947-07-23':] = 0
msk0['e_u']['1947-07-23':] = 0
msk0['e_r']['1947-07-23':] = 0
msk0['e_p']['1947-07-23':] = 0
msk0['e_w']['1947-07-23':] = 0


cfs1 = mod.simulate(epd, mask=msk0)[0] # simula só com o choque especificado

v = mod.vix('Pi')
fig, ax, _ = pplot((cfs0[...,v], cfs1[...,v]), mod.data.index, labels="Monetary policy", styles=('-','--'))


msk0 = mod.mask
msk0['e_g']['1947-07-23':] = 0
msk0['e_z']['1947-07-23':] = 0
msk0['e_u']['1947-07-23':] = 0
msk0['e_r']['1947-07-23':] = 0
msk0['e_i']['1947-07-23':] = 0
msk0['e_w']['1947-07-23':] = 0


cfs1 = mod.simulate(epd, mask=msk0)[0] # simula só com o choque especificado

v = mod.vix('Pi')
fig, ax, _ = pplot((cfs0[...,v], cfs1[...,v]), mod.data.index, labels='Price mark-up', styles=('-','--'))


msk0 = mod.mask
msk0['e_g']['1947-07-23':] = 0
msk0['e_z']['1947-07-23':] = 0
msk0['e_u']['1947-07-23':] = 0
msk0['e_r']['1947-07-23':] = 0
msk0['e_i']['1947-07-23':] = 0
msk0['e_p']['1947-07-23':] = 0


cfs1 = mod.simulate(epd, mask=msk0)[0] # simula só com o choque especificado

v = mod.vix('Pi')
fig, ax, _ = pplot((cfs0[...,v], cfs1[...,v]), mod.data.index, labels='Wage mark-up', styles=('-','--'))


msk0 = mod.mask
msk0['e_g']['1947-07-23':] = 0
msk0['e_z']['1947-07-23':] = 0
msk0['e_u']['1947-07-23':] = 0
msk0['e_r']['1947-07-23':] = 0
msk0['e_i']['1947-07-23':] = 0


cfs1 = mod.simulate(epd, mask=msk0)[0] # simula só com os choques especificados

v = mod.vix('Pi')
fig, ax, _ = pplot((cfs0[...,v], cfs1[...,v]), mod.data.index, labels='Price and wage mark-up', styles=('-','--'))
Compartilhe
comentou Jun 1 por danielcajueiro (5,486 pontos)  
A pergunta precisa ser colocada na resposta. Note que em caso contrario a pergunta fica sem resposta.

Entre ou cadastre-se para responder esta pergunta.

...