- Home
- PBE Model
PBE Fight Model V1
An independent probability.A real market price.The difference is PBE Edge.
PBE builds its own win probability from pre-fight Fight DNA. Sportsbook odds never enter the model. Once the probability exists, PropBetEdge independently reads the fight-week market, removes the vig and measures the disagreement.
- 33 pre-fight features
- 0 sportsbook inputs
- Hourly pre-lock
- Locked before the fight
- Public live record
Probability → Market → PBE Edge
Illustrative example — not a current pick
- PBE probability64.0%Built independently
- Market54.0%De-vigged consensus
- PBE Edge+10.0 ptsModel − Market
Books offer -130 · FAV / +108 · DOG → raw implied 56.5% + 48.1% = 104.6% → vig removed → 54.0% → 64.0% − 54.0% = +10.0 pts
- American odds are what the books actually offer. PBE Picks shows the consensus price and the best available price with its book.
- Raw implied probability contains vig. Both sides of a fight add up to more than 100%; that excess is the book's margin.
- PBE removes the vig across the current observed market: the median across books, normalised so both sides sum to 100%.
- PBE Edge compares the model probability with that de-vigged market probability, in percentage points. It is never measured against a vigged price.
- Market data is read only after the model has scored the fight. A price never changes a probability, and a stale price never publishes an edge.
The model doesn't follow the market
- Fight DNAAs of the event date, from repaired fight history
- 33 pre-fight featuresDifferences between the two corners
- PBE probabilityScored before any price is read
- Sportsbook pricesFight-week snapshots of American odds
- Multi-book consensusMedian across the books in one snapshot
- Vig removedDe-vigged market probability
The 33 inputs are all pre-fight Fight DNA differences; 0 of them come from a sportsbook. The two lanes meet only at the final subtraction, which is why PBE Edge can disagree with the market at all.
From card to graded record
- 1Discover
Every UFC card inside the horizon is picked up by the hourly scheduler.
- 2Verify
Both fighters resolve to one reconciled identity with current Fight DNA.
- 3Score
33 pre-fight features become an independent PBE probability.
- 4Compare
The current fight-week market is de-vigged and PBE Edge is measured.
- 5Regenerate
Until lock, new pre-fight inputs can change the call, every hour.
- 6Lock
The prediction is written on the database clock and becomes immutable.
- 7Grade
The official result enters the record; corrections are dated revisions.
What the model has actually done
27-21
Locked before the fight, graded after it, never edited in between. 48 calls locked to date.
A call enters this record only once it has been locked before the bout, and the lock time is the database’s own clock, not a timestamp supplied by whatever wrote the row. From that moment the probability, the pick, the model version and the feature vector are frozen: there is no permitted edit to a locked prediction at all. That is a storage-layer guarantee rather than a promise made in application code. Pre-lock picks regenerate and are never counted.
Results are kept separately, because a result is not a prediction. Combat-sports outcomes get overturned on appeal and corrected by commissions, so a grade can be revised, as a new entry that supersedes the last one and has to say why. The record you see follows the current entry; every superseded one stays on file.
| Band | Decided | Wins | Claimed | Happened |
|---|---|---|---|---|
| 55-60% | 12 | 4 | 57.1% | 33.3% |
| 60-65% | 18 | 14 | 62.4% | 77.8% |
| 65-70% | 7 | 3 | 65.8% | 42.9% |
| 70-80% | 10 | 6 | 74.5% | 60.0% |
| 80-100% | 1 | 0 | 89.6% | 0.0% |
This record and the backtest below are never combined. They answer different questions. A backtest says what the model would have done on fights whose results already existed somewhere; a live record says what it did with the future genuinely unknown. They are stored in separate tables, reported by separate views, and there is deliberately no query in this product that adds them together.
What the model would have done
7,047 bouts scored between 2013-01-19 and 2026-09-05. Every fold trains only on bouts that had already happened and is scored only on bouts that had not; the model is refit from scratch each calendar year, and the ridge penalty is chosen on an inner chronological split of the training window, never on the year being scored. There is no random train/test split anywhere in this pipeline — with fighters recurring across years, a random split would let the model learn how a career turned out before predicting its middle.
| Benchmark | Fights | Brier | Log loss | Accuracy | AUC |
|---|---|---|---|---|---|
| PBE Fight Model V1 | 7,047 | 0.2363 | 0.6651 | 59.58% | 0.6337 |
| 50/50 baseline | 7,047 | 0.2500 | 0.6931 | 50.00% | — |
| Historical win-rate baseline | 7,047 | 0.2447 | 0.6826 | 55.68% | 0.5849 |
| Market implied (de-vigged) | 0 | No completed bout in the release backtest carries a market observation recorded before it started, so no market benchmark is shown here. It is not estimated. | |||
Brier and log loss lead because they are proper scoring rules: only the true probability minimises them, so a model cannot improve them by being confidently wrong. Accuracy is shown because people ask for it, but a model that says 51% and is right is not the same product as one that says 80% and is right, and accuracy cannot tell them apart.
Does 62% mean 62%
Both corners of a bout are the same prediction stated two ways, so every row below is folded onto the side the model actually picked: confidence is max(p, 1−p) and a hit is that pick winning. The gold line is what happened; the blue block is what was claimed.
| Band | Fights | Claimed | Hit rate | Brier |
|---|---|---|---|---|
| 50-55% | 2,778 | 52.4% | 53.0% | 0.2489 |
| 55-60% | 1,996 | 57.3% | 60.2% | 0.2400 |
| 60-65% | 1,230 | 62.3% | 62.4% | 0.2343 |
| 65-70% | 609 | 67.2% | 69.5% | 0.2121 |
| 70-80% | 373 | 73.5% | 75.1% | 0.1874 |
| 80-100% | 61 | 84.5% | 86.9% | 0.1209 |
What a model call looks like
Real bouts, real out-of-sample probabilities, real results — and a deliberate mix of right and wrong. These are backtest output, clearly marked as such, and never current PBE Picks; the current calls are in PBE Picks for UFC Pro.
- Market implied
- No timestamp-compatible price
- Model edge
- Not computed without a price
- Confidence
- 65-70% band · picks in this band went 69.5% across 609 backtested fights
- Sample
- Thinner corner: 3 prior bouts, 2 with round stats · 32/33 features available Low sample
- Result
- Model correct · Alexia Thainara won by DEC/U
A typical confident call that landed.
- Market implied
- No timestamp-compatible price
- Model edge
- Not computed without a price
- Confidence
- 65-70% band · picks in this band went 69.5% across 609 backtested fights
- Sample
- Thinner corner: 5 prior bouts, 5 with round stats · 32/33 features available
- Result
- Model wrong · Amanda Lemos won by DEC/U
The same confidence, wrong. Roughly a third of calls in this band are.
- Market implied
- No timestamp-compatible price
- Model edge
- Not computed without a price
- Confidence
- 80-100% band · picks in this band went 86.9% across 61 backtested fights
- Sample
- Thinner corner: 2 prior bouts, 1 with round stats · 31/33 features available Low sample
- Result
- Model wrong · Payton Talbott won by KO/TKO
The most confident miss in the whole out-of-sample period.
- Market implied
- No timestamp-compatible price
- Model edge
- Not computed without a price
- Confidence
- 50-55% band · picks in this band went 53.0% across 2,778 backtested fights
- Sample
- One corner is debuting — no prior bouts on record · 4/33 features available Low sample
- Result
- Model wrong · JooSang Yoo won by KO/TKO
A fight the model has no read on. It says so.
Where the model has nothing to say
| Evidence available | Fights | Brier | Accuracy | AUC |
|---|---|---|---|---|
| both corners 1-2 prior bouts | 2,068 | 0.2344 | 60.30% | 0.6434 |
| both corners 6+ prior bouts | 1,819 | 0.2346 | 60.86% | 0.6457 |
| both corners 3-5 prior bouts | 1,642 | 0.2301 | 62.85% | 0.6654 |
| one corner debuting | 1,518 | 0.2477 | 53.52% | 0.5591 |
| Division | Fights | Brier | Accuracy | AUC |
|---|---|---|---|---|
| Lightweight | 1,072 | 0.2353 | 59.33% | 0.6369 |
| Welterweight | 996 | 0.2371 | 59.44% | 0.6309 |
| Middleweight | 845 | 0.2372 | 58.46% | 0.6232 |
| Featherweight | 833 | 0.2341 | 60.38% | 0.6486 |
| Bantamweight | 752 | 0.2350 | 62.37% | 0.6473 |
| Light Heavyweight | 527 | 0.2427 | 55.98% | 0.5926 |
| Heavyweight | 523 | 0.2355 | 62.72% | 0.6478 |
| Flyweight | 452 | 0.2328 | 59.96% | 0.6489 |
| Women's Strawweight | 399 | 0.2355 | 57.52% | 0.6278 |
| Women's Flyweight | 290 | 0.2379 | 58.28% | 0.6261 |
| Women's Bantamweight | 255 | 0.2364 | 60.00% | 0.6435 |
| Catchweight | 72 | 0.2485 | 58.33% | 0.5862 |
| Women's Featherweight | 31 | 0.2326 | 54.84% | 0.6272 |
The debut row is the honest headline of this table. When one corner has never fought inside the promotion, the model has almost no signal beyond age, reach and stance, and its AUC there is barely above a coin. It says so by producing probabilities near 50% rather than by manufacturing confidence — which is why the calibration above survives including those fights rather than being computed on a flattering subset. PBE Picks does not call those fights at all.
Every year, scored separately
| Year | Trained on | Scored | Penalty | Brier | Log loss | Accuracy | AUC |
|---|---|---|---|---|---|---|---|
| 2013 | 2,128 | 376 | 320 | 0.23587 | 0.66402 | 62.23% | 0.6470 |
| 2014 | 2,504 | 494 | 40 | 0.24461 | 0.68175 | 53.85% | 0.5812 |
| 2015 | 2,998 | 464 | 160 | 0.23409 | 0.65988 | 60.13% | 0.6470 |
| 2016 | 3,462 | 483 | 80 | 0.24368 | 0.68080 | 55.69% | 0.5997 |
| 2017 | 3,945 | 485 | 160 | 0.23928 | 0.67106 | 58.25% | 0.6102 |
| 2018 | 4,430 | 522 | 80 | 0.23696 | 0.66618 | 61.69% | 0.6303 |
| 2019 | 4,952 | 553 | 80 | 0.24491 | 0.68291 | 53.89% | 0.5770 |
| 2020 | 5,505 | 492 | 160 | 0.23782 | 0.66889 | 62.60% | 0.6384 |
| 2021 | 5,997 | 545 | 320 | 0.24118 | 0.67597 | 57.80% | 0.6054 |
| 2022 | 6,542 | 555 | 320 | 0.23259 | 0.65695 | 59.64% | 0.6544 |
| 2023 | 7,097 | 552 | 320 | 0.23256 | 0.65715 | 62.14% | 0.6624 |
| 2024 | 7,649 | 558 | 160 | 0.22992 | 0.65347 | 62.72% | 0.6773 |
| 2025 | 8,207 | 574 | 20 | 0.22913 | 0.65005 | 62.72% | 0.6713 |
| 2026 | 8,781 | 394 | 10 | 0.22458 | 0.63890 | 61.17% | 0.6756 |
Proof the model could not see the future
A fight model that has quietly read the result is easy to build and worthless. Six independent checks run on every build, and the run fails if any one of them does.
- PASSThe extract never selects a present-day career total. record_w, career_slpm and every other accumulator that describes a fighter as they are today is absent from the pipeline, so it cannot leak into a 2015 bout.
- PASSEvery as-of Fight DNA snapshot used for a bout was checked against its own provenance list. The bout under prediction never appears in it, and no bout inside it is dated on or after the event. Independent cross-check of the running record against every snapshot: 0 mismatches in 15610 comparisons.
- PASSThe decisive test. For 250 sampled bouts, every row dated on or after the bout was deleted and the feature vector rebuilt from what remained. Not one value changed.
- PASSTraining labels were shuffled and the model refit. Skill collapsed to 0.0013 against a real-label skill of 5.48%. A pipeline reading the answer would have kept performing.
- PASSSwapping the corners returns exactly the complementary probability, so no artifact of which fighter the source listed first can be doing work. In this database the first-listed fighter wins 93.5% of bouts, purely because the ingest lists the winner first — a model with an intercept would have learned that and reported it as skill.
- PASSIn every fold, the last training event is strictly earlier than the first scored event.
33 features, and no odds among them
Every input is a difference between the two corners, and the model is fitted with no intercept, so swapping the corners negates the vector and the two probabilities are exactly complementary. Sportsbook prices are not an input at any stage; the market appears only after a probability exists.
- age_diff_yearsage · staticAge in years at the event date. Older is normally worse.
- reach_diff_inreach · staticReach in inches.
- height_diff_inreach · staticHeight in inches.
- experience_log_diffexperience · dna snapshotlog1p of completed prior bouts in the snapshot sample.
- five_round_exp_diffexperience · dna snapshotlog1p of prior scheduled-five-round appearances.
- title_exp_diffexperience · dna snapshotlog1p of prior title-bout appearances.
- winrate_diffform · dna snapshotLaplace-smoothed prior win rate, (w+1)/(appearances+2).
- recent5_winrate_diffform · dna bout rowsWin rate over the last five completed bouts before the event date.
- streak_diffform · dna bout rowsSigned current win or loss streak, clamped to plus or minus five.
- layoff_log_diffform · dna bout rowslog1p of days since the previous bout. A long layoff is normally a negative.
- slpm_diffstriking · dna snapshotSignificant strikes landed per minute.
- sapm_diffstriking · dna snapshotSignificant strikes absorbed per minute.
- sig_diff_per_min_diffstriking · dna snapshotSignificant strikes landed minus absorbed, per minute.
- sig_accuracy_diffaccuracy · dna snapshotSignificant strike accuracy.
- sig_defense_diffaccuracy · dna snapshotSignificant strike defence, one minus opponent accuracy.
- kd_per15_diffstriking · dna snapshotKnockdowns scored per fifteen minutes.
- kd_absorbed_per15_diffdurability · dna snapshotKnockdowns conceded per fifteen minutes.
- td_landed_per15_difftakedowns · dna snapshotTakedowns landed per fifteen minutes.
- td_accuracy_difftakedowns · dna snapshotTakedown accuracy.
- td_defense_difftakedowns · dna bout rowsOne minus opponent takedown accuracy across prior stat-covered bouts.
- control_share_diffcontrol · dna snapshotControl time as a share of observed fight time.
- sub_att_per15_diffcontrol · dna snapshotSubmission attempts per fifteen minutes.
- finish_rate_difffinishing · dna snapshotFinishes as a share of prior wins.
- ko_rate_difffinishing · dna snapshotKO/TKO wins as a share of prior wins.
- sub_rate_difffinishing · dna snapshotSubmission wins as a share of prior wins.
- ko_loss_rate_diffdurability · dna snapshotTimes stopped by strikes as a share of prior appearances.
- sub_loss_rate_diffdurability · dna snapshotTimes submitted as a share of prior appearances.
- pace_retention_diffpace · dna snapshotRound-three attempt pace divided by round-one pace.
- champ_round_delta_diffpace · dna snapshotRounds four and five pace minus rounds one to three pace.
- southpaw_edgestance · staticPlus one when this corner is the only southpaw, minus one when the opponent is, otherwise zero. Antisymmetric by construction.
- sos_diffopponent · dna bout rowsMean pre-fight win rate of prior opponents, each measured as of the date they were fought.
- quality_wins_diffopponent · dna bout rowslog1p of prior wins over opponents who were above a .600 pre-fight win rate at the time.
- stat_sample_log_diffconfidence · dna snapshotlog1p of stat-covered prior bouts. Carries how much evidence each corner actually has.
How to argue with this
Model pbe-fight-model-v1, features pbe-fight-features-v1, spec hash 75da0a1de14de2e1…. ridge logistic regression, no intercept, antisymmetric differential features, trained on 9,175 graded bouts from 1994-03-11 to 2026-09-05. The full methodology, the leakage argument and the complete backtest tables are in the repository under docs/model/.
The underlying temporal feature source is the repaired historical Fight DNA snapshot layer. How Fight DNA works →