Skip to content

🇬🇧 English · 🇪🇸 Español

Ecuaciones agregadas HANK editables

El puente HANK de archivos .mod conserva su cierre neokeynesiano incorporado por defecto. Use closure="model" para resolver las ecuaciones agregadas del archivo. Este modo optativo combina ecuaciones afines homogéneas en desviaciones de niveles con respuestas del hogar mapeadas explícitamente. model(linear) expresa esa intención; el parser también reconoce bloques model afines.

import numpy as np
from puremacro.dsge.hank import solve_hank_bridge

source = """
var Y C r pi i;
varexo monetary government;
parameters beta gamma r_ss phi_pi kappa;
beta=.985; gamma=1; r_ss=.01; phi_pi=1.5; kappa=.1;
hetagent_block; model=one_asset_hank; n_a=30; a_max=30; end;
model(linear);
Y=C+government;
pi=beta*pi(+1)+kappa*Y;
i=.3*i(-1)+phi_pi*pi+monetary;
r=i-pi(+1);
end;
"""
T = 12
result = solve_hank_bridge(
    source, horizon=T, closure="model",
    household_inputs={"r": "r", "Y": "Y"},
    household_outputs={"C": "C"},
    shock_paths={"monetary": -.002*.6**np.arange(T),
                 "government": .001*.4**np.arange(T)},
)
assert result.converged
assert result.diagnostics["aggregate_residual_max_abs"] < 1e-9
print(result.transition_paths.head())

Cada mapeo va de un nombre del hogar a un nombre agregado declarado. Los insumos pueden apuntar a variables endógenas o choques exógenos; los productos deben apuntar a endógenas distintas. Al añadir una identidad de respuesta por producto del hogar, debe haber exactamente una ecuación por variable endógena. Nombres no admitidos, destinos duplicados, constantes no homogéneas y expresiones no lineales producen errores explícitos. Las variables sin resolver no se rellenan con ceros. Por ejemplo, para desviaciones escriba i=phi_pi*pi+monetary, no i=r_ss+phi_pi*pi+monetary.

shock_paths contiene arreglos finitos de exactamente horizon observaciones; los choques declarados que se omiten son cero. Sin este argumento, el shock declarado recibe magnitude*rho**arange(horizon). En este modo el nombre del choque determina qué ecuación afecta. Las desviaciones endógenas y exógenas antes de 0 y después de T-1 son cero. Es una condición de frontera de horizonte finito: amplíe el horizonte y compare trayectorias si importa el efecto terminal.

El solver comprueba rango completo y evalúa independientemente las ecuaciones originales y las identidades del hogar después de resolver. Los diagnósticos incluyen rango, dimensión, número de condición y ambos residuos máximos. Rango completo significa resolubilidad a horizonte finito, no determinación de Blanchard–Kahn, unicidad del equilibrio a horizonte infinito ni precisión de la malla del hogar. closure_tol controla el umbral absoluto de aceptación (por defecto 1e-9). No se sustituye silenciosamente una pseudoinversa ni regularización. Se ensambla una matriz densa de tamaño (variables*horizon)**2; empiece con horizontes moderados.

Unidades y fechas del hogar

Todos los insumos y productos son desviaciones de niveles; las tasas usan el mismo período y unidades de su calibración. No son porcentajes ni desviaciones logarítmicas. El mapeo cambia nombres sin reescalar coordenadas.

Hogar Insumos disponibles Productos disponibles Convención
Incorporado de un activo r, Y C r es la tasa ex ante realizada el siguiente período; Y cambia el salario bruto por w_ss/C_ss, conservando el impuesto sobre intereses de presupuesto equilibrado.
Incorporado de dos activos r_b, r_a, Y C, D, A, B, CHI, z Tasas ex ante; ingreso no financiero cerrado como producto menos retornos de activos heredados. A y B son decisiones de ahorro.
dp.Model o DPSolution declarativo Insumos declarados admitidos Expresiones agregadas declaradas y alias admitidos Unidades y fechas originales de los precios del hogar; sin ecuación fiscal adicional ni reescalamiento salarial.

En un hogar declarativo, A="a" mide activos al entrar al período y S="a(+1)" mide ahorro elegido en ese período. Esas fechas se conservan al mapear variables agregadas. Especifique explícitamente salarios, política fiscal, mercados de activos y precios en el bloque agregado. Un DPSolution ya resuelto fija además la calibración que genera los jacobianos.

Los cierres incorporados siguen disponibles para comparar. Las opciones exclusivas de ecuaciones editables se rechazan con closure="builtin".

Equilibrio con hogares no lineales

Con los mismos mapeos, nonlinear=True reemplaza las identidades lineales del hogar por transiciones exactas de políticas hacia atrás y distribución hacia adelante. Las ecuaciones agregadas siguen siendo afines y homogéneas en desviaciones. Se admiten hogares incorporados y declarativos de uno y dos activos; no es un lenguaje de ecuaciones agregadas no lineales arbitrarias.

nonlinear = solve_hank_bridge(
    source, horizon=T, closure="model", nonlinear=True,
    household_inputs={"r": "r", "Y": "Y"},
    household_outputs={"C": "C"},
    shock_paths={"monetary": -.002*.6**np.arange(T)},
    closure_tol=1e-9, closure_max_iter=100,
)
assert nonlinear.converged
assert nonlinear.diagnostics["household_budget_max_abs"] < 1e-8
assert nonlinear.diagnostics["distribution_mass_max_abs"] < 1e-10

La solución lineal inicializa iteraciones de Broyden amortiguadas. Si esa aproximación inicial es inviable, se intenta con desviaciones endógenas cero. Cada paso debe reducir la norma del residuo y conservar presupuestos factibles y la masa de la distribución. Se rechazan trayectorias con piso de consumo activo. La distribución inicial y la continuación terminal del hogar corresponden al estado estacionario calibrado; las tasas ex ante incluyen el retorno realizado en la fecha terminal. Los hogares declarativos conservan sus fechas originales de realización de los insumos.

Los diagnósticos informan iteraciones, historia de residuos, errores finales de presupuesto y masa, y motivo de terminación. Si falla la convergencia, se advierte y devuelve la última trayectoria con converged=False, sin sustituirla por la respuesta lineal. Si un insumo exógeno hace inviable incluso la trayectoria inicial, se produce ValueError. La convergencia numérica no certifica unicidad del equilibrio, convergencia de malla ni una auditoría independiente de Euler. El contexto privado conserva las respuestas agregadas finales del hogar sin ejecutar otro solver.

Paneles de hogares con dos activos

Un hogar de dos activos resuelto por EGM admite la interfaz habitual de panel:

# sol is a two-asset DPSolution, with declared assets a and b.
panel = sol.simulate(
    n_agents=1000, periods=40, seed=2026, burn_in=10,
    record=["a", "b", "a(+1)", "b(+1)", "c"],
)
microdata = panel.to_microframe(t=20)

Ambas decisiones de activos se interpolan bilinealmente y siguen siendo continuas. El consumo y los costos de ajuste registrados se calculan con el presupuesto y las decisiones efectivas, no interpolando aparte una tabla de consumo. La productividad sigue la cadena de Markov resuelta. La misma semilla reproduce exactamente el panel y su calentamiento; se admite declarar los activos en orden inverso. Los valores iniciales pueden estar entre nodos; los que exceden la malla se recortan con una advertencia.

La inicialización estacionaria muestrea la distribución conjunta resuelta. Las políticas continuas posteriores no tienen por qué preservar exactamente la distribución de la lotería discretizada: compare momentos simulados con sol.mean(...) y refine la malla cuando esa aproximación importe. Son paneles bajo políticas estacionarias, no paneles de una transición de equilibrio general.