-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
335 lines (324 loc) · 22.1 KB
/
Copy pathindex.html
File metadata and controls
335 lines (324 loc) · 22.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Seven open models, and how far to trust each — PolicyEngine Macro</title>
<meta name="description" content="PolicyEngine's UK and US tax-benefit microsimulation runs here in process, and six open macro models extend it with GDP, inflation, rates and feedback. Every model publishes how far it can be checked — including where it fails." />
<link rel="canonical" href="https://policyengine-macro.vercel.app/" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://policyengine-macro.vercel.app/" />
<meta property="og:site_name" content="PolicyEngine Macro" />
<meta property="og:title" content="PolicyEngine Macro" />
<meta property="og:description" content="PolicyEngine's tax-benefit microsimulation for the UK and US, extended by six open macro models — with preserved data vintages, public forecast scoring, explicit validation, and reproducible code." />
<meta property="og:image" content="https://policyengine-macro.vercel.app/assets/og-image.png" />
<meta property="og:image:alt" content="PolicyEngine Macro — open economic models for the UK and US" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="icon" type="image/svg+xml" href="/assets/policyengine-mark.svg" />
<meta name="theme-color" content="#FFFFFF" />
<link rel="stylesheet" href="/vendor/fonts/fonts.css" />
<link rel="stylesheet" href="/vendor/ui-kit-tokens.css" />
<link rel="stylesheet" href="/style.css?v=7" />
</head>
<body class="doc home-page">
<a class="skip-link" href="#top">Skip to main content</a>
<div class="grain" aria-hidden="true"></div>
<header class="nav">
<a class="brand" href="/">
<img class="brand-logo" src="/assets/policyengine-mark.svg" alt="" width="20" height="20" />PolicyEngine Macro
</a>
<nav class="nav-links" aria-label="Primary">
<a class="nav-mobile" href="/" aria-current="page">Home</a>
<a class="nav-mobile" href="/models">Models</a>
<a class="nav-mobile" href="/forecasts">Forecasts</a>
<a class="nav-mobile nav-start" href="/connect">Use</a>
<a class="nav-gh" href="https://github.com/PolicyEngine/macro" aria-label="GitHub"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2c-.9 .9 -1.3 2 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5"/></svg></a>
</nav>
</header>
<main id="top">
<section class="hero">
<div class="hero-inner">
<div class="hero-copy">
<p class="eyebrow reveal" style="--d:0">one core model · six extensions · uk & us</p>
<h1 class="reveal hero-h1" style="--d:1">
<span>An open platform for policy analysis</span>
<span>and economic research.</span>
</h1>
<p class="lede reveal" style="--d:2">
The tax-benefit engine behind policyengine.org — what a reform
does to each UK or US household, and what it costs — joined to six
macro models: the <a href="/obr">OBR</a> emulator, the
<a href="/svar">Bank of England</a> SVAR, the
<a href="/frb-us">Fed’s FRB/US</a>, a
<a href="/us-hank">US HANK</a>, an
<a href="/olg">overlapping-generations</a> model and
<a href="/define">DEFINE-UK</a> for climate.
</p>
<div class="hero-cta reveal" style="--d:3">
<a class="btn btn-primary" href="/connect">Run a hosted model</a>
<a class="btn btn-ghost" href="/models#validation">How far to trust each model</a>
</div>
</div>
<figure class="hero-fig">
<!-- hero-fan:begin -->
<svg class="hero-fan" viewBox="0 0 640 400" preserveAspectRatio="xMidYMid meet" role="img" aria-labelledby="hero-fan-t hero-fan-d">
<title id="hero-fan-t">boe-svar: UK real GDP growth forecast, median with 68% and 90% credible bands</title>
<desc id="hero-fan-d">Fan chart. Posterior forecast of UK year-on-year real GDP growth from the boe-svar model, 2026Q2 to 2029Q2, conditioned through 2026Q1. The median path runs from +1.14% to +1.41%. The 90% credible band is widest at 2029Q2, spanning -0.67% to +3.77%; its lower edge is positive for the first 3 quarters and dips below zero from 2027Q1 onward.</desc>
<line class="hf-grid" x1="30.0" y1="302.3" x2="604.0" y2="302.3"/>
<text class="hf-tick" x="30.0" y="295.3">-1%</text>
<line class="hf-zero" x1="30.0" y1="242.7" x2="604.0" y2="242.7"/>
<text class="hf-tick" x="30.0" y="235.7">+0%</text>
<line class="hf-grid" x1="30.0" y1="183.1" x2="604.0" y2="183.1"/>
<text class="hf-tick" x="30.0" y="176.1">+1%</text>
<line class="hf-grid" x1="30.0" y1="123.5" x2="604.0" y2="123.5"/>
<text class="hf-tick" x="30.0" y="116.5">+2%</text>
<line class="hf-grid" x1="30.0" y1="63.8" x2="604.0" y2="63.8"/>
<text class="hf-tick" x="30.0" y="56.8">+3%</text>
<path class="hf-b90" d="M30.0 125.0 L77.8 75.8 L125.7 38.0 L173.5 37.7 L221.3 40.2 L269.2 37.3 L317.0 31.7 L364.8 31.7 L412.7 40.5 L460.5 36.8 L508.3 27.2 L556.2 29.0 L604.0 18.2 L604.0 282.8 L556.2 280.9 L508.3 282.9 L460.5 280.0 L412.7 278.1 L364.8 268.9 L317.0 281.5 L269.2 277.1 L221.3 277.1 L173.5 273.2 L125.7 235.3 L77.8 236.1 L30.0 231.5 Z"/>
<path class="hf-b68" d="M30.0 142.3 L77.8 107.7 L125.7 79.0 L173.5 85.6 L221.3 87.3 L269.2 90.7 L317.0 86.4 L364.8 89.1 L412.7 85.1 L460.5 82.4 L508.3 78.7 L556.2 74.3 L604.0 77.3 L604.0 235.5 L556.2 235.3 L508.3 235.6 L460.5 229.5 L412.7 228.8 L364.8 230.1 L317.0 232.4 L269.2 230.1 L221.3 226.0 L173.5 224.8 L125.7 197.9 L77.8 206.2 L30.0 207.3 Z"/>
<path class="hf-med" d="M30.0 175.0 L77.8 155.5 L125.7 137.8 L173.5 151.5 L221.3 154.1 L269.2 161.9 L317.0 158.5 L364.8 160.8 L412.7 159.2 L460.5 157.7 L508.3 153.0 L556.2 156.1 L604.0 158.6"/>
<circle class="hf-dot" cx="604.0" cy="158.6" r="4"/>
<text class="hf-tick hf-q" x="30.0" y="366">2026</text>
<text class="hf-tick hf-q" x="173.5" y="366">2027</text>
<text class="hf-tick hf-q" x="364.8" y="366">2028</text>
<text class="hf-tick hf-q" x="556.2" y="366">2029</text>
</svg>
<!-- hero-fan:end -->
<figcaption>
UK GDP growth, boe-svar. Raw posterior bands — and against a
drifting random walk, the model shows no forecast skill.
<a href="/svar/validation">See the evaluation →</a>
</figcaption>
</figure>
</div>
</section>
<section id="record" class="band band-result">
<div class="band-head">
<span class="kicker mono">why this one is different</span>
<h2 class="verdict-claim">Every model here says where it fails.</h2>
<p class="section-intro">
Each model page ends in a plain verdict, checked against the files that
produced it. Each forecast goes on the record before the answer is
known, then is scored once it is. The failures are published next to
the wins.
</p>
</div>
<div class="proof-grid">
<div class="proof-col" id="verdicts">
<p class="proof-head mono">the verdicts — three grades, every model gets one</p>
<ol class="verdict-ladder">
<li class="verdict-rung">
<span class="rung-step" aria-hidden="true"><i class="on"></i><i class="on"></i><i class="on"></i></span>
<strong class="rung-grade mono">exact</strong>
<span class="rung-what">pe-microsim’s household arithmetic, to the penny.</span>
</li>
<li class="verdict-rung">
<span class="rung-step" aria-hidden="true"><i class="on"></i><i class="on"></i><i></i></span>
<strong class="rung-grade mono">a benchmark, not a validation</strong>
<span class="rung-what">The HMRC costing comparison; a household-route multiplier near the OBR’s published 0.3, but a spending multiplier that is 1.0000 by construction.</span>
</li>
<li class="verdict-rung">
<span class="rung-step" aria-hidden="true"><i class="on"></i><i></i><i></i></span>
<strong class="rung-grade mono">no skill</strong>
<span class="rung-what">boe-svar against a drifting random walk, once the 64 tests are adjusted.</span>
</li>
</ol>
<p class="qa-link"><a href="/models#validation">See how each model is graded →</a></p>
</div>
<div class="proof-col">
<p class="proof-head mono">the score — one period on the record so far</p>
<p class="scored-subject">UK CPI inflation, <span class="mono">2026Q2</span></p>
<div class="scored-rail">
<p class="rail-cap mono">68% band</p>
<p class="rail-lab rail-lab-f" style="--x:47.8%">forecast <strong>2.68%</strong></p>
<span class="rail-end rail-end-lo mono">2.24%</span>
<span class="rail" aria-hidden="true">
<i class="rail-tick rail-tick-f" style="--x:47.8%"></i>
<i class="rail-tick rail-tick-o" style="--x:60.9%"></i>
</span>
<span class="rail-end rail-end-hi mono">3.16%</span>
<p class="rail-lab rail-lab-o" style="--x:60.9%">outturn <strong>2.80%</strong></p>
</div>
<p class="scored-note">The forecast and its 68% band come from the round archived on 2026-07-21, before the data arrived. The ONS printed the outturn afterwards.</p>
<p class="scored-verdict">The outturn landed inside the band. <strong>One period inside a band is not a track record.</strong></p>
<p class="qa-link"><a href="/forecasts">Inspect the forecast record →</a></p>
</div>
</div>
</section>
<section id="joins" class="band">
<div class="band-head">
<span class="kicker mono">01 — how it fits together</span>
<h2>How the models connect.</h2>
<p class="section-intro">The microsimulation is the core: it knows every household, and nothing about the economy around them. Each macro model joins it at one named point, in one of two directions — a reform’s cost goes <em>out</em> to a macro model and feedback comes back (<code>score_reform</code> accepts <code>microsim</code>, <code>obr</code>, <code>og</code>, <code>og+microsim</code>), or a macro path comes <em>in</em> and is pushed down onto households as incidence. Nothing connects macro model to macro model.</p>
</div>
<p class="join-lead">
Every bridge starts or ends at the microsimulation.
<a href="/models#score">How a reform is scored →</a>
</p>
<ol class="join-list">
<li class="join">
<div class="pipeline">
<span class="pl-node"><strong>Reform</strong></span>
<span class="pl-arrow" aria-hidden="true">→</span>
<a class="pl-node" href="/pe"><strong>pe-microsim</strong><span class="mono">cost · who pays</span></a>
<span class="pl-arrow" aria-hidden="true">→</span>
<a class="pl-node" href="/obr"><strong>obr-macro</strong><span class="mono">macro feedback</span></a>
<span class="pl-arrow" aria-hidden="true">→</span>
<span class="pl-node pl-node-out"><strong>Scored result</strong></span>
</div>
<dl class="join-lines">
<div><dt class="mono">what moves</dt><dd>The cost from the microsimulation goes into the OBR model as a change in household income.</dd></div>
<div><dt class="mono">result</dt><dd>1p on the basic rate takes GDP down, building to <strong>~0.35× the revenue raised</strong>.</dd></div>
<div class="join-caveat"><dt class="mono">caveat</dt><dd>That is close to the OBR’s published <strong>0.3</strong> for income tax — the ~1-by-construction problem is on the <em>spending</em> lever, not this one. But no quarter of the solve converges, so treat the scale as roughly right and single quarters as unreliable.</dd></div>
</dl>
<p class="join-more"><a href="/models#score">Score a reform →</a></p>
</li>
<li class="join">
<div class="pipeline">
<span class="pl-node"><strong>Reform</strong></span>
<span class="pl-arrow" aria-hidden="true">→</span>
<a class="pl-node" href="/olg"><strong>OG-UK</strong><span class="mono">long-run wages</span></a>
<span class="pl-arrow" aria-hidden="true">→</span>
<a class="pl-node" href="/pe"><strong>pe-microsim</strong><span class="mono">second run</span></a>
<span class="pl-arrow" aria-hidden="true">→</span>
<span class="pl-node pl-node-stop"><strong>No scored result</strong></span>
</div>
<dl class="join-lines">
<div><dt class="mono">what moves</dt><dd>OG-UK’s long-run wage changes feed a second microsimulation run.</dd></div>
<div><dt class="mono">result</dt><dd><strong>No scored result is published.</strong></dd></div>
<div class="join-caveat"><dt class="mono">caveat</dt><dd>The wage change is applied evenly across years, so there is no path from now to then.</dd></div>
</dl>
<p class="join-more"><a href="/olg">Open OG-UK →</a></p>
</li>
<li class="join">
<div class="pipeline">
<span class="pl-node"><strong>Economy-wide path</strong></span>
<span class="pl-arrow" aria-hidden="true">→</span>
<a class="pl-node" href="/pe"><strong>pe-microsim</strong><span class="mono">who pays</span></a>
<span class="pl-arrow" aria-hidden="true">→</span>
<span class="pl-node pl-node-out"><strong>Who gains and loses</strong></span>
</div>
<dl class="join-lines">
<div><dt class="mono">what moves</dt><dd>Four more joins run this way: an economy-wide path goes in, and who gains and loses comes out.</dd></div>
<div class="join-caveat"><dt class="mono">caveat</dt><dd><strong>All four are experimental.</strong></dd></div>
</dl>
<p class="join-more"><a href="/models#compose">See every join →</a></p>
</li>
</ol>
<p class="join-note"><span class="mono">united states</span>No US macro bridge exists, so a US reform is scored statically.</p>
</section>
<section id="extend" class="band">
<div class="band-head">
<span class="kicker mono">02 — what each one is for</span>
<h2>Six models, six different questions.</h2>
<p class="section-intro">Pick by the question you have, not by the model you know. Each line is what that model is for, and what its evidence does and does not support.</p>
</div>
<figure class="mm-figure">
<svg class="model-map" viewBox="0 0 940 470" role="img" aria-labelledby="mm-t mm-d">
<title id="mm-t">Which model answers which question, by horizon and country</title>
<desc id="mm-d">A map of the six macro models on a shared time axis running from the recent past through coming quarters and three to five years out to decades. The UK lane holds boe-svar at the recent past for what is driving the economy now, obr-macro at three to five years for scoring a UK reform, and psl-og and define-uk at decades for long-run effects and climate scenarios. The US lane holds frb-us and us-hank in coming quarters, for shock response and for which households absorb a shock by wealth. Models drawn with a solid outline are checked against an external published anchor; psl-og and define-uk are drawn dashed because no independent outcome benchmark exists for them.</desc>
<text class="mm-zone" x="145" y="452" text-anchor="middle">recent past → now</text>
<rect class="mm-band" x="250" y="56" width="220" height="374"/>
<text class="mm-zone" x="360" y="452" text-anchor="middle">coming quarters</text>
<line class="mm-div" x1="250" y1="56" x2="250" y2="430"/>
<text class="mm-zone" x="575" y="452" text-anchor="middle">3–5 years</text>
<line class="mm-div" x1="470" y1="56" x2="470" y2="430"/>
<rect class="mm-band" x="680" y="56" width="210" height="374"/>
<text class="mm-zone" x="785" y="452" text-anchor="middle">decades</text>
<line class="mm-div" x1="680" y1="56" x2="680" y2="430"/>
<line class="mm-axis" x1="40" y1="430" x2="890" y2="430"/>
<text class="mm-lane" x="40" y="46">UK</text>
<line class="mm-lanediv" x1="40" y1="240" x2="890" y2="240"/>
<text class="mm-lane" x="40" y="266">US</text>
<a href="/svar">
<rect class="mm-pill" x="60" y="97" width="176" height="62" rx="10"/>
<text class="mm-id" x="148" y="122" text-anchor="middle">boe-svar</text>
<text class="mm-what" x="148" y="144" text-anchor="middle">what is driving it now</text>
</a>
<a href="/obr">
<rect class="mm-pill" x="490" y="97" width="176" height="62" rx="10"/>
<text class="mm-id" x="578" y="122" text-anchor="middle">obr-macro</text>
<text class="mm-what" x="578" y="144" text-anchor="middle">score a UK reform</text>
</a>
<a href="/olg">
<rect class="mm-pill mm-pill-soft" x="696" y="65" width="176" height="62" rx="10"/>
<text class="mm-id" x="784" y="90" text-anchor="middle">psl-og</text>
<text class="mm-what" x="784" y="112" text-anchor="middle">decades ahead</text>
</a>
<a href="/define">
<rect class="mm-pill mm-pill-soft" x="696" y="151" width="176" height="62" rx="10"/>
<text class="mm-id" x="784" y="176" text-anchor="middle">define-uk</text>
<text class="mm-what" x="784" y="198" text-anchor="middle">climate scenarios</text>
</a>
<a href="/frb-us">
<rect class="mm-pill" x="272" y="269" width="176" height="62" rx="10"/>
<text class="mm-id" x="360" y="294" text-anchor="middle">frb-us</text>
<text class="mm-what" x="360" y="316" text-anchor="middle">US shock response</text>
</a>
<a href="/us-hank">
<rect class="mm-pill" x="272" y="355" width="176" height="62" rx="10"/>
<text class="mm-id" x="360" y="380" text-anchor="middle">us-hank</text>
<text class="mm-what" x="360" y="402" text-anchor="middle">who absorbs it, by wealth</text>
</a>
<rect class="mm-pill mm-key" x="600" y="20" width="18" height="12" rx="3"/>
<text class="mm-legend" x="626" y="30">checked against a published anchor</text>
<rect class="mm-pill mm-pill-soft mm-key" x="600" y="38" width="18" height="12" rx="3"/>
<text class="mm-legend" x="626" y="48">no independent outcome benchmark</text>
</svg>
<figcaption>Placed by the horizon each model answers over, and split by country. A solid outline means the model is checked against an external published anchor; a dashed one means no independent outcome benchmark exists for it.</figcaption>
</figure>
<div class="vmet-notes mm-evidence">
<p class="vmet-notes-line"><span class="vmet-notes-key">obr-macro</span> <span>Tracks the March 2026 EFO to <strong>0.15% GDP MAPE</strong> with the anchors held; free-running, <strong>4.48%</strong>.</span></p>
<p class="vmet-notes-line"><span class="vmet-notes-key">boe-svar</span> <span>Replicates the paper’s GDP decomposition (<strong>37.4% vs ~40%</strong>), <strong>8pp short on CPI</strong>. Against a drifting random walk, <strong>no forecast skill survives</strong> the 64 tests run.</span></p>
<p class="vmet-notes-line"><span class="vmet-notes-key">frb-us</span> <span>Matches the Fed’s own pyfrbus inside its two releases’ disagreement (<strong>~1×10−⁸</strong>); <strong>no predictive claim</strong>.</span></p>
<p class="vmet-notes-line"><span class="vmet-notes-key">us-hank</span> <span>Solves Auclert et al. (2021) to four decimals — the headline targets are <strong>inputs, not results</strong>.</span></p>
<p class="vmet-notes-line"><span class="vmet-notes-key">psl-og</span> <span>+1pp on the basic rate: GDP <strong>−£5.0bn (−0.14%)</strong>, revenue <strong>+0.29pp of GDP</strong> by 2030. Targets met by construction; <strong>no independent outcome benchmark exists</strong>.</span></p>
<p class="vmet-notes-line"><span class="vmet-notes-key">define-uk</span> <span>Baseline replicates the manual; scenarios are design-gated and paper-anchored. <strong>Deltas only, never levels.</strong></span></p>
</div>
<p class="chooser-note"><a href="/models">Inspect all seven models</a>, <a href="/models#compare">compare them side by side</a>, or <a href="/models#validation">read the evidence for each</a>.</p>
</section>
<section id="workflow" class="band">
<div class="band-head">
<span class="kicker mono">03 — start using it</span>
<h2>Run a hosted model, or use the code directly.</h2>
<p class="section-intro">Connect the public MCP server with no PolicyEngine account or API key, use the shared CLI, or call each Python package directly.</p>
</div>
<div class="start-row">
<div class="hero-cta">
<a class="btn btn-primary" href="/connect">Connect and try a model</a>
<a class="btn btn-ghost" href="https://github.com/PolicyEngine/macro">Read the code on GitHub</a>
</div>
<div class="ai-client-row" aria-label="Works with Claude and ChatGPT">
<span class="ai-client"><img src="/assets/claude-mark.svg" alt="" width="24" height="24" /><span>Claude</span></span>
<span class="ai-client"><img src="/assets/chatgpt-mark.svg" alt="" width="24" height="24" /><span>ChatGPT</span></span>
</div>
</div>
</section>
</main>
<footer class="foot foot-bar">
<p class="footer-legal">© 2026 PolicyEngine. All rights reserved.</p>
<nav class="footer-links" aria-label="PolicyEngine links">
<a class="footer-text footer-policyengine" href="https://policyengine.org"><img src="/assets/policyengine-mark.svg" alt="" width="17" height="17" />PolicyEngine</a>
<a class="footer-text" href="https://github.com/PolicyEngine/macro">GitHub</a>
<a class="footer-text" href="/contact">Contact</a>
</nav>
</footer>
<script src="/reveal.js?v=2" defer></script>
<script>
(function () {
var tabs = [["glance-tab-uk", "glance-uk"], ["glance-tab-us", "glance-us"]];
tabs.forEach(function (pair) {
document.getElementById(pair[0]).addEventListener("click", function () {
tabs.forEach(function (other) {
var active = other[0] === pair[0];
var btn = document.getElementById(other[0]);
btn.setAttribute("aria-selected", active ? "true" : "false");
btn.classList.toggle("is-current", active);
document.getElementById(other[1]).hidden = !active;
});
});
});
})();
</script>
</body>
</html>