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.
| Rating (consensus = median across raters) | P(favoured side) | Why |
|---|---|---|
| Solid / Safe | 98% | Cook Political Report race ratings, 2006–2022: Solid/Safe seats flipped in roughly 1 in 50 cycles-races. |
| Likely | 90% | Likely-rated races: the favoured party won about nine in ten. |
| Lean | 78% | Lean-rated races: favoured side wins roughly three in four. |
| Tilt | 60% | Used by Inside Elections and Sabato; barely better than a coin. |
| Tossup | 50% | 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.
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.
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.
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.
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.
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.
Scandal, a bad debate, a primary upset — none of it is modelled until a rater or a poll reacts to it.
Midterm electorates are older and smaller. I do not model who shows up, only how the vote splits.
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.
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.