Methodology

How the TipsterLab Model works

Where the probabilities in the tables come from, which decisions fixed them, and what is deliberately left out.

The projections tables carry a probability for every possible outcome of a match. This page explains where that number comes from, without assuming you know any statistics.

What a projection is

A projection is the probability of each outcome of a match: a home win, an away win and, in the sports that have one, a draw.

Those probabilities come from each team's historical strength — what it has scored, what it has conceded, against whom and where — not from anyone's opinion. No figure in the table is typed in by a person.

How it is computed

The calculation takes three steps, and the second one is the part that surprises most people:

  1. The model estimates how many goals it expects from each side. In baseball those are runs; in American football, points.
  2. From those two numbers it works out the probability of every possible scoreline: 1-0, 2-1, 0-0, 3-2, all of them.
  3. Then it adds up the cells. Every scoreline where the home team outscores the away team, added together, is the probability of a home win. Same for the draw and for the away win.

That is where the 1, the X and the 2 in the table come from. No matches are simulated and no coin is tossed thousands of times: the sum is worked out in full, cell by cell.

The expected score at the end of each row is the average of that same distribution, and the range in parentheses covers 80 % of the scorelines the model considers possible.

Why it is frozen before kickoff

A prediction you can rewrite once the result is known means nothing: anyone looks sharp if they get to fix their answer at the end.

So every projection is stored with a date and time, before the match starts, and is never modified afterwards. The table it lives in accepts no updates and no deletes; a bad run is replaced wholesale and re-inserted, never patched. That is what makes these numbers measurable later.

What it leaves out

A projection is the model's automatic output, frozen hours before kickoff. It knows nothing about:

  • late-breaking news;
  • confirmed line-ups;
  • last-minute injuries;
  • venue changes.

If the first-choice keeper drops out of the eleven an hour before kickoff, the projection never finds out. That is a known, stated limit rather than an oversight: folding that news in would mean rewriting the projection after freezing it, which is precisely what would make it worthless.

What it is not

These are not betting recommendations or selections. There is no suggested play, no odds, no stake. They are probabilities: what the model believed, and when it believed it. What to do with them — if anything — is the reader's call.

See the projections
Technical detail, engine by engine

There is one engine per sport, and each carries its own version. Series are never mixed across versions: an average computed over two versions describes a model that never existed. The version behind each table is shown underneath it, on /proyecciones.

Soccer current engine version

Every team carries an attack rating and a defense rating, normalised within its own league: the league's average attack and average defense are both 1.0. Each league also contributes its own parameters: expected home goals (HG), expected away goals (AG) and draw propensity.

Expected goals for each side follow from those:

λ_home = HG_league × (attack_home × defense_away) ^ S
λ_away = AG_league × (attack_away × defense_home) ^ S

S is 1.28 in domestic league play and 1.00 in cup competitions. The distinction was measured on 24 August 2026: the adjustment does not hold up in cup ties, so there it is switched off rather than applied half-way. Cross-border ties also get a multiplier for the relative strength of the two leagues — an attack rating of 1.2 does not mean the same thing in two leagues of different quality, because each rating is normalised against its own.

The scoreline distribution is computed exactly, not by sampling: the engine builds the probability matrix for every scoreline up to 9 goals per side, using a Poisson distribution with the Dixon-Coles correction, which adjusts the probability of low scorelines — the ones a plain Poisson underrates. The 1/X/2 probabilities are the sums of the matching cells of that matrix.

The score ranges shown in the tables cover 80 % of the distribution.

It is updated every day. Team ratings and the strength of each league are recalculated daily, after every matchday, so yesterday's result already counts in today's projection. Cup matches also get their own corrections.

Baseball current engine version

Expected runs for each side come from three inputs: team offense, opposing starter quality — measured by FIP with shrinkage, so a starter with few innings does not drag the estimate toward his own noise — and the opposing bullpen adjusted for recent workload. The weights are 62 % for the starter and 30 % for recent form.

A park-factor adjustment is applied on top of that.

The run distribution is not Poisson: it uses a negative binomial with a dispersion parameter of 2.10, fixed by coverage of the 80 % range. Baseball carries more variance than a Poisson allows, and under a Poisson the ranges came out too narrow.

A final shrinkage toward the base rate is applied:

p_final = 0.5308 + 0.75 × (p_raw − 0.5308)

It corrects the model's structural overconfidence: it pulls every probability toward the base rate without flattening the difference between one matchup and the next. The 0.75 factor was re-estimated on 24 August 2026.

College football current engine version

This one reuses the NFL drive-level engine, with data from ESPN. What it does not reuse are the constants: those were measured again over 2,733 college games, and they come out different.

ConstantCollegeNFL
Touchdown per drive21.9 %18.4 %
Field goal per drive8.9 %14.6 %
Drives per team-game11.89—
Home-field advantage0.6430.549

College home-field is a different animal, and the table says so on its own: inheriting the NFL constants would have produced a model with the right shape and the wrong numbers.

Lower-division opponents (FCS) are pooled into a single pseudo-team. They turn up one to three times a season, and handled one by one each would sit glued to the average — indistinguishable from everyone else — purely for lack of games. Pooled, they are at least what they are: a block of opponents from another tier.

College overtime is not modelled yet.

The expected-score range is on hold while it is recalibrated. Checked against real results, that range was right less often than it promises, so it is not shown for now. The rest of the projection — each side's probabilities and the expected score — is still published as usual.

Preliminary version, by explicit decision. The season starts on 29 August and there was no room for full validation before that date. There were two ways to go: publish only the handful of games that arrived validated, or publish the whole season — some 888 games — flagged as low confidence. The second one won. A model that shows its entire season from day one, with its confidence level stated, can be measured; one that shows only what already worked out cannot. The version name carries _preliminar so that no future series mistakes it for a validated one. Full validation is scheduled for October.