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,492 fighter profiles covering substantially the full historical UFC roster
- 8,766 completed fights with outcome, method, round, and weight class
- 782 events spanning UFC history through the most recent card
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 62.4% of the time.
Sample: 3,309 fights. Source: Completed UFC fights with both DOBs known.
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,309 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
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 55.0% of the time.
Sample: 2,006 fights. Source: Completed UFC fights with both reach measurements recorded.
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
Back to top ↑
04 Stance matchup win rate
Strong signal in one specific matchup, noise elsewhere
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.
Switch-stance fighters beat Southpaws 58.1% of the time.
Sample: 191 fights. Source: Completed UFC fights between fighters with recorded stances of Switch and Southpaw.
Why we report only the matchups with real signal
Most stance pairings cluster near 50% and are not predictive. We publish only the specific pairings where the deviation from 50% is large enough and the sample is wide enough to be worth a bettor's attention. Orthodox-versus-Orthodox is treated as a 50% baseline.
Known caveats
- The Switch-vs-Southpaw sample (191 fights) is far smaller than the age or reach samples — the confidence interval around 58.1% is wider
- "Switch" classification depends on how UFC categorizes a fighter, which is occasionally inconsistent
- This effect may partially reflect that Switch-stance fighters tend to be more experienced, not that the stance itself confers an advantage
Back to top ↑
05 Implied win percentage model
How CFL produces a per-fight number from the base rates above
For each upcoming fight, we compute an implied win percentage for each fighter by starting at 50% and additively applying the deviation from base rate contributed by each measured signal.
Formula
Implied win %implied_win_pct = 0.50
+ age_gap_deviation
+ reach_gap_deviation
+ stance_matchup_deviation
Each deviation = (measured_win_rate_in_bucket - 0.50)
Deviations are signed in the direction of the favored fighter.
What this model deliberately is not
- It is not a multivariate regression. Each signal is applied independently, which slightly overcounts when signals are correlated (e.g., age and reach can interact)
- It does not include career stats like finish rate, strikes-per-minute, or takedown defense. Those metrics are confounded with fighter quality and we have not yet isolated their independent predictive value
- It does not adjust for opponent quality, recent form, weight cut, layoff, or camp changes
Important
The implied 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 but not used in the implied win percentage model
- 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 implied win percentage is additive across signals and does not account for interactions between them
- 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
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: May 24, 2026 · Cannon Fight Lab is operated by Reed Cannon. Cannon Fight Lab is not a sportsbook.