Skip to content

Continuación estocástica no lineal de HANK

La política recursiva local de HANK proporciona una frontera terminal estocástica resuelta. La corrección no lineal resuelve conjuntamente las políticas de los hogares, el transporte de la distribución y los mercados en un árbol futuro condicional, partiendo de la distribución observada y los precios heredados reales. Repetir este cálculo en cada observación produce una política no lineal no anticipativa.

Es una aproximación condicional finita con una política terminal local. No es una solución estocástica global ni de segundo orden para horizonte infinito. Resolver las ecuaciones de mercado no certifica las mallas de hogares, la compresión de distribuciones ni la incertidumbre futura omitida.

Uso

import numpy as np
from puremacro.models import calibrate_one_asset_hank, solve_hank_stochastic_policy
from puremacro.models.hank_nonlinear_continuation import (
    correct_hank_stochastic_state, simulate_hank_nonlinear,
    solve_hank_nonlinear_continuation,
)

ss = calibrate_one_asset_hank(n_a=40, n_e=2, a_max=120.)
local = solve_hank_stochastic_policy(ss, distribution_rank=12, shock_std=1e-4)

# Un equilibrio condicional: su estado certifica sólo las ecuaciones finitas.
finite = solve_hank_nonlinear_continuation(
    local, distribution=ss.distribution,
    aggregate_state=np.array([0., -1e-4]), lag_q=1.,
    horizon=8, branch_depth=2,
)

# Exigir refinamientos separados del horizonte y de la ramificación.
corrected = correct_hank_stochastic_state(
    local, ss.distribution, np.array([0., -1e-4]), lag_q=1.,
)

# Antes de cada corrección se revela únicamente la innovación actual.
history = simulate_hank_nonlinear(local, np.array([-1e-4, 4e-5, 1e-5]))
assert history.converged

Los estados agregados de los modelos de un activo y de consol son la desviación de la tasa nominal heredada y el choque monetario actual. Los modelos con capital productivo añaden el logaritmo del capital heredado. Los métodos aggregate_state_names, prices_from_state y next_aggregate_state determinan el orden y la transición. Se aceptan políticas locales completas y reducidas; las pasadas de hogares siempre usan la malla completa.

En simulate_hank_nonlinear, initial_aggregate_state es el estado condicional antes de la primera innovación proporcionada. La tasa nominal siguiente, el capital físico, la distribución completa transportada y el precio cotizado real q proceden de la solución no lineal anterior. En particular, q nunca se infiere de nuevo de una media de riqueza ilíquida fuera del equilibrio. initial_q y el lag_q de cada corrección son niveles de precio, con valor predeterminado uno.

Qué se resuelve

La fecha actual es la raíz. horizon cuenta las fechas incluyendo la raíz. Las innovaciones de Gauss-Hermite se integran en cada una de las siguientes branch_depth fechas. Las innovaciones posteriores del árbol finito toman su media condicional; la frontera terminal vuelve a usar la esperanza estocástica de la política local resuelta. En los nodos no terminales, el valor marginal esperado es la media ponderada por probabilidades de las políticas no lineales optimizadas de los hijos, en lugar de la regla lineal fija original. Los precios, las decisiones de los hogares y las distribuciones de todos los nodos responden conjuntamente a las ramas de choques condicionales.

Las incógnitas son los controles agregados logarítmicos en cada nodo y los coeficientes de la distribución posterior al nodo terminal. Las pasadas hacia atrás de hogares y hacia adelante de distribuciones generan las ecuaciones de mercado y consistencia terminal. Los productos de Newton–Krylov amortiguado diferencian todo este residuo no lineal. Se reutilizan los precondicionadores de precios de un activo y de consol. Otros modelos usan el operador sin precondicionador, salvo que se amplíen por separado. method="hybr" permite una comparación densa por diferencias finitas, limitada por memoria.

No se estima ningún coeficiente usando la historia realizada suministrada. Las innovaciones realizadas posteriores no entran en un árbol condicional anterior. El mismo estado actual y las mismas opciones producen la misma acción actual aunque cambien las realizaciones posteriores.

Precisión y fallos

Los límites adaptativos predeterminados son horizons=(4, 8, 16, 32, 64) y branch_depths=(1, 2, 3, 4). Un árbol más profundo usa sólo horizontes mayores que su profundidad de ramificación. Cada candidato se compara con un horizonte más corto a profundidad fija y con un árbol menos ramificado al mismo horizonte.

Cada comparación informa tres cambios: máximo cambio de controles agregados logarítmicos de la raíz, máximo cambio relativo del valor marginal esperado en la malla de hogares y cambio L1 de la siguiente distribución completa. Su máximo debe satisfacer la tolerancia correspondiente. Los valores predeterminados son 1e-6 para cada criterio de refinamiento y 1e-8 para las ecuaciones finitas. Son criterios empíricos de sensibilidad, no cotas rigurosas de error. El orden de Gauss-Hermite se mantiene fijo durante la adaptación; quadrature_order_converged=None explicita esta dimensión sin certificar. Compare órdenes por separado con el solucionador de árbol finito.

Dimensión Evidencia reportada Interpretación
Ecuaciones agregadas market_residual_max_abs, presupuesto, masa y salidas de malla Ecuaciones no lineales del árbol elegido
Malla de hogares euler_kkt_max, euler_kkt_mean_max, upper_grid_mass Diagnósticos de interpolación y malla; sin certificado de precisión
Compresión de distribuciones L1 de proyección inicial/terminal y masa terminal reconstruida mínima Error de representación terminal; se conserva el transporte real completo
Horizonte terminal finito horizon_difference, horizon_converged Sensibilidad de la raíz a profundidad fija
Ramas de choques futuros branching_difference, branching_converged Sensibilidad de la raíz a horizonte y orden de cuadratura fijos
Orden de cuadratura Comparaciones de orden para el mismo árbol No lo certifica aceptar la profundidad de ramificación

Con políticas de controles de hogares reducidos, la base de valores marginales terminales añade otra aproximación. La distancia L1 de distribuciones no mide sus direcciones omitidas; inspeccione por separado los diagnósticos de ecuaciones marginales completas omitidas y su RMS bajo los choques alcanzables (full_marginal_stationary_rms_max). Las pasadas interiores en la malla completa no certifican la base de controles terminal.

Las distribuciones reales deben ser no negativas y conservar masa unitaria. Una distribución terminal proyectada puede tener componentes negativos: se reportan por separado y nunca sustituyen a la distribución real ni se recortan silenciosamente. Los valores marginales esperados terminales deben ser positivos y finitos. Los errores de Euler en mallas gruesas pueden seguir cerca de 1e-3 aunque los residuos agregados sean inferiores a 1e-8; converged=True no elimina esa discrepancia.

Al agotar un límite de refinamiento, se lanza por defecto HANKContinuationAccuracyError; su atributo .result conserva la corrección fallida. Con raise_on_failure=False, la corrección devuelve converged=False y los estados individuales. La simulación se detiene antes de transportar la acción fallida, conservando el período y sus diagnósticos. Los estados de ecuaciones, horizonte y ramificación permanecen separados, incluso cuando el horizonte pasa y sólo falla la ramificación. max_nodes, max_workspace_bytes y los límites de iteraciones acotan el tamaño del árbol, los arreglos de trabajo estimados y las iteraciones. La estimación de memoria por árbol no garantiza un límite de RSS del proceso y excluye resultados retenidos de otros refinamientos o fechas anteriores. Aumentar la profundidad o el orden de cuadratura hace crecer rápidamente los árboles.

Inspección independiente

HANKNonlinearCorrection.tree contiene probabilidades de nodos, trayectorias, distribuciones completas de entrada y políticas optimizadas de hogares. expected_marginals, marginal_values, post_distributions, aggregate_states, aggregate_coordinates y prices permiten comprobar esperanzas y presupuestos independientemente. Los precios y arreglos de hogares son niveles; tree.paths contiene desviaciones en niveles y aggregate_coordinates desviaciones logarítmicas.

La simulación conserva políticas de hogares de la raíz, esperanzas, precios reales y todas las distribuciones transportadas. keep_trees=True conserva además cada resultado condicional, con un posible coste elevado de memoria.

La evidencia congelada y los refinamientos más cortos fallidos están en tests/fixtures/hank_nonlinear_continuation/. Reproduzca en un directorio nuevo:

OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 \
VECLIB_MAXIMUM_THREADS=1 MPLCONFIGDIR=/tmp/puremacro-nonlinear-mpl PYTHONPATH=. \
python tools/reference_validation/validate_hank_nonlinear_continuation.py \
  --output /tmp/puremacro-nonlinear-new

El programa registra hashes de fuentes y artefactos, versiones de bibliotecas numéricas y el estado verificado de un solo hilo de Accelerate cuando su API está disponible. Los tiempos describen esa ejecución y no son garantías portables de velocidad. La semilla, la historia reservada y el umbral original 1e-5 de la auditoría de política fija no cambian; el refinamiento numérico añade horizonte o ramas en lugar de relajar los umbrales de aceptación.

La comparación retenida de 80 por 3 puntos y 48 fechas produce:

Base terminal de distribuciones Error de mercado con política fija Error corregido Fechas corregidas Tiempo observado de corrección
Base admisible completa 1.65e-5 7.06e-9 48/48 43.1 s
16 direcciones de instantáneas 2.74e-5 8.28e-9 48/48 978.7 s

Ambas historias corregidas satisfacen los mismos criterios de horizonte y ramificación. La frontera de 16 direcciones requiere horizonte 64 en 20 fechas; la base completa requiere como máximo 16. Por ello, reducir la dimensión del estado no reduce automáticamente el coste total de solución no lineal. Los máximos de Euler/KKT permanecen cerca de 9.95e-4. La comparación densa en la malla pequeña difiere en 1.46e-11 en controles logarítmicos de la raíz; las comparaciones de cuadratura de orden 2 a 3 y de 3 a 5 difieren como máximo en 2.64e-8 en las métricas reportadas de la raíz. Son comprobaciones específicas de estos casos.

Entre las dos historias refinadas independientemente, las desviaciones de inflación, salario, producto y consumo difieren como máximo en 3.54e-8; la distancia L1 de las distribuciones completas permanece por debajo de 5.08e-7. Como los horizontes elegidos difieren, esta comparación combina representación y refinamiento; no es una cota del error puro de compresión.

Una prueba separada de rango 32 mantiene la misma historia y los mismos criterios, con un presupuesto blando de 600 segundos comprobado entre correcciones. Acepta 43/48 fechas antes de detenerse, con error máximo de mercado 9.42e-9 en ese prefijo. La última corrección termina después del límite blando: el tiempo de solución es 635.3 segundos y el de la trayectoria 636.0 segundos. Todavía requiere horizonte 64 en 13 fechas. Este resultado parcial no demuestra que el rango 32 sea un reemplazo validado más rápido. Sus estados guardados, el motivo de parada y las verificaciones independientes de transporte y presupuesto se conservan en tests/fixtures/hank_nonlinear_rank32/; no queda ninguna corrección en ejecución.