Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion economy/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ <h2>What has happened, and what the model sees next.</h2>
<article class="economy-stat">
<p class="economy-stat-label mono">REAL-TIME FORECAST RECORD</p>
<p class="economy-stat-value">1 scored</p>
<p class="economy-stat-change">1 archived round</p>
<p class="economy-stat-change">2 archived rounds</p>
<dl>
<div><dt>Observation</dt><dd>current scorecard</dd></div>
<div><dt>Vintage</dt><dd>generated scorecard</dd></div>
Expand Down
14 changes: 12 additions & 2 deletions forecasts/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,12 @@ <h2>One round in, one result.</h2>
<div class="prose">
<!-- scorecard-status:begin -->
<div class="forecast-summary" aria-label="Current forecast record">
<article><strong>1</strong><span>Archived round</span></article>
<article><strong>2</strong><span>Archived rounds</span></article>
<article><strong>1</strong><span>Scored period</span></article>
<article><strong>0.12pp</strong><span>Latest absolute error</span></article>
</div>
<p class="forecast-next">
<strong>Next due:</strong> 2026Q2 (UK real GDP, y/y), which lands when the ONS publishes it.
<strong>Next due:</strong> 2026Q2 (UK real GDP, y/y, unemployment), which lands when the ONS publishes it.
</p>
<!-- scorecard-status:end -->
<p>
Expand Down Expand Up @@ -153,6 +153,16 @@ <h2>What was claimed, and when.</h2>
<a class="mono" href="/forecasts/rounds/2026-07-21/boe-svar.json" download>Download artifact · <code>2026-07-21/boe-svar.json</code> →</a>
<a class="mono" href="https://github.com/PolicyEngine/macro/blob/main/forecasts/rounds/2026-07-21/boe-svar.json">Open on GitHub with commit history →</a>
</article>
<article class="forecast-round">
<div><span class="mono">2026-07-28</span><strong>okun-unemployment</strong></div>
<dl>
<div><dt>Data edge</dt><dd>2026Q1</dd></div>
<div><dt>Periods</dt><dd>4</dd></div>
<div><dt>Scored</dt><dd>0</dd></div>
</dl>
<a class="mono" href="/forecasts/rounds/2026-07-28/okun-unemployment.json" download>Download artifact · <code>2026-07-28/okun-unemployment.json</code> →</a>
<a class="mono" href="https://github.com/PolicyEngine/macro/blob/main/forecasts/rounds/2026-07-28/okun-unemployment.json">Open on GitHub with commit history →</a>
</article>
</div>
<!-- scorecard-rounds:end -->
<p>
Expand Down
8 changes: 7 additions & 1 deletion forecasts/outturns.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@
"publisher": "ONS",
"dataset": "D7G7 (CPI 12-month rate), quarterly average",
"typical_release_lag": "~3 weeks after month end"
},
"unemployment": {
"series": "UK unemployment rate (aged 16+, SA), level",
"publisher": "ONS",
"dataset": "MGSX, quarterly",
"typical_release_lag": "~7 weeks after quarter end (LFS)"
}
},
"observations": [
Expand All @@ -35,4 +41,4 @@
"release_updated": "2026-07-21T23:00:00.000Z"
}
]
}
}
72 changes: 72 additions & 0 deletions forecasts/rounds/2026-07-28/okun-unemployment.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
{
"schema_version": 1,
"round_id": "2026-07-28",
"archived_utc": "2026-07-28T08:27:48Z",
"model": {
"name": "okun-unemployment",
"description": "Okun's-law satellite: deterministic mapping of the boe-svar UK GDP growth forecast to the ONS unemployment rate (MGSX). Fit du_t = alpha + beta*g_t + gamma*du_{t-1} by OLS on 1992Q1-2025Q1 with 2020Q1-2021Q2 dummied out (furlough decoupled unemployment from GDP): alpha=0.0611, beta=-0.0474, gamma=0.1871, sigma=0.172pp, n=123, R2=0.368.",
"source_pipeline": "PolicyEngine/boe-var-model src/boe_var/okun.py at main (PR #8, merge 302f7ec)",
"generated": "2026-07-28"
},
"information_set": {
"data_edge": "2026Q1",
"forecast_start": "2026Q2",
"first_period": "2026Q2",
"last_period": "2027Q1",
"gdp_input": "archived round forecasts/rounds/2026-07-21/boe-svar.json (data edge 2026Q1)",
"unemployment_input": "ONS MGSX through 2026Q1 (u=5.0, du=-0.2), vintage 2026-07-26"
},
"units": "percent, unemployment rate level",
"variables": [
"unemployment"
],
"caveats": [
"Horizon capped at 4 quarters: the rolling-origin validation (boe-var-model results/okun_validation.json) shows the end-to-end SVAR->Okun forecast beats a random walk at horizons 1-4 ex-COVID (RMSE ratios 0.82-0.99) and is clearly worse beyond 4 quarters.",
"The improvement over no-change is not statistically significant at 73 overlapping origins (Diebold-Mariano p >= 0.14).",
"Bands carry GDP-forecast uncertainty only, mapped through the deterministic Okun equation; Okun residual uncertainty (sigma 0.17pp per quarter) is NOT sampled, so the stated bands understate total uncertainty."
],
"benchmarks": {
"random_walk": null,
"drift": null,
"ar1": null,
"official": null
},
"forecast": {
"2026Q2": {
"unemployment": {
"median": 4.9714,
"lo68": 4.9447,
"hi68": 4.9976,
"lo90": 4.9304,
"hi90": 5.0146
}
},
"2026Q3": {
"unemployment": {
"median": 4.9626,
"lo68": 4.8897,
"hi68": 5.0333,
"lo90": 4.8507,
"hi90": 5.0828
}
},
"2026Q4": {
"unemployment": {
"median": 4.9405,
"lo68": 4.8137,
"hi68": 5.0744,
"lo90": 4.7354,
"hi90": 5.1609
}
},
"2027Q1": {
"unemployment": {
"median": 4.9332,
"lo68": 4.7351,
"hi68": 5.1395,
"lo90": 4.611,
"hi90": 5.2693
}
}
}
}
16 changes: 14 additions & 2 deletions forecasts/scorecard.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
{
"_comment": "Generated by forecasts/score.py \u2014 do not edit by hand.",
"rounds": 1,
"rounds": 2,
"periods_scored": 1,
"next_period_to_score": "2026Q2",
"pending_detail": {
"period": "2026Q2",
"variables": [
"gdp"
"gdp",
"unemployment"
]
},
"status": "1 forecast period(s) scored",
Expand Down Expand Up @@ -41,6 +42,17 @@
"coverage_90": 1.0
}
}
},
{
"round_id": "2026-07-28",
"model": "okun-unemployment",
"data_edge": "2026Q1",
"archived_utc": "2026-07-28T08:27:48Z",
"path": "forecasts/rounds/2026-07-28/okun-unemployment.json",
"periods_forecast": 4,
"periods_scored": 0,
"entries": [],
"by_variable": {}
}
]
}
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ <h2>Latest outturns beside the model's near-term view.</h2>
<tbody>
<tr><th scope="row">Real GDP growth, y/y</th><td>0.9% <span class="mono">2026Q1</span></td><td>1.1% <span class="mono">2026Q2</span> · 68% range 0.6%–1.7%</td></tr>
<tr><th scope="row">CPI inflation, y/y</th><td>2.8% <span class="mono">2026Q2</span></td><td>2.7% <span class="mono">2026Q3</span> · 68% range 1.9%–3.5%</td></tr>
<tr><th scope="row">Unemployment rate</th><td>5.0% <span class="mono">2026Q1</span></td><td>not forecast by the suite yet</td></tr>
<tr><th scope="row">Unemployment rate</th><td>5.0% <span class="mono">2026Q1</span></td><td>5.0% <span class="mono">2026Q2</span> · 68% range 4.9%–5.0% · <a href="/forecasts/">Okun satellite</a></td></tr>
</tbody>
</table>
</div>
Expand Down
18 changes: 18 additions & 0 deletions validation/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,24 @@ <h2>Against a Bank of England paper, and against outturns.</h2>
inflation, and the single frozen-edge result must not be read as broad
GDP forecast superiority.
</p>
<p>
<strong>Unemployment satellite.</strong> The unemployment rate is not
one of the eight VAR variables; the published unemployment outlook is
an Okun's-law satellite — a small regression of the quarterly change
in the ONS unemployment rate on year-on-year GDP growth (fit
1992Q1&ndash;2025Q1 with the furlough quarters 2020Q1&ndash;2021Q2
dummied out, since they decouple unemployment from GDP and attenuate
the coefficient about threefold). In a 73-origin rolling test fed by
the VAR's own GDP forecasts, it beats a no-change benchmark at
horizons 1&ndash;4 excluding furlough targets (relative RMSE
0.82&ndash;0.99) and is clearly worse beyond four quarters, so the
published path is capped at four quarters. The improvement is not
statistically significant at 73 overlapping origins, and the bands
carry GDP-forecast uncertainty only. Specification, code, and the
full skill table:
<a href="https://github.com/PolicyEngine/boe-var-model/blob/main/results/okun_validation.json">okun_validation.json</a>
in the model repository.
</p>
<figure class="vfig">
<svg class="vchart" data-chart="svar-fan" viewBox="0 0 760 340" role="img" aria-labelledby="svar-fan-t svar-fan-d">
<title id="svar-fan-t">boe-svar: out-of-sample forecast fan from the frozen 2024Q2 edge vs ONS outturns</title>
Expand Down