01 Data source and coverage
Where the numbers come from
All historical fight data on CFL is sourced from the official UFC statistics website, accessed via public HTTP requests at a rate-limited cadence designed to avoid burdening their servers. We collect publicly available facts only — fighter biographical data, fight outcomes, and round-level box-score statistics. We do not collect personal information, do not bypass any authentication or rate limit, and do not republish source HTML.
The database powering this site currently contains:
- 4,500+ fighter profiles covering substantially the full historical UFC roster
- 8,900+ completed fights with outcome, method, round, and weight class
- 790+ events spanning UFC history through the most recent card
Counts as of August 18, 2026. New cards are scraped as they happen, so these numbers grow weekly.
Fight metadata (who fought whom, who won, by what method, in what round) is complete across the dataset. Per-fight round-by-round statistics (significant strikes, takedowns, control time) are populated for the subset of fights where UFC published them — primarily Zuffa-era events.
02 Age-gap win rate
The single strongest demographic signal we have measured
For every completed UFC fight in the dataset where both fighters' dates of birth are known, we compute the age difference in whole years between the two fighters on the date of the fight. We then bucket fights by the absolute age gap and measure the win rate of the younger fighter within each bucket.
When one fighter is 5+ years younger, they win about 60% of the time.
Sample: 3,831 fights. Source: the Factor Lab dataset — point-in-time, decided UFC fights with both DOBs known (5–6 yr gap: 56.2% of 1,642 · 7–9 yr: 61.6% of 1,423 · 10+ yr: 67.9% of 766).
Formula
Age gapage_gap = abs(fighter_a.age_at_fight - fighter_b.age_at_fight)
younger_won = 1 if winner.age_at_fight < loser.age_at_fight else 0
win_rate(bucket) = sum(younger_won where age_gap in bucket) / count(age_gap in bucket)
Why we trust this signal
- The sample size (3,831 fights) is large enough to be statistically meaningful
- The pattern is monotonic — larger age gaps produce larger win-rate gaps for the younger fighter, which is what you would expect if the effect is real and not noise
- Age is exogenous — fighters cannot manipulate it, and matchmaking does not systematically pair younger versus older fighters in a way that would confound the result
- Age is the only factor we measure that survives market control — the younger fighter still wins about 57% of the fights the betting market priced as even. UFC record used to sit beside it here; re-measured on the raw record in August 2026 it no longer clears the bar. See the Factor Lab
Known caveats
- Effect size diminishes for age gaps under 2 years (within normal cohort variation)
- Heavyweight division shows a slightly weaker age effect than lighter weight classes, likely because power-punching ages better than speed
- This is a population-level finding and does not predict any individual fight outcome
Back to top ↑
03 Reach-gap win rate
Smaller signal than age, but cleaner than most
For every completed UFC fight where both fighters' reach measurements are recorded, we compute the reach difference in whole inches and measure the win rate of the longer-reach fighter at each gap.
When one fighter has a 4+ inch reach advantage, they win about 55% of the time.
Sample: 2,057 fights. Source: the Factor Lab dataset — point-in-time, decided UFC fights with both reach measurements recorded (4–5 in gap: 53.7% of 1,341 · 6+ in: 58.8% of 716).
Formula
Reach gapreach_gap = abs(fighter_a.reach_in - fighter_b.reach_in)
longer_won = 1 if winner.reach_in > loser.reach_in else 0
win_rate(bucket) = sum(longer_won where reach_gap in bucket) / count(reach_gap in bucket)
Known caveats
- Reach is correlated with height and weight class — within a single weight class the effect is smaller than it appears at the cross-divisional level
- Reach matters more for primary strikers than for grappling-first fighters
- Effect decays smoothly with smaller gaps; a 1-inch reach advantage is statistically indistinguishable from no advantage
- Raw base rate only — reach does not survive market control; in fights the betting market priced as even, it is roughly a coin flip. See the Factor Lab
Back to top ↑
04 Stance matchup win rate
A raw base rate — it does not survive market control
For every completed UFC fight where both fighters' stances are recorded, we group fights by the specific stance pairing (Orthodox vs Orthodox, Orthodox vs Southpaw, Switch vs Southpaw, etc.) and measure win rates by stance.
A southpaw with a reach edge wins 56.9% of the time — but only 49.3% when the market priced the fight even.
Sample: 673 fights raw, 73 market-even. Source: the Factor Lab dataset — point-in-time, decided UFC fights.
Raw base rate only. The stance signal does not survive market control — once you hold the betting line flat, it collapses to a coin flip.
See the Factor Lab.
Why we stopped publishing per-pairing stance records
Most stance pairings cluster near 50% and are not predictive, and the pairings that once looked interesting (like Switch vs Southpaw) came from samples too small to trust. The stance factor we still track — southpaw plus a reach edge — is measured in the Factor Lab with its sample size and confidence range attached.
Known caveats
- Stance classification depends on how UFC categorizes a fighter, which is occasionally inconsistent
- Any raw stance effect may partially reflect experience differences, not the stance itself
Back to top ↑
05 How CFL produces a per-fight number
The engine — one calibrated probability per fight (since July 2026)
Every published pick comes from a single machine-learned engine. It reads each fighter's history, per-fight statistics (strikes, takedowns, control, knockdowns), and physical attributes — height, reach, stance, age — and produces one calibrated win probability per fight. It never sees a betting line.
Three rules govern everything it publishes:
- Walk-forward only. To score any fight, the engine may use only what was knowable before that fight. Its backtest replays history year by year, only ever picking fights it had not trained on, and the replay's first, uncalibrated year is excluded from everything published.
- An automated leakage audit has to pass before anything ships — including a hard flag if accuracy looks too good (clean MMA models live in the low-to-mid 60s; a number above 70% means leakage, not genius).
- Picks are locked at first write. Live picks are inserted before the card with their percentage and price, and are never revised. Every fight also gets one immutable pre-fight snapshot of everything CFL was showing at that moment.
The engine's confidence tiers are Lock (65%+), Pick (57%+), and Lean (everything else). Its money face, Value, flags a bet only when the engine's number beats the vig-free market price by 4+ points, sized to the edge and capped at 2% of bankroll. The graded record for all of it lives on the Proof Center.
Some fight cards also show a factor-based verdict built from the base rates above (age, record, cardio) where engine picks aren't published yet. That verdict is the older May 2026 system and is labeled provisional — see the edges page for its full history, including the mistakes.
Important
The win percentage published on CFL is a description of historical patterns applied to a future event. It is not a prediction of the outcome of any individual fight. Single-fight outcomes have substantial variance that no statistical model can eliminate.
Back to top ↑
06 Fighter style classification
Grappler, Striker, Hybrid — three buckets only
For every fighter with at least 10 minutes of Round 1 fight time in the dataset, we classify their style based on Round 1 output rates. We use Round 1 specifically because later rounds are confounded by fatigue, damage taken, and tactical adjustments — Round 1 reveals fighter intent more cleanly.
Scoring
Round 1 output scoresgrapp_score = (takedowns_landed × 60 + control_seconds) per round
strk_score = significant_strikes_landed per round
grapp_norm = grapp_score / 90 (90 is roughly the 70th-percentile producer line)
strk_norm = strk_score / 16 (16 is roughly the 70th-percentile producer line)
Classification logic
We use a dominance-ratio approach rather than fixed thresholds. Fixed thresholds incorrectly classified extreme grapplers as "hybrid" because their striking output happened to clear an absolute floor. Dominance ratio asks: relative to their own activity, what does this fighter actually do?
| Bucket | Rule |
| Grappler | grapp_norm ≥ 1.0 AND grapp_norm ≥ 2× strk_norm (or strk = 0) |
| Striker | strk_norm ≥ 1.0 AND strk_norm ≥ 2× grapp_norm (or grapp = 0) |
| Hybrid | Both ≥ 1.0 and neither dominates 2:1 |
| Below threshold | Classified by whichever phase shows higher output |
We use the term "grappler" intentionally — the bucket includes both shoot-takedown wrestlers (e.g., Khabib Nurmagomedov) and submission grapplers (e.g., Charles Oliveira). Distinguishing those two sub-styles is a future enhancement.
Back to top ↑
07 Cardio and consistency scores
Does output hold up in Round 3 and beyond?
For fighters with sufficient three-plus round fight data, we measure the ratio of output in Round 3+ versus Round 1. A 1.0 ratio means perfectly maintained pace; below 0.7 indicates measurable cardio fall-off.
Grappling cardio metric
Grappling output per roundgrapp_output = (takedowns_landed × 60 + control_seconds)
ratio = grapp_output_R3plus_per_round / grapp_output_R1_per_round
ratio is capped at a divisional cap to prevent small-denominator spikes
The takedown-attempt-based version of this metric (used in earlier drafts) was discarded — it penalized one-shot finishers like Khamzat Chimaev and rewarded fighters who shoot inefficiently. The control-time-aware version measures grappling success, not effort.
Striking cardio metric
The striking effectiveness rewrite is in progress. Current striking cardio is reported only where the underlying sample supports it, and is flagged as preliminary on the fighter page.
Back to top ↑
08 What we deliberately do not publish
Conservative analytical path
We measured several other variables and chose not to publish them as base rates because they failed our internal tests for being clean, single-variable signals.
- Finish rate. Strongly correlated with fighter quality — high-finish-rate fighters tend to face weaker opposition early in their careers. We cannot yet isolate the independent contribution
- Strikes landed per minute (SLPM). Same confound as finish rate. A high SLPM may reflect dominant matchmaking rather than predictive striking volume
- Takedown defense. Sample-size issues for fighters who are rarely shot on. Reported on the fighter card; in the Factor Lab it does not survive market control
- Recent form / last five. Reported as a streak but not modeled — small samples and high variance make it noisy
- Short-notice replacements. Sample size too small for any specific weight class to be informative
If and when we develop methods that isolate these signals cleanly, we will publish them with full methodology and sample sizes documented here.
Back to top ↑
09 Known limitations
What this data cannot tell you
- None of these statistics predict any individual fight outcome. They describe historical population-level patterns
- The legacy factor verdict (where shown) is additive across signals and does not account for interactions between them; the engine models interactions directly
- UFC matchmaking is non-random. Title contenders fight title contenders. This biases certain base rates in ways we have not fully corrected for
- Per-fight round-by-round statistics are missing for older fights — analytics that require these stats use the subset of fights for which they exist, which skews more recent
- Stance, reach, and DOB are self-reported through UFC and occasionally inconsistent or missing
- Sample sizes for sub-buckets (e.g., specific weight class within a specific stance matchup) are often too small to be informative and we generally do not publish them
Back to top ↑
10 How and when this data updates
Refresh cadence and source-of-truth
- Fight outcomes and event data update nightly via a scheduled scraper
- Fighter career averages refresh after each new fight is recorded
- Base-rate analytics (age gap, reach gap, stance) are recomputed weekly against the latest dataset
- If a methodology changes — formula, bucket boundaries, sample inclusion rules — this page is updated and the change is dated
Model picks: locked before the card
Each model's pick for a fight is snapshotted before the event and is never edited afterward. The scoreboard you see is the model's real, committed call — wins and losses both counted, with no retroactive tuning.
CFL publishes one audited engine with two faces: Fight IQ (tape only — a calibrated winner probability for every fight, built from fighter history, fight stats, and physical attributes, never a betting line) and Value (the same engine compared against the vig-free market price — it flags a bet only when they disagree by 4+ points). Because both faces share one brain, they can never contradict themselves. The engine trains strictly walk-forward: every published backtest number comes from fights the model had not trained on, and it passes an automated leakage audit before anything ships. The earlier numbered models (v1–v6) keep their archived records on the track-record page.
One documented exception: if an infrastructure outage (such as a missing odds feed) stops a model from recording its pick before an event, we reconstruct that pick using only information that existed before the card — the same point-in-time fighter stats and market inputs the model would have seen on fight night. We never alter an input to produce a more favorable result, and we count the outcome, win or loss, exactly as we would a live pick. Reconstructed picks are flagged reconstructed in the database, recorded for accuracy only, and excluded from every betting profit-and-loss figure, since no live line was available to bet. To date this has happened once: 28 v5 picks across two June 2026 cards, after an odds-feed outage.
Disagreement with a specific number? Spot a methodology error? Get in touch — we treat substantiation questions as the most important questions a user can ask.
Back to top ↑
Last updated: August 18, 2026 · Cannon Fight Lab is operated by Cannon Fight Lab LLC. Cannon Fight Lab is not a sportsbook.