METHODOLOGY: RETIRED
GFS Ensemble Weather Trading
How raw ensemble members can be counted into a probability for Kalshi weather markets, why we built our bot that way, and what happened when we measured it.
This page describes a model we no longer use
Predict & Profit priced weather contracts this way through v2.4. In August 2026 we measured it against the settled record and replaced it. Across 112 settled trades the member-counting model scored a Brier of 0.2858, against 0.2439 for simply predicting the base rate. It was worse than not modelling at all.
The current model is NOAA's National Blend of Models. If you want what the bot does today, read how it works. This page is kept because the reasoning below is still worth reading, and because the way it failed is more useful than the way we thought it would work.
What Is GFS and Why Does It Run 31 Simulations?
The Global Forecast System is NOAA's operational numerical weather prediction model. It runs four times per day, producing forecasts out to 16 days. The standard GFS product most weather apps show you is just one of those runs, the control run with best-estimate initial conditions.
The GFS ensemble is different. NOAA runs 31 slightly perturbed versions of the same model, each starting from a slightly different initial state, because the atmosphere is a chaotic system. Small differences in the current state compound over time. By running 31 perturbations, NOAA captures the range of plausible future states.
When all 31 members agree, the forecast looks high-confidence. When they spread apart, the atmosphere is in a sensitive state where small uncertainties compound into large outcome differences. That spread is information. Whether it is calibrated information is the question this page ends on.
Converting Ensemble Output to a Probability
Converting 31 temperature values into a probability estimate for a specific threshold is a counting problem at its simplest. Count the members where the predicted temperature exceeds the Kalshi threshold. Divide by 31. That is your GFS probability.
# Example: DC high temperature > 55°F tomorrow
members = [57.2, 54.8, 58.1, 56.3, 53.9, ...] # 31 values
above_threshold = sum(t > 55.0 for t in members)
probability = above_threshold / len(members)
# 26 members above 55°F → probability = 0.84
In practice the pipeline is more involved: pulling member forecasts from the Open-Meteo API at city coordinates, interpolating to the correct forecast hour, and aggregating across the daily window to match how Kalshi defines a daily high. But the core logic is the count, and the count is where the problem turned out to live.
What AIGEFS Adds: AI Architecture and Project EAGLE
In December 2025, NOAA launched Project EAGLE, the AI Ensemble Forecast System (AIGEFS). It is built on Google DeepMind's GraphCast architecture, retrained on NOAA's own historical observational data. Like GFS, it runs as 31 ensemble members.
GraphCast represents a fundamentally different approach to weather prediction. Instead of solving the partial differential equations that govern fluid dynamics forward in time, which is what traditional models like GFS do, GraphCast uses a graph neural network trained to predict how the atmospheric state evolves. It learns from data rather than from physics first principles.
That architectural independence is real, and it is the reason the argument below was persuasive. GFS errors and AIGEFS errors are not perfectly correlated. When both systems err, they tend to err differently.
What We Built: Four Centers, 164 Members
We paired NOAA GFS and AIGEFS with ECMWF IFS and AIFS-ENS, so the stack was not dominated by a single institution's model family. That gave up to 164 members across four independent centers. The combined probability was a weighted aggregate: each member effectively voted on whether the temperature would exceed the threshold, and a trade required at least three of the four systems to agree on direction.
The reasoning was sound as far as it went. Published verification work does show multi-center ensembles outperforming single-vendor stacks on temperature skill at the 1 to 7 day range, which is the window that matters for Kalshi daily contracts. More independent information really is better than less.
The error was in assuming that a better forecast automatically yields a better probability. Those are different problems, and only the second one prices a binary contract.
Why We Retired It
A Brier score measures how well probabilities are calibrated. Lower is better, and the benchmark that matters is not zero, it is what you would have scored by ignoring the model entirely and always predicting the historical base rate.
[ MEASURED ] 112 settled trades
164-member grand ensemble: Brier = 0.2858
Always predict base rate: Brier = 0.2439
→ Negative skill. The model subtracted information.
Two mechanisms explain it, and both are invisible if you only look at whether the forecast direction was right.
Ensemble spread was far too narrow. On overnight minima, the spread across members was between 2.1 and 4.0 times narrower than the actual distribution of outcomes. Counting members therefore produced confident probabilities, 0.90 and 0.05 and so on, for outcomes that were genuinely much closer to even. Overconfidence is exactly the failure mode that destroys a Brier score, because it is punished quadratically.
Gridpoint bias reached 7°F. Raw model output at a grid cell is not a forecast for a weather station. It carries systematic local bias that a physics model has no mechanism to remove. Kalshi settles on a specific station reading, so a bias of several degrees against that station is a bias against the thing being priced, no matter how many members agree.
What Replaced It
NOAA already solves both problems, and publishes the answer. The National Blend of Models is the operational product that takes raw model guidance and calibrates it: bias-corrected per station, against the very observations the station reports. It publishes mean, standard deviation and percentiles at individual stations, including the exact stations Kalshi settles on.
So the bot no longer counts members. It interpolates NOAA's published percentiles directly, uses normal tails beyond P10 and P90, and widens sigma by 1.15 because real temperature outcomes have fatter tails than a Gaussian. NBM carries a weight of 0.75. The five raw systems, GFS, AIGEFS, ECMWF IFS, AIFS and HRRR, keep a combined 0.25 as a disagreement check. They still carry signal. They are no longer the basis of the decision.
One consequence is worth stating plainly, because it costs candidates: NBM coverage begins at forecast hour 24, so the bot no longer trades same-day markets at all. Rather than fall back to the model on this page, it declines to price what it cannot price.
What This Should Tell You About Any Forecast Edge
The typical Kalshi weather trader checks a point forecast: one number, no uncertainty estimate. Reaching for an ensemble instead is the right instinct, and we would make that move again.
The lesson is narrower and less flattering. A member count is not a probability. It is a statistic about a model's internal disagreement, and it only becomes a probability if that disagreement happens to be calibrated against reality. Ours was not, and we did not find out by reasoning about it. We found out by scoring 112 settled trades against a benchmark that a model has to beat to be worth running.
If you are building something similar, the transferable part is not the architecture. It is the habit of computing what your model would have to beat, and then checking whether it does.
Related Reading
Read the Code That Replaced It
The NBM pipeline, the percentile interpolation, the raw ensemble cross-check, the inflation bot and the edge scoring system are all included in the Predict & Profit Python source code. So is the changelog documenting what is still open.
Get the Source Code — $75