← kevinmdeluca.com  ·  PLSC 2219 · Yale University

Election Forecast Tracker

Six ways of forecasting the 2026 midterms, collected every day and shown side by side. The display is the disagreement between methods, not another trend line.

Election day 3 Nov 2026 days out Snapshot 2026-09-09 598 dates on the chart
This page has not updated in days. The daily collection may have stopped. Everything below is still the snapshot named above, not today's.

What this is

A daily archive of other people's 2026 midterm forecasts, plus two models built in the open as course material.

PLSC 2219 is a Yale undergraduate course on midterm elections and forecasting. Students build models across the term. This site is the shared evidence base they build against: every day it captures what each published forecast said, stores the raw bytes unchanged, and re-derives the tables and charts from that store.

The display is the disagreement between methods, not another trend line. There are already many good single-number forecasts, and one more would add little. What is harder to find, and what a class can actually learn from, is a like-for-like view of how far apart five different ways of forecasting the same election are on the same day — and how that distance moves as the election gets closer.

Nothing here is advice about how to bet, and the class models are teaching artefacts rather than a serious attempt to beat the professionals.

What is in each category

Five categories, each a family of forecasts that share a way of knowing. A forecast is filed by how it reaches its answer, not by who published it.

CategoryWhat its members have in commonWhat it cannot see
PollingStarts from what people tell pollsters, then averages, weights, or corrects for how early it is.Whether the polls are wrong in the same direction as last time. Poll averages inherit poll errors.
MarketsPrices from people betting money — an aggregate of everyone else's models plus whatever traders think they know.The difference between a price and a probability: thin volume, fees, and a last trade that may be hours old.
FundamentalsPredicts from conditions rather than opinion: the economy, presidential approval, how many seats each party is defending. Fit on past midterms.Candidates, scandals, and everything that has happened since the last election it was fit on.
ProfessionalPublished statistical forecasts combining most of the above plus candidate quality, fundraising and local knowledge. Collected daily. Individual forecasts appear only where the publisher's terms allow it, so this family shows an average when enough of them do. More.How much of its own method a reader can check. These are documented in outline rather than published as equations.
AcademicPublished political-science specifications, run by us on inputs we collected ourselves. The equation is somebody else's and is cited; the numbers going into it are ours.Whatever the paper left out. Each was fit on the midterms available when it was written, and none has been re-estimated for this one.

Expert ratings — “Lean R”, “Toss-up” — are collected but kept out of all five averages. They are ordinal, and choosing which number to turn “Lean R” into is a modelling decision we would rather argue about in class than bury in a script. They get their own graphic instead.

What is not published, and why

Some of what this archive collects cannot be shown during the cycle. The restriction is in the code, not in a policy document.

51302 cells are withheld in today's snapshot.

Every source carries a publication tier taken from its licence. Sources that permit it are published by name. Sources that do not are used only inside a category average, and that average is published only when it has at least three such contributors — otherwise a reader who knows two of the numbers could recover the third by subtraction. A handful of inputs are held privately for the whole cycle and never published in any form.

The point is not secrecy. It is that a forecaster who publishes for their own audience has not agreed to have their live numbers mirrored somewhere else during the election. The full per-forecaster archive is released, documented and citable, after the votes are counted.

The rule is enforced in code that audits its own output and refuses to write anything if the audit fails. A rule you have to remember is a rule you will forget at 11pm in late October.

How it is built

Two phases that never touch each other's job.

PhaseWhat it does
CaptureFetches each source once a day and stores the bytes exactly as received. It never parses. A parser bug is then always recoverable, because the original is still on disk.
ParseReads the store and never fetches. Re-running it on a two-year-old snapshot gives the same rows it gave then.
ModelThe site's two models, run from public inputs only.
AggregateThe privacy boundary. Everything upstream is private; everything it writes is public.
PublishLays out the charts and writes the single JSON file this site is built from.

Every source, with its link, its licence and what we are allowed to do with it, is listed on the methods page. The code is in the repository.

Why a line can step without anyone changing their mind

A category average is the mean of whoever is in the category that day, and the membership changes.

Each line on the tracker is the average of the forecasts in that family on that date. When a family gains or loses a member, the average moves, and nobody’s forecast has changed. That has happened here more than once: a family that held one model on Monday and five on Tuesday steps on Tuesday, and every point of the step is bookkeeping.

The number plotted is the plain mean of that day’s members, and the member count is shown beside it. That is the honest answer to “what does this family predict today”, which is the question a tracker is read for. It is not the honest answer to “how much has this family moved”, and the two come apart whenever membership is unstable.

What we tried instead, and why we stopped

The archive used to carry a second version of every category average, a chained level computed the way a price index handles a change of basket: rather than comparing today’s members with yesterday’s different ones, compare those present on both days and carry the level forward by that change. It was the headline until 25 August 2026, and it was removed from the published data on 27 August 2026.

Three faults, all measured on this archive. A chained index is path‑dependent, so where it ends up depends on the order models happened to arrive; on 26 August the fundamentals margin read D+8.0 as a mean of its five members and D+2.9 as a chain. A model that joins contributes only its subsequent changes and never its level, so the index drifts away from the members it claims to describe and does not come back. And each quantity chains on its own, while a seat count is not a linear function of a national margin, so a chained margin and a chained seat count stop corresponding by construction — which is how a chained D+2.9 came to sit beside a projection of 235 seats, a number no D+2 environment produces.

The published level is the plain mean, which is the only line for which “this is what the field said on that date” is simply true. The membership problem is handled instead by estimating each model’s persistent lean once, fixing it, and subtracting it before averaging. That correction cannot depend on arrival order, never changes a date that has already been published, and does nothing at all on days when every member reported.

The practical consequence for a reader: a step in one of these lines is not always news. Check the member count beside it. Where the count changes on the same day as the level, the step is the family being redefined, not a forecast being revised.

Use of AI

Stated plainly, because a site about where numbers come from should say where its own code came from.

The data collection pipeline and this website were built with substantial help from Claude Opus 5, Anthropic's language model, used as a programming assistant under my direction. That covers the capture and parsing code, the aggregation and disclosure logic, the charts, and the page templates. Design decisions, the choice of sources, the modelling choices, and the editorial framing are mine.

No forecast on this site is produced by a language model. Every number is either transcribed from a named source by a deterministic parser, or computed by the site's two models, whose code is in the repository and whose assumptions are listed on the methods page. The model does not decide what a race is worth, and it never sees a number that is not already in the archive.

Errors are mine regardless of what wrote the line. If something here looks wrong, it probably is — please tell me.

Credits and reuse

CoursePLSC 2219, Midterm Elections and Forecasting, Yale University
InstructorKevin DeLuca, Department of Political Science
Race ratings© their respective forecasters, transcribed from Wikipedia under CC BY-SA 4.0
Official returnsMIT Election Data and Science Lab (CC0)
Economic dataFederal Reserve Bank of St. Louis (FRED)

Student forecasts are not published during the cycle, and there is no leaderboard. At the end, with the winner’s consent, the prize-winning predictions are shared.