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

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

0 votos
12 visitas
perguntada Mai 23 em Economia por Caio Oliveira Dantas (16 pontos)  
editado Mai 24 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).

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 getipython
get
ipython().runlinemagic('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.readexcel('C:\\Users\\Samsung\\anaconda3\\lib\\site-packages\\pydsge\\examples\\datasw.xlsx', parsedates=[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.setpar('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.createobscov(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['ez']['1947-07-23':] = 0
msk0['e
u']['1947-07-23':] = 0
msk0['er']['1947-07-23':] = 0
msk0['e
i']['1947-07-23':] = 0
msk0['ep']['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['eg']['1947-07-23':] = 0
msk0['e
u']['1947-07-23':] = 0
msk0['er']['1947-07-23':] = 0
msk0['e
i']['1947-07-23':] = 0
msk0['ep']['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['eg']['1947-07-23':] = 0
msk0['e
z']['1947-07-23':] = 0
msk0['er']['1947-07-23':] = 0
msk0['e
i']['1947-07-23':] = 0
msk0['ep']['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['eg']['1947-07-23':] = 0
msk0['e
z']['1947-07-23':] = 0
msk0['eu']['1947-07-23':] = 0
msk0['e
i']['1947-07-23':] = 0
msk0['ep']['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['eg']['1947-07-23':] = 0
msk0['e
z']['1947-07-23':] = 0
msk0['eu']['1947-07-23':] = 0
msk0['e
r']['1947-07-23':] = 0
msk0['ep']['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['eg']['1947-07-23':] = 0
msk0['e
z']['1947-07-23':] = 0
msk0['eu']['1947-07-23':] = 0
msk0['e
r']['1947-07-23':] = 0
msk0['ei']['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['eg']['1947-07-23':] = 0
msk0['e
z']['1947-07-23':] = 0
msk0['eu']['1947-07-23':] = 0
msk0['e
r']['1947-07-23':] = 0
msk0['ei']['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['eg']['1947-07-23':] = 0
msk0['e
z']['1947-07-23':] = 0
msk0['eu']['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,581 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.

...