It has been a decades old tradition in my family to do soccer prediction games whenever there is a World Cup or a Euro Championship. Every two years, we’d get another game going, try to predict scores for all games, and get points for it.
It wasn’t until the World Cup in 2018, if I remember correctly, that I got curious about using statistics and math to help with predictions. That was when I found Nate Silver’s statistical analysis site at fivethirtyeight. Alongside political statistics, he was having parts of the site dedicated to various sports. This included national and club soccer team predictions. For the 2018 world cup, I used his publicly available goal projections and Monte Carlo simulations to inform my predictions in my family’s game. I took 538’s projected goals and built my own spreadsheet that would run them through a Poisson distribution table to give me probabilities for each result as well as tell me how many expected points I would get in the prediction game - and I won the prediction game as a result. In that year, I learned a lot about approaches to goal projections.

Later, by 2023, fivethirtyeight was taken over by ABC and their sports analysis was completely shut down. Nate Silver had left the company and, as I write this now in 2026, fivethirtyeight is completely dead, not even doing political analysis anymore. When the next tournament came around, I was thus lacking reliable goal projections to use as a base. It quickly became clear to me that I need to go beyond just doing a Poisson sheet and cover the entire process of the prediction myself.
I remember looking around at other sources for inspiration and predictions, but nevertheless I started looking into building my own thing. As a Ruby script, I created my very first prediction model. Using the database of all games in national soccer history from the amazing GitHub repo over at martj42/international_results, I got my first attempt at projecting goals going, calculating projected goals and plugging them into my existing spreadsheet. A lot of tuning and tweaking a what was (and still is) a relatively simple amateur model went into it. It wasn’t perfect but it gave me results that looked acceptable. And more importantly, instead of using Nate Silver’s professional predictions, I was now using calculations that were all entirely my own. If they ended up being good or bad, if I won or lost the prediction game, it was all on me. That kinda felt good and fun.
Fast forward into this year with the World Cup 2026, I stopped using Microsoft Office and Excel (which my spreadsheet was made for). Converting to LibreOffice was not a big issue but I found the process of running my external script and importing the data for predictions to be convoluted and not very handy. Especially if I want to access my prediction data remotely. It was time for the next step. It was time to turn this all into a proper app.
And thus, being a thorough enjoyer of the Svelte framework, I decided to rewrite the entire thing into a web app.
I am happy to share my national team prediction site at https://www.mystler.eu/xg/.

Let me go into some more detail on what exactly this does.
First of all, my tool automatically fetches the latest results from martj42’s result database. It calculates an ELO Rating for each team. The calculations for the ELO Ratings are based on the general ELO math as explained on its Wikipedia page as well as weight factors as used by eloratings.net, a rating site that is often seen as better than the official FIFA World Rankings. Of course, the current ratings can always be looked up on my site.
When a user now enters two teams to compete against each other, my site begins its prediction math. This process was inspired by xgscore.io. Originally, I was just using weighted averages of all historical games in a certain time frame to get scored and conceded goals for each team. But for this rewrite, I decided to follow xgscore’s example and improve the process by looking at categories of games. My tool will collect the last few results in Head to Head games, Most Recent games, and games against similarly strong opponents as the intended opponent based on their ELO rating. The weights for all of these come with defaults (and recency weights) that I found lead to decent results but they can all be manually tweaked on the site. Then, they are combined into a final average of goals scored and conceded for each team. Based on the ELO win probability for each team (e.g. a 60%/40% team weight) they are again combined into the final projected goals for the game.
With the projected goals calculated, these are passed into a Poisson table. Similar to my spreadsheet, this table shows expected probabilities for various results and calculates expected points (XP) in a prediction game. The projected goals (if you want to compare with another source), the prediction game points, or even live approximations with only a certain amount of time left, or the possibility include extra time, can be adjusted by the user.
Fun bonus fact: Based on Nate Silver’s old blog posts, I remember him calculating that every red card usually translate into a +0.55 and -0.55 expected goals over 90 minutes for each team respectively. That is why my tool supports red cards too. It is a gimmick and I do not know if there is more recent data but I like having it around as a stat that goes way back to my original first spreadsheet in 2018.

As I write this, the World Cup has two games still left to be played but I have already cleanly won the prediction game, with all of the semi-finalists and finalists that I predicted before the tournament having come true. Of course, my prediction tools are just a naive model that is far from perfect. But it does seem to yield reasonable results and while statistics cannot know how any specific game is going to end, the regression to the mean is a thing. Upsets are fun and exciting but in the end the stronger teams tend to prevail. I am happy I tackled this project this year and turned my spreadsheet into a website I can access from anywhere (even install it as a PWA on my phone) and get some predictions.
If you are curious, feel free to check it out and play with it yourself. I intend to keep this running and tweak it as necessary for future tournaments.

