Blog/Analysis

How we successfully forecasted the German election results

February 28, 2025

At the start of the year, we created an internal model to forecast the German election results, covering three key areas:

  • The number of votes and seats won by each party
  • The probability of each coalition gaining a majority
  • The probability of each coalition forming the next government

What did we create?

First, we needed to create some polling averages, so we designed a model which would detect meaningful trends in voting intention while avoiding overreaction to noise. This model combines an exponentially-weighted moving average (i.e. weighting polls based on recency) with polynomial regressions within polling windows to identify trends in recent polls. The poll aggregation model was inspired by FiveThirtyEight’s methodology, and was successfully used internally for the UK general election last year.

Our model was trained on historic polling data and optimised to predict final election results rather than the next set of polls. This approach allowed it to identify genuine shifts in voting behaviour while remaining stable during campaign fluctuations. For example, when the AfD experienced brief polling surges, our model correctly maintained a measured response rather than dramatically adjusting their predicted vote share.

Next, we needed to determine the potential movement we might see in the polls by the time of the election, so we needed to simulate potential vote share ranges for each party based on historic election campaign polls, accounting for both time until the election and current polling averages – with higher polling numbers allowing for greater variation in outcome. For example, a German party polling 25% a week before the election would obtain a national vote share in the 21–29% range in 95% of elections.

Parties don’t move independently of each other, though. Think about the UK context – if the Conservatives were to drop in the polls, we would probably expect Reform UK would rise, but the Conservative collapse wouldn’t tell us much about how the Greens had moved. The same applies to Germany, so we created a correlation matrix of vote shares based on the relationship between party polling movements over time. BSW and the Left, for example, are negatively correlated with each other, meaning that the better the Left did in our simulations, the less likely BSW were to make the 5% threshold for seats in the Bundestag. The Left’s late surge in the election campaign and 9% vote share likely contributed to BSW just missing the 5% threshold last week.

We also needed to configure our model to work in the German election system, meaning we had to model the probability of each party winning at least three constituency seats. In Germany, parties which fall beneath the 5% national vote threshold can still make it into parliament if they win three constituencies. To do this, we used a proportional swing model to adjust public MRP results to the national vote share in each of our simulations, and then used our correlation matrix to simulate winners in each seat.

Finally, once we had our vote shares and seat shares in each simulation, we needed to determine which parties would form the next government. We created a coalition model using historic coalition formation rates at the federal and state levels, alongside a few other factors. For example, when such a coalition is viable, the CDU will very likely try to govern with their natural partner, the neoliberal FDP, in a ‘Tigerenten’ coalition (named after the black and yellow striped duck from German children’s books). On the other side of the spectrum, the SPD will typically seek out collaboration with the Greens, in a less creatively named ‘red-green’ coalition.

As national coalitions can differ from state ones, and historic coalitions are not necessarily applicable to 2025, we applied weights to our historic model based on public statements from party leaders during the 2025 election campaign. For example, CSU leader Markus Söder said no to working with the Greens, so historic CDU/CSU + Green (‘kiwi’) coalitions got down-weighted in our model.

What did the model predict?

On election day, our model’s final output correctly predicted all parties’ seat counts within our 95% confidence intervals, with 5/7 parties (71%) within our 66.7% confidence intervals.

During the campaign, our model also captured the Left surge relatively early and calculated a greater than 50% chance of the party winning seats three weeks before election day, when their best poll result up to that point was only 5%.

Despite some late movement toward the AfD, our model showed little doubt that CDU/CSU would finish with the most seats on election night – even three months before the election. We observed the eventual finishing order of CDU/CSU, AfD, SPD, and Greens solidify as the campaign progressed, with the probability of this exact order reaching 83% by election day.

The likely next government – a grand coalition between the CDU/CSU and SPD – remained more likely than not throughout the entire election campaign. A three-party ‘Kenya’ coalition – adding the Greens to the equation – climbed to a 21% likelihood by election day. This coalition would have been necessary had BSW finished just 0.03 percentage points higher on Sunday.

On-the-night modelling

We also built an ‘on-the-night’ model to update our forecast throughout election night, incorporating exit polls and extrapolations alongside live seat results. This model accounted for historical exit poll accuracy and tracked the shifting coalition probabilities as the results came in. By approximately 10pm UK time, our model showed the likelihood of a Grand coalition had increased to a 2-in-3 chance.

--

All in all, a very successful election for us here at Focaldata. If you’re interested in polling or forecasting from us on any upcoming elections, please get in touch!

Image source

Stay connected

Subscribe to get the Focaldata AI newsletter delivered directly to your inbox.

Subscribe