Skip to content

Model Lab

Prospective results (live, from now on)

No scored fights yet. Each completed fight is scored against the bookmaker consensus (and any frozen forecast) captured before the card started. The first card with stored prices is 7 November 2026. Nothing is back-filled.

Other models tried

ModelHeld-out log loss ↓Outcome
Boosted trees0.6426Not adopted: no better than the logistic regression (difference -0.0033 to 0.0080, interval spans zero; a validation-chosen blend gave the trees zero weight).
Elo baseline0.6758Not deployed: did not beat the win-rate baseline.

Deployed model

Logistic regression … + striking and grappling rates, regularisation 100

Predicts P(A wins | decisive result) from differences in what was known before the fight. Chosen on validation data only; scored walk-forward on later fights.

  • ✓ Pass — At least 500 held-out fights
  • ✓ Pass — Beats a coin flip (95% interval excludes zero)
  • ✓ Pass — Beats the win-rate baseline (95% interval excludes zero)
  • ✓ Pass — Beats the Elo baseline (95% interval excludes zero)
  • ✓ Pass — Reversing fighter order reverses the probability

Held-out test results

1,401 decisive fights · 114 events · 2024-02-24 to 2026-10-10 · refit 5 times as the window advanced, never on its own future

ForecasterLog loss ↓Brier ↓Accuracy
Logistic regression (deployed set)0.64000.224363.8%
Elo baseline0.67580.241557.3%
Win-rate baseline0.67300.240061.0%
Coin flip (50/50)0.69310.2500—

Log loss, model minus Elo, 95% interval resampling whole events: [-0.0473, -0.0235]; minus win-rate baseline: [-0.0435, -0.0215]. Negative is better; both are clearly below zero.

Versus the betting market (research benchmark)

Same 1,390 fights · odds are never an input to the model

ForecasterLog loss ↓Brier ↓Accuracy
Logistic regression0.63840.223664.0%
Market, first listed line0.60530.208767.6%
Market, closing line0.58120.198170.5%

The market is still better. Model minus market log loss: versus first line [0.0176, 0.0488], versus closing line [0.0418, 0.0723] (positive = market better). The model closes part of the gap that Elo left, not all of it. Any disagreement with the market is more likely the model’s gap than an edge.

What each addition bought (held-out log loss)

InputsLog loss ↓Accuracy
Elo only0.675257.3%
Elo + age, height, reach, stance, layoff, experience0.649762.4%
… + win rate and recent form0.650262.5%
… + striking and grappling rates (deployed)0.640063.8%
… + official rank (offline only: no rankings feed yet)0.637664.5%

The deployed inputs were picked on validation data, not on this table. The ranking row is shown only as an upper bound.

Calibration (test)

Forecast rangeFightsAverage forecastActual win rate
10–20%1516.6%6.7%
20–30%8226.2%23.2%
30–40%22035.7%31.4%
40–50%37245.0%44.1%
50–60%36355.0%58.7%
60–70%23964.6%65.7%
70–80%9773.6%81.4%
80–90%1382.2%69.2%

What the model leans on

Weights on standardised A-minus-B differences. Positive favours the fighter with the higher value. These are statistical associations, not causes.

  • age: −0.32
  • Elo rating gap: +0.23
  • takedown volume: +0.16
  • strikes absorbed: +0.14
  • striking defence: +0.13
  • career win rate: −0.12
  • finishing rate: +0.11
  • durability: +0.10
  • striking accuracy: +0.10
  • striking output: +0.09
  • reach: +0.08
  • takedown accuracy: −0.07
  • takedown defence: +0.06
  • time since last fight: −0.06
  • knockdowns taken: +0.06
  • UFC experience: +0.06
  • stance: +0.06
  • last-3 form: −0.03
  • control time: −0.03
  • submission attempts: +0.02
  • knockdown power: −0.01
  • height: +0.00

How far to trust it

44% of test fights involved a fighter with fewer than 3 prior UFC bouts; forecasts for those carry a “limited evidence” label. A 70% forecast is not 70% accuracy. Draws and no contests are excluded and counted (75 no contest, 50 draw).

The held-out window has been scored several times while this model was developed (every choice was made on validation data only, but the repeated looks make these figures slightly optimistic). The live prospective results above are the real test.

Checks run on the real data: rewriting every result and statistic in the last 1,416 fights changed none of the 5,217 earlier feature rows, and with winners shuffled at random the whole pipeline fell to chance (log loss 0.693, accuracy 49%).

Dataset sha256 d63add2ae5c5bafa…. Rankings are not available for upcoming bouts, so the deployed model does not use them. Results after 10 October update Elo, record and recency only, never the strike totals.