English · Português

Replicações

Cada replicação parte de um artigo e da calibração que ele publica, e o código desta página confere um número do artigo. O que o sistema resolvido não reproduz fica registrado ao lado do número.

dsgelab

O que conta como replicação

Aqui, uma replicação usa as equações e a calibração do artigo e compara o resultado com um número publicado ou com uma solução fechada. O bloco de cada replicação é executado por tools/check_site_examples.py.

Os exemplos didáticos do Dynare (Collard, Pfeifer) ficam na tabela de validação da página do pacote. São arquivos de tutorial, e lá a comparação é feita com a solução do Dynare, variável a variável.

Heutel (2012), Review of Economic Dynamics

Garth Heutel, How should environmental policy respond to business cycles? Optimal policy under persistent productivity shocks, Review of Economic Dynamics 15, 244–264, 10.1016/j.red.2011.05.002. A implementação está em dsgelab.examples.heutel e em docs/heutel.md. O sistema resolvido é o linear do código MATLAB do autor, e o Klein/QZ do pacote faz o papel do Anderson–Moore. O modelo não linear, que daria segunda ordem e previsão perfeita, não está neste exemplo.

Tabela 2 e o impulso de 1%

A Tabela 2, p. 251, traz α = 0,36, β = 0,98267, δ = 0,025, ρ = 0,95, σε = 0,007, η = 0,9979, θ₁ = 0,05607, θ₂ = 2,8 e 1 − γ = 0,696. O texto da p. 250 traz β = 0,98627, e o exemplo segue a tabela e os scripts. A seção 4.1 simula uma inovação de 1% e descreve o pico do consumo por volta do período 15 e, na frase seguinte, o pico do capital “around period 40 (year 6)”. Num modelo trimestral, o sexto ano corresponde ao horizonte 24. Na série resolvida, o capital atinge o máximo no horizonte 25 e o consumo, no 15. Este sistema não produz o pico no período 40, e o exemplo não desloca a série para coincidir com ele.

A álgebra escalar da implementação é traduzida dos arquivos MATLAB de Heutel, que não declaram licença, e por isso o pacote não a distribui. Executado uma vez, heutel.fetch() baixa a cópia pública do repositório da Georgia State University, confere cada arquivo com o SHA-256 dos arquivos com que a implementação foi validada e grava a tradução num diretório de cache.

import numpy as np
from dsgelab.examples import heutel

heutel.fetch()    # uma vez por máquina: baixa, confere e traduz os arquivos de Heutel
p = heutel.Params()
assert p.alpha == 0.36 and p.beta == 0.98267 and p.delta == 0.025
assert p.rho == 0.95 and p.sd == 0.007 and p.eta == 0.9979
assert p.theta1 == 0.05607 and p.theta2 == 2.8
assert abs((1 - p.gamma) - 0.696) < 1e-12

ss = heutel.steady_levels("tax", p)
assert abs(ss["lambda"]) < 1e-10          # multiplicador de Ramsey no estado estacionário
assert 0 < ss["mu"] < 1 and ss["c"] > 0 and ss["e"] > 0

sol = heutel.solve("tax", p)
irf = sol.irf("eps_a", size=0.01, periods=100, percent=False)
assert np.max(np.abs(irf["a"] - 0.01 * p.rho ** np.arange(100))) < 1e-12
gap = ss["c"]*irf["c"] + ss["i"]*irf["i"] + ss["z"]*irf["z"] - ss["y"]*irf["y"]
assert np.max(np.abs(gap)) < 1e-10        # recursos ao longo do impulso
assert int(np.argmax(irf["c"])) == 15
assert int(np.argmax(irf["k"])) == 25
print(ss["k"], ss["y"], ss["mu"], int(np.argmax(irf["k"])))

Informação defasada, p. 262

Quando o governo escolhe o instrumento antes de observar o estado, o artigo substitui a condição de primeira ordem por τt = d · yt−1 e qt = d · yt−1. O artigo publica d = 1,415 para o imposto e 0,658 para a cota, e os scripts trazem 1,4151 e 0,6580. Como o produto defasado ainda está no estado estacionário no período do choque, o instrumento não se move nesse período.

tax = heutel.Params.source("tax_asym")
quota = heutel.Params.source("quota_asym")
assert round(tax.policy_slope, 3) == 1.415
assert round(quota.policy_slope, 3) == 0.658

irf_tax = heutel.solve("tax_asym", tax).irf("eps_a", size=0.01, periods=100, percent=False)
assert abs(irf_tax["tau"][0]) < 1e-10
assert np.max(np.abs(irf_tax["tau"][1:] - tax.policy_slope * irf_tax["y"][:-1])) < 1e-10

irf_q = heutel.solve("quota_asym", quota).irf("eps_a", size=0.01, periods=100, percent=False)
assert abs(irf_q["q"][0]) < 1e-10
assert np.max(np.abs(irf_q["q"][1:] - quota.policy_slope * irf_q["y"][:-1])) < 1e-10
assert np.max(np.abs(irf_q["e"] - irf_q["q"])) < 1e-10
print(tax.policy_slope, quota.policy_slope)

A calibração literal do planejador nos scripts, θ₂ = 0,1 e γ = 0,8, é o caso de sensibilidade da p. 258 e não produz estado estacionário admissível, de modo que heutel.solve("planner") levanta heutel.SteadyStateError, definida em dsgelab.examples.heutel e distinta de dsgelab.SteadyStateError. Para o caso-base da Tabela 2, chame heutel.solve("planner", heutel.Params()).

Crescimento estocástico com solução fechada

Brock e Mirman (1972, Journal of Economic Theory) formulam o crescimento ótimo sob incerteza. Com utilidade logarítmica e depreciação total a regra de um setor é exata, k′ = αβ a kα, e a solução log-linear é P = [[α, 1], [0, ρ]], F = [α, 1]. A versão com vários setores, a mesma utilidade e a mesma depreciação, é Long e Plosser (1983, Journal of Political Economy). O exemplo é o caso de um setor.

No processo log a′ = ρ log a + ε, o coeficiente de segunda ordem sobre a tecnologia, hσσ, é igual a σ², e a correção que ele acrescenta à regra, σ²/2, é o termo de Jensen que a aproximação de Schmitt-Grohé e Uribe (2004, Journal of Economic Dynamics and Control) tem de devolver. Como o capital obedece à regra exata em todos os estados, seu coeficiente é nulo. As tabelas numéricas daquele artigo vêm de outro modelo.

import numpy as np
import dsgelab as dsg
from dsgelab.examples import rbc

model, params, guess = rbc.build()
sol = dsg.solve(model, params, guess=guess)
exact = rbc.closed_form(params)
assert np.allclose(sol.P, exact["P"]) and np.allclose(sol.F, exact["F"])

sigma = 0.007
so = dsg.solve_second_order(sol, cov={"eps_a": sigma})
i_a = model.states.index("a")
i_k = model.states.index("k")
assert abs(so.h_ss[i_a] - sigma ** 2) < 1e-8
assert abs(so.h_ss[i_k]) < 1e-8
print(sol.P, so.h_ss[i_a])

Princípio de Taylor

Clarida, Galí e Gertler (2000, Quarterly Journal of Economics 115, 147–180) mostram que, sob uma regra de juros prospectiva, o equilíbrio só é determinado se a resposta à inflação esperada for maior que um. O exemplo usa uma versão contemporânea da regra, i = φπ π + φx x, no modelo de três equações com φπ = 1,5, φx = 0,125 e β = 0,99, cujo equilíbrio é determinado. Com φπ = 0,8 o mesmo sistema é recusado com BlanchardKahnError. Nesta versão, um φx positivo põe a fronteira um pouco abaixo de 1, em cerca de 0,9875, e 0,8 está do lado indeterminado. O código confere esse limiar e não reproduz a tabela de coeficientes estimados do artigo.

from dataclasses import replace
import dsgelab as dsg
from dsgelab.examples import nk

model, params, guess = nk.build()
assert params.phi_pi == 1.5 and params.phi_x == 0.125 and params.beta == 0.99
sol_nk = dsg.solve(model, params, guess=guess)
assert sol_nk.klein.n_stable == model.n_states

below = replace(params, phi_pi=0.8)
try:
    dsg.solve(model, below, guess=guess)
    raised = False
except dsg.BlanchardKahnError:
    raised = True
assert raised
print(sol_nk.klein.n_stable, raised)

Fora desta página

ArtigoPor que não está aqui
Smets e Wouters (2007), American Economic Review O pacote já tem a verossimilhança, o filtro de Kalman e a estimação bayesiana, mas a replicação ainda não foi feita.
Schmitt-Grohé e Uribe (2003), pequena economia aberta O modelo ainda não está no pacote. O artigo de 2004 aparece nesta página só pelo termo σ² do AR(1) lognormal.