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.
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.
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).
| test | what it checks | result |
|---|---|---|
| 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.
| Quantity | Ours | Published | Reading |
|---|---|---|---|
| Tracking invariant, max abs. error | 5.6×10−17 | CI gate <10−8; pyfrbus 1.1.1 gives 1.1×10−8 | machine precision |
| Shock responses vs pyfrbus 1.0.0 | 6.0×10−9 | — | at the reference's noise floor |
| Shock responses vs pyfrbus 1.1.1 | 1.4×10−8 | 1.1.1 vs 1.0.0: 1.3×10−8 | the Fed's releases differ as much as we do |
| Gov. purchases multiplier, yr 1, inertial Taylor rule | 0.72 | 0.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 rate | 0.99 | "roughly one" pegged; 1.1–1.2 with accommodation | matches the Board's characterisation |
| Personal tax cut multiplier, yrs 1–2 | 0.22 → 0.32 | 0.2–0.4; CBO central ≈0.3 | inside 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.
Known limitations.
| limit | detail |
|---|---|
| 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. |