About · Win chance
How win chance works
Chudlock gives a chance of winning in three places: before a game from the two lineups, through a game from its score, and inScout for any team you build. This page says what goes in, how it is worked out, how often it was right on matches it had never seen, and when it was last fitted. Nothing here is hidden.
At a glance
How sure is it? Before the game, not very. Heroes alone say a fair amount but never settle a match: even when it gave a side 60% or more, that side won 65.7% of the time. During the game it becomes sure only as the game does: 58% right at three to five minutes, 70% at fifteen, 81% late on. A chance is a chance. An 80% side loses one game in five, and that is the model working, not failing.
Before the game
The inputs are the six heroes on each side, and, in ranked games only, how far apart the teams' average ranks are. Unranked games record no ranks. The model is a logistic regression, which adds up pieces of evidence on the log-odds scale and turns the total into a chance:
- Hero strength: every hero on one side adds its own number and every hero on the other takes it away.
- Head to head: each hero against each hero on the other side (757 pairings kept), such as Haze into Seven.
- Together: each pair on one side (719 pairings kept), for heroes that work well or badly together.
- Rank gap: 0.40 on the log-odds scale per tier of difference in average rank, when at least four of six players on each side have a rank.
- Map side: a tiny edge (−0.011) that the match page uses. Scout does not, because it does not know your side.
It was fitted on 1,349,022 standard matches from 10 October 2026 to 20 October 2026: six against six, ranked or unranked, no bots, scored, five minutes or longer. Pair effects are pulled hard towards zero (a ridge penalty chosen on 219,802 later matches), so a pairing needs plenty of games before it moves anything. The numbers below are for the model exactly as shipped, on 446,255 matches from 20 October 2026 to 23 October 2026, which it never saw. That window includes a game update on 20 October, so it is a fair test of a model going a little stale.
| What the model sees | Picked the winner | Log loss |
|---|---|---|
| Nothing (a coin flip) | 50.0% | 0.6931 |
| Only the map side | 50.6% | 0.6931 |
| + hero strengths | 59.3% | 0.6665 |
| + head to head | 59.6% | 0.6650 |
| + together | 59.7% | 0.6645 |
| Shipped (+ rank gap, weights rounded, tiny pairs dropped) | 59.7% | 0.6642 |
Log loss is lower when the chances are better as well as the picks: a coin flip scores 0.6931, and perfect confidence in the right side would score 0. Almost all the gain comes from which heroes are picked. Pairings add a little, and they matter more for explaining a lineup in Scout than for predicting it. On ranked matches it picked the winner 58.1% of the time and on unranked 60.0% (67,008 and 379,247 matches). The strongest hero in the fit is worth 0.31 on the log-odds scale; the weakest −0.26.
Calibration before the game
Each dot is a bucket of sides. Across is the chance the model gave them; up is how often they won. A model that is exactly right sits on the dashed line, and the bars are 95% ranges. Every match counts twice, once from each side.
| Chance given | Sides | Mean given | Actually won |
|---|---|---|---|
| under 40% | 206,608 | 32.9% | 34.3% |
| 40–42% | 43,372 | 41.0% | 41.8% |
| 42–44% | 46,008 | 43.0% | 43.5% |
| 44–46% | 48,604 | 45.0% | 45.2% |
| 46–48% | 50,521 | 47.0% | 47.1% |
| 48–50% | 51,113 | 49.0% | 48.8% |
| 50–52% | 51,171 | 51.0% | 51.2% |
| 52–54% | 50,521 | 53.0% | 52.9% |
| 54–56% | 48,604 | 55.0% | 54.8% |
| 56–58% | 46,008 | 57.0% | 56.5% |
| 58–60% | 43,372 | 59.0% | 58.3% |
| 60% or more | 206,608 | 67.1% | 65.7% |
The mean gap is 0.8 points and the worst is 1.37. The model leans a little too sure at the extremes: sides it gave 60% or more averaged 67.1% and won 65.7%. Matches later than the fit are always a bit different, which is why it is refitted.
During the game
Two models, both logistic, fitted on 5,905,180 moments from 674,476 matches. A moment is one of the net worth samples the game records every three to five minutes (3:00, 6:00, 9:00, 12:00, 15:00, then every five), with the winner as the answer. Each is tested on 3,920,663 moments from 446,255 matches played later.
- Game time and the souls lead. The lead's weight changes through the game (it is allowed a different slope at 3, 10, 20, 30, 45 minutes, joined in straight lines), so a 3,000 soul lead means far more at nine minutes than at thirty-five.
- Buildings taken, by type: Guardians, Walkers, Base Guardians, Shrines, the Titan. Each side's count, one minus the other. The Core is left out: destroying it ends the match.
- Mid Boss claims so far, and in the last four minutes (the full model only).
- Heroes dead right now, from exact death and respawn times, and kills in the last 90 seconds (the full model only).
- Players who have left (the full model only).
The live model uses the first two lines only, because that is all a live match listing shows. It is the one behindwinChanceNow, used by the live board. The full model is what the match page's win line uses, with the exact second of every event.
| On unseen matches | Picked the winner | Log loss | Brier |
|---|---|---|---|
| Net worth lead and time only | 69.7% | 0.5599 | 0.1918 |
| Live model (adds buildings) | 70.4% | 0.5473 | 0.1872 |
| Full model (adds Mid Boss, deaths, leavers) | 70.6% | 0.5442 | 0.1860 |
| A boosted-tree benchmark on the same inputs (not used) | 70.6% | 0.5438 | 0.1859 |
The black-box benchmark is there to show what a readable model gives up. The two differ by 0.0003 in log loss, which is nothing, so the readable one is the one we use.
Accuracy by game time
| Minute | Moments | Picked the winner | Log loss |
|---|---|---|---|
| 3–5 | 446,255 | 58.3% | 0.672 |
| 6–8 | 446,240 | 61.7% | 0.649 |
| 9–11 | 445,915 | 65.7% | 0.616 |
| 12–14 | 445,057 | 68.1% | 0.591 |
| 15–17 | 443,326 | 70.1% | 0.565 |
| 18–22 | 437,166 | 74.1% | 0.510 |
| 23–27 | 416,558 | 77.9% | 0.453 |
| 28–32 | 357,291 | 81.1% | 0.400 |
| 33–40 | 382,805 | 81.5% | 0.397 |
| 41–60 | 98,780 | 76.1% | 0.488 |
It is little better than a coin flip at the first sample and sharpens as the game goes on. It dips after forty minutes. There are few such moments, and games that run that long tend to be close. Ranked matches: 70.1%. Unranked: 70.7%.
Calibration during the game (full model)
| Chance given | Sides | Mean given | Actually won |
|---|---|---|---|
| 0–5% | 324,258 | 2.2% | 1.8% |
| 5–10% | 251,945 | 7.5% | 7.2% |
| 10–20% | 547,228 | 15.2% | 15.6% |
| 20–30% | 688,922 | 25.2% | 25.9% |
| 30–40% | 915,757 | 35.3% | 35.6% |
| 40–50% | 1,192,553 | 45.1% | 45.2% |
| 50–60% | 1,192,553 | 54.9% | 54.8% |
| 60–70% | 915,757 | 64.7% | 64.4% |
| 70–80% | 688,922 | 74.8% | 74.1% |
| 80–90% | 547,228 | 84.8% | 84.4% |
| 90–95% | 251,945 | 92.5% | 92.8% |
| 95–100% | 324,258 | 97.8% | 98.2% |
The mean gap is 0.31 points and the worst is 0.68, across buckets of at least 200 sides.
Between the samples
Net worth is only recorded every three to five minutes, but kills, buildings and the Mid Boss are timed to the second. To draw a line, the lead between two samples is bridged. Each event moves it by a fitted amount at the second it happened, and what is left over is spread evenly. The amounts are about 126 souls plus 77 for each minute into the game for a kill, then 1,373 for a Guardian, 3,702 for a Walker, 1,818 for a Base Guardian, 1,506 for a Shrine and 3,335 for the Mid Boss. They explain 81% of the change in the lead between samples. To test it, we hid each sample and rebuilt it from its neighbours: a straight line was out by 6,501 souls (root mean square) and the bridge by 3,494, 46.3% closer, over 3,920,663 samples.
Because the bridge leans on the sample after, the match page's line is drawn after the fact and not a forecast. The accuracy above is for the exact moments the game recorded, not the bridged ones in between.
On the live board
The live board shows a win chance on every standard game in progress. It uses the live model: game time, the souls lead and the buildings each side has taken, read from the list's own objective flags. Street Brawl gets none, and a game under three minutes old says it is too early.
A live list is not quite the data the model learned from, so we checked. We watched 5 games on the list every three minutes, then looked each one up after it ended (27 Oct 2026). That is few, so treat the numbers as good to a few per cent, not exact. Two things came out.
- The clock. The list's start time is the lobby's. The game's own clock, which the model uses, starts about 160 seconds later, so a card takes that off. We found it from the buildings: the match record says the second each one fell, and the list shows when it was first gone. In the four games we watched most closely that put the offset between 131 and 166 seconds, 103 and 188, 146 and 168, and 178 and 219. The pre-game wait is not the same length every time, so a card can be about 30 seconds out. That moves a chance by less than a point.
- Souls. Once the clocks line up, a team's souls on the list match the finished record's: the ratio was 0.97 (0.93 to 0.99 across the offsets above, over 5 games). Using it would move a chance by less than a point, so no correction is made. A first comparison that ignored the clock made the two look 15 to 20% apart. That was the clock: in the middle of a game, souls grow by 15 to 25% in two and a half minutes.
How sure it is. Each card calls the chance an estimate and says how big the edge is. It also says how often this model picked the winner around that minute, on matches it had never seen: 58% at minutes 3 to 5, rising to 81% at minutes 28 to 32. The list can be up to three minutes old, and the clock offset is only known to about 20 seconds, so a card is a little behind and a little fuzzy. Everything under "What it cannot do" applies.
The two numbers are LIVE_CALIBRATION in lib/live/win-chance.ts. They should be measured again after a patch that changes the economy or the pre-game timer.
Swings and win impact
On a match page, the chance just before and just after every kill, building and Mid Boss claim is that event's step. Events within 25 seconds of each other are one swing. A swing is listed if it moved the chance by 5 points or more (the biggest 6 are shown). A fight that trades evenly is not a swing. Each swing is named by whatever moved the chance most inside it: a teamfight, a skirmish, a pick, a building or the Mid Boss. Where a swing has a fight on the map, it links to that Fight Replay.
Win impact credits each player with the steps they caused, in points of their side's chance:
- A kill's step goes to the killer. The same step comes off the victim.
- A building or Mid Boss claim is shared among the taking side by each player's objective damage in the stretch it fell, or equally if none was recorded.
- Assists are not counted: the match record does not say who assisted.
- Leaving the match, and what happens between events (a hero respawning, income), earn no credit.
It feeds the MVP's reasons and the highlights: "Moved the game most" appears only when one player's impact is at least 8 points and 25% more than the next player's. A match is called thrown when the side that lost had at least 80% to win after the first six minutes. The other side's comeback is the same fact. Impact measures what changed the odds, not whether the play was good: a death that would have been a trade, or a kill that was already certain, is scored by the same rule.
What it cannot do
- It does not see skill, items, abilities, ultimates, positions or who is in the middle of a fight. Two teams with the same score and buildings get the same chance.
- Before the game it knows the heroes, not the players. A team of one-tricks and a team of strangers look alike.
- Scout's chance for a half-picked lineup treats the empty slots as average heroes, so it sits nearer 50%. It is fitted on all ranks, so Scout's rank filter does not change it.
- A new hero, or a patch that changes many heroes, makes it stale. It is refitted by rerunning the scripts below, and the date above is when that last happened.
- It was fitted on ranked and unranked matchmaking. Street Brawl, bot games and private lobbies get no chance.
- The win line starts at an even chance on purpose: it reads the game, not the heroes. The pre-game chance is shown separately.
Check it yourself
The fits use deadlock-api's public data lake (the match_player table), read column by column with DuckDB, so they do not use the API's rate-limited analytics endpoints. The scripts are in the Chudlock repository underscripts/win-chance/: extract.py pulls the columns, fit_pregame.py and fit_ingame.py fit and test the models and write the two files this page reads (win-chance-pregame.json and win-chance-ingame.json). Visitors cost no extra requests: the models are just those files.
Developers: winChanceNow({ time, netWorth: [amber, sapphire], taken?: [...] }) in lib/stats/win-live.ts returns the chance that The Amber Hand win, from the live model. Match data comes from the community deadlock-api. Back to About.