Skip to content

Reducir los controles de los hogares antes de resolver el equilibrio HANK

solve_hank_reduced_policy comprime las desviaciones de los valores marginales junto con los estados de la distribución. Aplica las derivadas de los hogares a las direcciones retenidas y construye las matrices de equilibrio en coordenadas reducidas. La ruta de dos activos nunca construye la caché anterior de derivadas completas de los hogares.

La solución estacionaria, los pasos hacia atrás con grilla endógena, las restricciones activas sobre activos y el transporte de probabilidades conservan la grilla completa. La aproximación local de primer orden incluye una continuación estocástica infinita. No calcula un cambio precautorio del estado estacionario, una política global ni bienestar de segundo orden.

import numpy as np
from puremacro.models import calibrate_one_asset_hank
from puremacro.models.hank_reduction import solve_hank_reduced_policy

steady = calibrate_one_asset_hank()  # 500 puntos de activos, 7 estados de ingreso
policy = solve_hank_reduced_policy(
    steady, distribution_rank=96, marginal_rank=128, krylov_steps=96,
    rho=0.7, shock_std=0.0001,
)
linear = policy.simulate(np.r_[-1e-5, np.zeros(39)])
audit = policy.audit(np.r_[-1e-5, np.zeros(9)], tolerance=1e-5)
print(policy.diagnostics)
print(audit.converged, audit.diagnostics)

La base de la distribución preserva la masa, las marginales estacionarias del ingreso y las direcciones observables de mercado del solucionador recursivo. La base marginal contiene las respuestas independientes a los precios agregados actuales. Las demás direcciones se obtienen mediante aplicaciones repetidas de la respuesta marginal hacia atrás y una SVD. Esto incluye respuestas a precios anticipados sin ajustar los coeficientes de política de equilibrio. Como alternativa, marginal_snapshots admite valores marginales positivos de la grilla completa con forma (observaciones, numero_de_marginales); las respuestas a precios actuales siguen siendo obligatorias.

El rango marginal solicitado se limita al espacio independiente de entrenamiento y se registra el rango efectivo. krylov_steps controla el horizonte de entrenamiento, que también debe comprobarse al refinar el rango. marginal_rank=None conserva todos los controles para comparaciones pequeñas. El límite de dimensión se comprueba antes de construir una matriz identidad marginal completa o una matriz de Schur.

Formas de Schur real y compleja

Ambas funciones de solución reducida usan schur_output="real" por defecto. La forma de Schur generalizada real conserva los modos conjugados complejos en bloques de 2×2; el solucionador utiliza los bloques estables completos para recuperar la transición y la respuesta de los controles. Los valores propios complejos no implican una política económica compleja. Véase la documentación de Schur generalizada de SciPy.

Use schur_output="complex" para comparar con la descomposición anterior. La elección se registra en policy.diagnostics["schur_output"]. Ambas rutas usan las mismas bases y ecuaciones proyectadas, número de raíces estables, margen respecto al círculo unitario, límite de condición de la proyección de estados y tolerancias de ecuaciones. No hay un reintento automático con otra descomposición. Un fallo se conserva para la configuración solicitada.

La forma real reduce la aritmética del paso de Schur denso. La mejora total depende del modelo: las respuestas de hogares y el entrenamiento de bases pueden dominar una solución de dos activos. El algoritmo sigue usando un sistema reducido denso; no proporciona un método iterativo de subespacios estables. Para medir ambas rutas en el equipo actual, con auditorías de grilla completa y rangos que históricamente fallaron, ejecute:

PYTHONPATH=. python tools/reference_validation/benchmark_hank_schur.py \
    --output reviews/hank-schur-benchmark --repeats 3

Use un directorio nuevo. Cada solución usa un proceso nuevo y secuencial; el registro separa el tiempo total, Schur, construcción de bases y memoria residente máxima. La descomposición está incluida en la fase de política de Schur, por lo que esos dos tiempos no deben sumarse. El tiempo no es una prueba de exactitud; una descomposición más rápida no certifica la precisión no lineal.

Ecuaciones y aceptación

Sean B las direcciones retenidas de la distribución y V las de los valores marginales. La política usa D = D_ss + B z y m = m_ss + V v. Cada coordenada reducida se expande antes de evaluar la derivada direccional de los hogares en la grilla completa; la ecuación marginal se proyecta con V.T. QZ ordenado resuelve este sistema proyectado. Un número incorrecto de raíces estables, una raíz unitaria, una proyección singular del estado o errores en las ecuaciones proyectadas producen una excepción. No se elimina ninguna raíz para fabricar determinación.

policy.converged y simulate(...).converged certifican solamente las ecuaciones proyectadas. Deben leerse junto con los siguientes diagnósticos:

Diagnóstico Significado
projected_equilibrium_residual_max_abs Residuo de las matrices reducidas resueltas
full_marginal_relative_residual_max_abs Máximo coeficiente de una ecuación omitida, dividido por 1 + abs(m_ss), ante una dirección unitaria del estado
full_marginal_stationary_relative_rms_max Mayor RMS marginal normalizado bajo la covarianza estacionaria de los choques
directional_projection_error Diferencia entre una evaluación direccional nueva y la solución proyectada ensamblada
reduced_jacobian_bytes, basis_bytes Tamaños de los arreglos almacenados; no son la memoria máxima del proceso

Los errores por coordenada unitaria dependen de la normalización del estado. El RMS estacionario y los errores en trayectorias de evaluación consideran la escala de los choques. Un error de entrenamiento o un residuo proyectado pequeños no certifican las ecuaciones omitidas.

audit transporta la distribución completa, real y no negativa. Resuelve la consistencia entre continuación y transporte manteniendo fijos los coeficientes de política agregada y comprueba todas las ecuaciones marginales. La aceptación exige errores marginales normalizados y errores de mercados/bienes inferiores a tolerance, error presupuestario inferior a 1e-8, error de masa inferior a 1e-10, ausencia de masa negativa material y de salidas de la grilla, y soluciones de continuación satisfactorias. Los errores de interpolación Euler/KKT se reportan por separado. Nunca se recortan silenciosamente las distribuciones lineales con signo ni los valores marginales no positivos.

Refinamiento y límites

Compare rangos de distribución y marginales, horizontes de entrenamiento y tamaños de choques. Use el solucionador estocástico denso existente como comparación independiente en grillas pequeñas y transiciones largas en espacio de secuencias cuando estén disponibles. El ejemplo de 500 por 7 requiere más direcciones de distribución que los valores predeterminados para grillas pequeñas: las pruebas preliminares con rangos de 4 a 32 fallaron la condición de determinación; con 48 o más, el sistema se resolvió. Esto justifica revisar los rangos, no relajar la comprobación de raíces.

En una grilla de dos activos de 40 por 40, el refinamiento marginal puede lograr trayectorias lineales muy similares mientras una auditoría no lineal con choques mayores aún falla el criterio marginal completo. Un residuo de mercado pequeño no basta. Los registros finales deben reportar estos fallos junto con los casos satisfactorios de menor amplitud.

El enfoque sigue la separación entre funciones estacionarias de los hogares y perturbaciones agregadas reducidas descrita por Bayer y Lütticke (2020). Esta implementación utiliza una base Krylov/SVD de respuestas de los hogares; no pretende reproducir su implementación de cosenos dispersos ni su calibración.

Otros cierres agregados

solve_hank_reduced_kernel acepta el protocolo compartido de pasos hacia atrás, transporte y mercados. Los métodos opcionales aggregate_state_names, prices_from_state(controls, aggregate_state, distribution, *, lag_q=None) y next_aggregate_state(prices, aggregate_state, rho) permiten agregar estados predeterminados. La innovación monetaria se ubica por nombre, no por la última posición del arreglo. El método de precios debe respetar un precio rezagado observado cuando se suministra durante auditorías fuera del equilibrio. Los kernels deben proporcionar derivadas direccionales; el kernel anterior de dos activos con caché completa se rechaza antes de iniciar la construcción.

feedback se expande a todos los controles marginales seguidos por los agregados; reduced_feedback y las matrices proyectadas usan los coeficientes de la base marginal. _forecast(next_state, current_nominal) conserva la semántica existente de continuación estocástica con valores marginales completos.

Evidencia numérica conservada

El registro histórico con Schur complejo de tests/fixtures/hank_scaling/ vincula fuentes, matrices y trayectorias por SHA-256. Su manifiesto apunta a una copia exacta archivada de hank_reduction.py; se conservan los hashes originales y los artefactos numéricos. Usa procesos nuevos y verifica un solo hilo de BLAS. La grilla de un activo de 500×7, con rangos 96 y 128, tiene 229 ecuaciones; la de dos activos de 40×40×2, con rangos 24 y 48, tiene 78. Ambas usan 96 pasos de entrenamiento de Krylov. El rango marginal 128 también funcionó en la segunda grilla, pero el rango 80 con ese horizonte falló la comprobación de una política real en ese registro de Schur complejo. Es evidencia histórica, no una afirmación para todas las descomposiciones. Los rangos no forman una regla monótona de aceptación.

En grillas pequeñas, reducir los controles cambia las trayectorias agregadas retenidas como máximo en 5.8e-9 para un activo y 5.1e-11 para dos. Para 500×7, las primeras 30 respuestas difieren del solucionador independiente en el espacio de secuencias, con horizonte 200, en menos de 7.33e-8.

Las auditorías no lineales de 48 fechas, semilla 9917 y desviación estándar 1e-4, fallan con estas políticas fijas de primer orden. Con una cuarta parte de la amplitud, 40×40 pasa; 500×7 aún presenta error de mercado 1.36e-5, superior al umbral sin cambios de 1e-5. Se conservan por separado los errores de ecuaciones marginales, de Euler/grilla y de mercados. La continuación no lineal resuelve el equilibrio condicional finito y mantiene sus propias comprobaciones de horizonte y ramas.

La memoria residente incluye importaciones y calibración; los bytes de las matrices se registran aparte. Los tiempos se midieron mientras otras pruebas compartían la máquina y no garantizan una aceleración en un equipo exclusivo.