Real GDP growth across AMECO vintages - vintages-gdp

Data - AMECO

Each AMECO vintage (spring: May, autumn: November) contains the European Commission’s forecasts. Real GDP growth is computed from the level series of each vintage. Black: latest vintage.

Growth paths, vintage by vintage

France, Germany, Italy, Spain (2015-)

Code
gdp_growth |>
  filter(COU %in% countries_4) |>
  plot_vintage_paths("Real GDP growth", from = 2015)

Without the Covid year (2017-2019, 2022-)

Code
gdp_growth |>
  filter(COU %in% countries_4, !year %in% 2020:2021) |>
  plot_vintage_paths("Real GDP growth", from = 2017, accuracy = 0.5)

One target year, successive forecasts

2020 (Covid), 2022, 2023, 2025

Code
gdp_growth |>
  filter(COU %in% countries_4) |>
  plot_target_year(c(2020, 2022, 2023, 2025), "Real GDP growth")

2012-2014: the euro crisis

Code
gdp_growth |>
  filter(COU %in% c("FRA", "DEU", "ITA", "ESP", "GRC", "PRT")) |>
  plot_target_year(c(2012, 2013, 2014), "Real GDP growth")

Forecast errors

Latest vintage minus the autumn forecast made the previous year, in percentage points. Positive: growth turned out stronger than forecast.

Autumn t-1 forecast vs. latest estimate

Code
gdp_growth |>
  filter(COU %in% countries_10) |>
  error_heatmap(lag_years = 1)

Spring t forecast vs. latest estimate (in-year)

Code
gdp_growth |>
  filter(COU %in% countries_10) |>
  mutate(vintage_year = vintage_year) |>
  error_heatmap(lag_years = 0, ref_season = "spring")

Average absolute error, autumn t-1 forecast, 2012-2019 vs. 2022-2024

Code
ref <- gdp_growth |>
  filter(season == "autumn", COU %in% countries_10) |>
  filter(year == vintage_year + 1) |>
  select(COUNTRY, year, forecast = value)
fin <- gdp_growth |> filter(vintage == latest_vintage) |> select(COUNTRY, year, latest = value)
inner_join(ref, fin, by = c("COUNTRY", "year")) |>
  mutate(period = case_when(year %in% 2012:2019 ~ "2012-2019",
                            year %in% 2022:2024 ~ "2022-2024")) |>
  filter(!is.na(period)) |>
  group_by(COUNTRY, period) |>
  summarise(MAE = mean(abs(latest - forecast)) * 100, .groups = "drop") |>
  ggplot(aes(x = reorder(COUNTRY, MAE), y = MAE, fill = period)) + theme_minimal() +
  geom_col(position = "dodge") + coord_flip() + xlab("") +
  ylab("Mean absolute forecast error (pp of GDP growth)") +
  scale_fill_viridis_d(end = 0.7) + theme(legend.position = "bottom", legend.title = element_blank())