model 04 — US heterogeneous-agent NK model · us-hank · US · hosted
See who responds to a US shock, not just how much.
Run stylized monetary, fiscal-spending, and productivity shocks through a two-asset heterogeneous-agent New Keynesian model — aggregate impulse responses plus first-order distributional output: MPCs by wealth quartile and the hand-to-mouth share.
Steady state, Jacobian, then instant IRFs.
The five stages of the us-hank pipeline, from the heterogeneous-agent structure to the first-order distributional block. The theory is the Auclert–Bardóczy–Rognlie–Straub Econometrica 2021 paper's; the implementation builds on the authors' sequence-jacobian toolkit.
Heterogeneous agents, two assets
Households differ
This is a validated replication of the two-asset heterogeneous-agent New Keynesian (HANK) model of Auclert, Bardóczy, Rognlie and Straub (Econometrica 2021, "Using the Sequence-Space Jacobian to Solve and Estimate Heterogeneous-Agent Models"). Households differ in liquid and illiquid wealth, so their marginal propensities to consume differ, and the model carries that whole distribution through the general-equilibrium response — the thing a representative-agent model cannot say.
Production grids, not demo grids
The model runs at the paper's production grid sizes — 50 liquid × 70 illiquid × 50 capital points — rather than the packaged demo grids. It is a VAR-free, sequence-space HANK: no estimated reduced form, no expectations shortcut. A variant option selects the paper's two_asset model (the default) or a fast one_asset textbook variant — no capital, so no investment response, and monetary/productivity shocks only.
Calibrate and solve the steady state
Hit the paper's targets
The first stage solves the general-equilibrium steady state at the production grids, calibrating discounting and portfolio-adjustment costs to hit the paper's asset-market targets. The solve takes about 13 seconds, is computed once, and is cached.
Checked value by value
The hosted steady state is set against the paper's published calibration targets, value by value, on the validation page. The parameterisation is the published paper's throughout — there is no data vintage to refresh.
Differentiate: the sequence-space Jacobian
One linear map
The second stage builds the general-equilibrium sequence-space Jacobian — the \(T \times T\) linear map from each exogenous path to each outcome path, with \(T = 300\) quarters. It takes about 5 seconds and is cached alongside the steady state.
Instant IRFs
With both caches warm, an impulse response is a matrix–vector product — effectively instant. The first call per variant pays the steady-state and Jacobian solves, roughly 18 seconds cold; every later call reuses them.
Shock: three instruments, endogenous labor tax
AR(1) paths
A shock is an AR(1) path, \(\varepsilon_t = \text{size} \times \rho^t\), on one of three instruments: the Taylor-rule intercept (monetary), real government spending (fiscal_spending), or TFP (productivity).
The design point that matters
The labor tax is endogenous. The fiscal block balances the government budget each period, so a spending shock is implicitly tax-financed — and there is no exogenous transfer or tax-rate instrument to shock. Requests for one are refused with that explanation rather than answered with an invented mapping; score_reform refuses model="hank" outright.
Distribute — within first-order limits
The distributional block
From the steady-state joint distribution and consumption policy, the model reports MPCs by liquid-wealth quartile, the hand-to-mouth share, and a first-order allocation of the impact consumption response across total-wealth quartiles — allocated in proportion to steady-state MPCs.
What "first-order" means here
Responses are linear in the shock, with no state dependence: the distributional cuts capture the MPC-heterogeneity channel, not full household-level dynamics along the transition. And the model is not a forecaster — every result is a deviation around the calibrated steady state, not a projection of the US economy. The code page has the commands and Python API; the validation page has the replication gate and full limits.