MomusMidterms 2026
Election night in
— The model · every assumption in the open

How the number is made

Two chambers, one simulation. I turn consensus race ratings into win probabilities, shift them with the generic ballot, and then draw 20,000 elections in which every race and district shares one national swing. Seat counts fall out of that, and so does the balance of power — because the same swing that costs Republicans Ohio costs them a dozen House districts on the same night.

Sources: Wikipedia's live tables of the Cook Political Report, Inside Elections, Sabato's Crystal Ball and other raters for the Senate and the House; the generic-ballot aggregator table on the House elections page; Polymarket and Kalshi public APIs for prices. Snapshotted every Monday.

— Step 1

Ratings to probabilities

Rating (consensus = median across raters)P(favoured side)Why
Solid / Safe98%Cook Political Report race ratings, 2006–2022: Solid/Safe seats flipped in roughly 1 in 50 cycles-races.
Likely90%Likely-rated races: the favoured party won about nine in ten.
Lean78%Lean-rated races: favoured side wins roughly three in four.
Tilt60%Used by Inside Elections and Sabato; barely better than a coin.
Tossup50%A coin flip by construction — the environment term, not the label, tilts it.

These are the calibrated part of the model — decades of rating outcomes, rounded conservatively. They are not something a two-month track record could improve on, which is why I do not try. Each probability becomes a margin in points through the normal quantile with a race σ of 4.5.

— Step 2

The polling layer

Raters already see the polls, so the generic ballot does not get counted twice. What moves my numbers between rating changes is the change in the generic ballot since the ratings baseline, at half weight: raters update, just slowly.

Generic ballot now D+6.4Baseline D+6.4Shift applied to every race 0.0 pts (R)
Aggregators: Decision Desk HQ D+6.4 · FiftyPlusOne D+6.2 · RealClearPolitics D+6.4 · Silver Bulletin D+6.6 · VoteHub D+6.2 · Race to the WH D+6.4 (updated August 30, 2026).

For the House there is a second leg: a uniform-swing model that takes each district's Cook PVI, adds the national margin the generic ballot implies (against R+2.6 in 2024) and 1.5 points of incumbency. The ratings leg and the swing leg are blended 60/40 per district.

— Step 3

Correlation, the whole point

Polls miss together. 2016 and 2020 missed toward Republicans nationally; 2022 the other way. A model that treats 35 Senate races as independent prices a sweep far too low. Every simulated election draws one national swing (σ 2.8 points, the historical generic-ballot miss in midterms) and adds independent race noise (σ 3.5) on top. Senate and House are drawn in the same pass, which is what makes the balance-of-power probabilities honest.

Senate control needs 50 Republican seats (the Vice President breaks the tie); Democratic control needs 51 caucus seats. House control is 218. Seats not on the ballot, and House districts every rater calls safe, are carried as fixed.

— Where I can be wrong

The honest list

A systematic polling miss

If the generic ballot is off by four points in one direction, my whole map moves with it. That risk is in the tails, but the centre of my distribution follows the polls.

Ratings that lag

Consensus ratings are updated by humans on their own schedule. A race can be lost weeks before a rater moves it; the polling layer only softens that.

Candidate quality and late shocks

Scandal, a bad debate, a primary upset — none of it is modelled until a rater or a poll reacts to it.

Turnout composition

Midterm electorates are older and smaller. I do not model who shows up, only how the vote splits.

Thin markets

Seat-bucket markets are illiquid; a price of 3¢ can be one trader. I size accordingly and never claim an edge where nobody is on the other side.

One resolution night

A single election is one draw from the distribution. Judge me on the weekly calls, the Momus Line and the Brier score against closing prices, not on one number being right or wrong.