model 03 — Federal Reserve macroeconomic model · frb-us · US · hosted

Test US monetary and fiscal shocks.

Trace how a funds-rate or fiscal shock affects US output, inflation, and unemployment quarter by quarter using the April 2026 baseline.

how far to trust it

Machine precision on the baseline; the Fed's own noise floor on shocks.

This is a replication with a published anchor — the sharpest-tested member of the suite, because for once the ground truth is exact rather than statistical. Three invariants carry the weight, all enforced in continuous integration, including four like-for-like scenarios gated against vendor-generated references.

tracking invariant 5.6e−17 vs LONGBASE, all 284 endos × 20 quarters; CI gate 1e−8
shock vs pyfrbus 1.0.0 6.0e−9 the committed reference; CI gate 1e−6
shock vs pyfrbus 1.1.1 1.4e−8 the Board's April 2026 LONGBASE vintage used here
the Fed vs the Fed 1.3e−8 pyfrbus 1.1.1 against 1.0.0 — the yardstick

The last figure frames the other three. The Board's two releases ship a byte-identical model.xml and LONGBASE and differ only in how the Newton routine reuses its LU factorisation — yet they disagree with each other by 1.3×10−8, as much as this implementation disagrees with either. Agreement therefore sits at the reference implementation's own numerical noise, not at a tolerance anyone chose. All three residuals concentrate in the same near-zero expectational-gap series (wpsn, zgap05).

frb-us: residuals against the Fed’s pyfrbus, log scale Horizontal bar chart on a base-10 logarithmic axis of maximum absolute residuals; shorter is closer. ours vs LONGBASE (tracking invariant): 5.6e-17; pyfrbus 1.1.1 vs LONGBASE: 1.1e-08; ours vs pyfrbus 1.0.0 (shock): 6.0e-09; ours vs pyfrbus 1.1.1 (shock): 1.4e-08; pyfrbus 1.1.1 vs 1.0.0 — the Fed’s own two releases: 1.3e-08. The framing comparison is the last row: the Federal Reserve's own two pyfrbus releases disagree with each other by as much as this implementation disagrees with either, so our agreement sits at the scale of the reference implementation's own numerical noise rather than at a chosen tolerance. 1e-18 1e-16 1e-14 1e-12 1e-10 1e-8 ours vs LONGBASE (tracking invariant) 5.6e-17 pyfrbus 1.1.1 vs LONGBASE 1.1e-08 ours vs pyfrbus 1.0.0 (shock) 6.0e-09 ours vs pyfrbus 1.1.1 (shock) 1.4e-08 pyfrbus 1.1.1 vs 1.0.0 — the Fed’s own two releases 1.3e-08
Maximum absolute residuals, log scale — lower is closer. The bottom bar is the framing one: the Fed's own two releases disagree by as much as we disagree with either. On the tracking invariant, pyfrbus 1.1.1 reproduces LONGBASE to 1.1×10−8 against this implementation's 5.6×10−17. Source: papers/frb-us validation tables.
Validation results against the Federal Reserve Board's own artefacts
testwhat it checksresult
Tracking invariant After init_trac, solving the baseline must reproduce LONGBASE for all 284 endogenous variables over 2026Q1–2030Q4. Max absolute error 5.6e−17 — machine precision, against a 1e−8 gate. The Board's own pyfrbus 1.1.1 reproduces LONGBASE to 1.1e−8 on the same test.
Cross-validation An identical 100bp rffintay_aerr shock run in both implementations, compared across all 284 variables and all 20 quarters. 6.0e−9 against pyfrbus 1.0.0 and 1.4e−8 against 1.1.1 — where the two Board releases differ from each other by 1.3e−8.
Simulation properties A 100bp tightening must move the right things in the right direction by the right order of magnitude. rff +1.000pp on impact, GDP trough −0.55%, unemployment peak +0.26pp, core inflation trough −0.034pp — consistent with the Board's documented VAR-expectations properties.

Multipliers. Government-purchases and personal-tax shocks of 1% of GDP land inside every published range they are compared against — the last three rows below.

frb-us against the Fed's pyfrbus and published multiplier ranges
QuantityOursPublishedReading
Tracking invariant, max abs. error5.6×10−17CI gate <10−8; pyfrbus 1.1.1 gives 1.1×10−8machine precision
Shock responses vs pyfrbus 1.0.06.0×10−9at the reference's noise floor
Shock responses vs pyfrbus 1.1.11.4×10−81.1.1 vs 1.0.0: 1.3×10−8the Fed's releases differ as much as we do
Gov. purchases multiplier, yr 1, inertial Taylor rule0.720.7–1.0 (Coenen et al. 2012); Ramey (JEP 2019): "a surprisingly narrow range of 0.6 to 1"inside range
Gov. purchases multiplier, yr 2, fixed funds rate0.99"roughly one" pegged; 1.1–1.2 with accommodationmatches the Board's characterisation
Personal tax cut multiplier, yrs 1–20.22 → 0.320.2–0.4; CBO central ≈0.3inside both ranges

Uncertainty engine. The implementation now supports seeded stochastic simulations that jointly resample the official stochastic-equation residual vector, preserving contemporaneous dependence and reporting failed replications. Model and LONGBASE packages are also verified against separate SHA-256 provenance gates. Published probability results still require a reviewed simulation design; model-consistent expectations remain unavailable.

The committed reference stays pinned to pyfrbus 1.0.0 so the gate has a fixed anchor; the 1.1.1 comparison is a recorded cross-check. CI goes beyond re-checking a committed CSV: a dedicated job re-runs the Board's pyfrbus from source in a throwaway environment and gates against that freshly generated solution, and a weekly scheduled run repeats the suite across Python 3.10–3.12 so dependency drift surfaces without a pull request. Full tables in VALIDATION.md and the working paper.

This is an independent implementation built from the Federal Reserve Board's published model equations and data. It is not produced, maintained, or endorsed by the Federal Reserve, and its results should not be presented as official Federal Reserve estimates.

limits

Known limitations.

Known limits of the frb-us implementation
limitdetail
VAR expectations only The model-consistent-expectations (MCE) equation variants are not implemented — Frbus(path, mce=...) raises NotImplementedError — so anything that turns on agents anticipating announced future policy, forward guidance most obviously, is out of scope.
No mcontrol The reference implementation's trajectory-targeting routine is out of scope. Stochastic simulation is implemented — stochsim_bands() produces seeded residual-bootstrap percentile bands — but the hosted frbus_shock path returns a single deterministic projection, so bands are not available over MCP.
Hosted, but only as raw shocks The hosted tools and their pe-macro mirrors expose one lever, one shock size, a policy rule and a headline set of responses — not the full 284-variable model. Anything beyond that (the Board's demo scripts, exogenize, arbitrary variable sets) means installing the package and using its Python API.
No PolicyEngine reform bridge Reforms enter as shocks to model variables, not as statute. There is no equivalent of the OBR emulator's static-costing bridge from a PolicyEngine reform dict — score_reform refuses model="frbus" outright and points at frbus_shock — so US reform scoring stops at pe-microsim's static answer. Hosting did not change this.
Approximate published comparisons The 100bp funds-rate responses in the Board's 2014 FEDS Note are read off charts, so those comparisons are approximate by nature: our output-gap trough of −0.50pp against the Note's roughly −0.4pp reflects vintage and shock-design differences, not a claimed match.
Vintage The April 2026 model.xml and LONGBASE as published by the Board. Later Board vintages have not been adopted.