MMA Career Rankings
Rankings
The project publishes All-time and Prime career rankings for men and women from the UFC, PRIDE, WEC, Strikeforce, Affliction, Bellator and RIZIN. The rating model uses recorded professional fights across all promotions and the regional circuit. Current and weight-class boards cover UFC fighters.
The interactive site filters boards and analysis by roster, weight class, board size and minimum rated bouts.
Rating model
| Design choice | Rationale |
|---|
| Whole-History Rating (Coulom, 2008) | A one-pass rating like Elo never goes back. If an opponent you beat later becomes a champion, that win should count for more, and here it does. Fitting all careers together also keeps fighters from different decades on one scale. |
| A neutral starting bout | Without it, a fighter at 2-0 has no upper limit and can top the board. With it, an unbeaten record has to keep growing against real opposition to climb. |
| Graded results | A knockout says more about who was better than a split decision does. |
| A contender line for each year | The rating scale drifts upward over time. Measuring against that year's contenders compares a 2007 win and a 2023 win fairly. |
| Win probability raised to a power | One win over an elite contender is worth about five wins over borderline ones, so a long run of borderline wins cannot outscore a few elite ones. The third power was chosen after tests of powers from 1 to 6. |
| Promotion weights, pulled toward average | Keeping promotion out of the rating lets results decide how strong each pool was. The weight then accounts for depth of competition, and pulling thin evidence toward the average stops a handful of labelled fights from deciding a whole career. |
| Square roots on a common scale | It puts the three parts on one scale and rewards a career that is strong in all three more than one huge number in a single part. |
| Best ten-year window | It measures a peak without punishing a fighter for a long career before or after it. |
The model has not yet been shown to predict fights better than a simpler rating; that test
is recorded as open in the release check. The rankings are a
measured judgement of careers, not a betting model.
Site features
| Feature | What you can do |
|---|
| Rankings | All-time, Prime and Current, exactly as published below. Pick a weight class for that class's own board: the All-time score earned in UFC bouts in that class. |
| Weight-class boards | UFC only. A champion in two classes is ranked in both, with the share of their All-time score earned in each. |
| Score anatomy | See each score split into championships, career skill and contender résumé. Move two sliders to change the exchange rate and watch the board re-rank. |
| Rating method | Each method behind the rankings, what it does and why it was chosen, in ordinary words. |
| Career arcs and tale of the tape | Overlay up to six fighters' ratings fight by fight and compare their records, ranks and class placements side by side. |
| Where a career score comes from | A year-by-year receipt that sums to the career score. |
| Risers, fallers and streaks | The biggest rating moves of any year, and the longest UFC win streaks placed by length and by the strength of who they beat. |
| Biggest upsets | The UFC wins the betting market rated least likely, and how often favourites win. |
|
Each chart includes a finding calculated from the data under the current controls.
The page follows the reader's light or dark setting.
On a phone, open Explore the rankings to change the filters. Wide tables scroll
inside their panels. Weight-class buttons work with a keyboard, and the page follows
the reader's reduced-motion setting.
To check the interface locally, run npm ci, npx playwright install chromium, then
npm test. The browser checks cover search positions, roster filters, fighter
comparisons, analysis charts, phone layouts and dark mode. They also run in CI.
| Weight-class board | Score anatomy and exchange rates |
|---|
| |
| Career arcs and tale of the tape | Weight classes over time |
| |
Model rules
Weight classes are separate pools. Career division is where a fighter competed
most; current division changes only after a UFC title win. Each year is measured
against its division's top ten percent, roughly the fifth-best fighter; classes
with fewer than 30 fighter-years use the sport-wide line. Men and women remain
separate.
The fight rating ignores promotion. Exposure is applied later: UFC is 1.00,
PRIDE 0.95, Affliction 0.90, WEC and Strikeforce 0.88, Bellator 0.65, and
PFL, RIZIN, ONE and DREAM 0.60. Thin evidence shrinks toward the average.
A knockout or submission scores 1.00, a unanimous decision 0.95, a split or
majority decision 0.90, a disqualification 0.85, and a draw 0.50 for each
fighter; no-contests are excluded. Careers are fitted together, so later results
can revalue earlier fights. Ratings sit around 1,500, and a neutral virtual bout
checks tiny unbeaten records. Duplicate fights are removed and whole careers
are required.
What the score measures
All-time = 1,000 × (30% √title + 17.5% √skill + 52.5% √résumé)
Each part is divided by the average of its own top 100, then square-rooted, before
weighting. A part of 1.0 still means "as much as a typical top-100 career", but
doubling a part adds only about 41%, so a career is paid for breadth across the
three parts more than for an extreme in one.
| Part | Weight | What it measures | Exact rule |
|---|
| Title | 30% | Title fights won, valued by who was beaten | Each title win is worth q⁴, where q is the chance the opponent beats a contender-level fighter, using the opponent's rating going in against that division's contender level that year. A major-promotion title win is worth at least 0.05. |
| Résumé | 52.5% | Wins over contenders, valued by how strong they were | Counts a win over an opponent rated at least 1,750 going in, with eight or more UFC bouts. Each is worth q³ against 1,750: 0.13 just over the line, 0.26 at 100 points above, 0.61 at 300 above. At most 1.0 per calendar year. |
| Skill | 17.5% | How far the fighter's own rating stood above contender level | For every year with a fight: the fighter's average rating that year minus the division's contender level that year (about its fifth-best fighter). Years below the line add almost nothing; years above add the excess. Summed over the career. |
The rating behind all three is one model of every recorded fight, so beating a
fighter counts more the better that fighter proved to be. Skill and résumé are
then multiplied by the promotion exposure above, between 0.20 and 1.00. An
opponent returning from a long absence is marked down 90 points per excess
layoff, up to four. Because q³ rises steeply, one win over an opponent 300
points above the line is worth about five wins over borderline contenders.
All-time and Prime read every rating against its own year's contender line. The
model's scale drifts upward over time: on this fit the 60th-best man stood at
1,834 in 2007 and 1,919 in 2023, so without this era adjustment a 2023 win
would be priced on a scale about 85 points higher than a 2007 win. Current,
whose fighters are all contemporaries, reads the unadjusted ratings.
The score is a points total, not a ratio. Jon Jones's 1,814 against Georges
St-Pierre's 1,564 does not mean Jones was 16% better. It means his three parts
add up to more points: title 617 against 482, résumé 812 against 777, skill 385
against 304. Most of the résumé gap is two elite wins: Daniel Cormier at 334
points above the line and Ciryl Gane at 261, where St-Pierre's best was Sean
Sherk at 189. For who was better at their best, read Prime: 2,193 against
2,110, an 83-point edge, which the rating turns into about a 62% chance of
winning.
Prime takes the ten-year stretch with the most wins over contenders, using the
same contender rule as the résumé, and needs four. It ranks by those wins times
the stretch's average rating above the lowest qualifying average. Current uses
the All-time formula over the last 18 months: title wins and contender wins in
that window, plus the latest rating above 1,750, capped at the best opponent the
fighter has ever beaten so an unbeaten run against weak opposition cannot keep
climbing. It needs 13 rated appearances, eight UFC bouts and a UFC bout within
18 months. Integrity deductions never alter a published board.
Each weight class has its own board, and it is UFC only: the All-time score counted
only from the title wins, contender wins and career years earned in UFC bouts in
that class. All-time and Prime count every promotion; the class boards and Current
count the UFC. What a fighter earned outside the UFC stays in their All-time score
but in no class, so their class scores add up to their All-time score less that
remainder. A champion in two classes is ranked in both.
Published rankings
The men's headline boards are published below so the rankings are visible on
the repository front page. The full Published MMA Rankings adds
the three women's boards and the weight-class boards.
| Release fact | Value |
|---|
| Dataset | 2026-10-24 |
| Data through | 2026-10-24 |
| Included records | UFC, early UFC and major-promotion careers |
| All-time basis | All-time career score |
| Rated fights | 81,643 |
| Rated fighters | 34,150 |
| Available fight records | 83,053 |
| Whole-career coverage | 1,827 of 1,840 eligible fighters (99.3%) |
| Prime contender threshold | 1,750 — reached by 25.3% of established fighters |
| Prime qualifiers | 102 men; 7 women |
All-time — men, top 100
Prime and Prime rank come from the Prime board below, and Elite
wins is the evidence behind that rank. A blank rank means the fighter did not
qualify, not that they placed last.
| # | Fighter | Division | Score | Prime | Prime rank | Elite wins |
|---|
| 1 | Jon Jones | Light Heavyweight | 1813.7 | 2193 | 1 | 11 |
| 2 | Georges St-Pierre | Welterweight | 1563.5 | 2110 | 2 | 12 |
| 3 | Islam Makhachev | Lightweight | 1559.8 | 2157 | 4 | 8 |
| 4 | Alexander Volkanovski | Featherweight | 1406.2 | 2032 | 6 | 10 |
| 5 | Anderson Silva | Middleweight | 1384.4 | 1955 | 3 | 14 |
| 6 | Jose Aldo | Featherweight | 1364.0 | 1915 | 12 | 9 |
| 7 | Daniel Cormier | Light Heavyweight | 1348.0 | 2055 | 7 | 8 |
| 8 | Demetrious Johnson | Flyweight | 1328.9 | 1951 | 41 | 5 |
| 9 | Stipe Miocic | Heavyweight | 1214.4 | 1951 | 24 | 6 |
| 10 | Dominick Cruz | Bantamweight | 1208.4 | 1933 | 45 |
Prime, elite-tested — men, top 50
The table prints both inputs instead of the internal ordering index.
| # | Fighter | Division | Prime | Elite wins |
|---|
| 1 | Jon Jones | Light Heavyweight | 2193 | 11 |
| 2 | Georges St-Pierre | Welterweight | 2110 | 12 |
| 3 | Anderson Silva | Middleweight | 1955 | 14 |
| 4 | Islam Makhachev | Lightweight | 2157 | 8 |
| 5 | Fedor Emelianenko | Heavyweight | 2085 | 9 |
| 6 | Alexander Volkanovski | Featherweight | 2032 | 10 |
| 7 | Daniel Cormier | Light Heavyweight | 2055 | 8 |
| 8 | Antonio Rodrigo Nogueira | Heavyweight | 2041 | 7 |
| 9 | Frankie Edgar | Lightweight | 1911 | 10 |
| 10 | Max Holloway | Featherweight | 1924 | 9 |
| 11 | Lyoto Machida | Light Heavyweight | 2011 | 7 |
| 12 | Jose Aldo | Featherweight | 1915 | 9 |
| 13 | Sean Sherk | Lightweight | 1984 | 7 |
| 14 | BJ Penn | Lightweight | 1888 | 9 |
| 15 |
Current — men, top 30
| # | Fighter | Division | Score | Title wins | Contender wins | UFC bouts | Last UFC bout |
|---|
| 1 | Justin Gaethje | Lightweight | 1902 | 2 | 2 | 16 | 2026-06-14 |
| 2 | Islam Makhachev | Welterweight | 1847 | 2 | 2 | 19 | 2026-08-15 |
| 3 | Joshua Van | Flyweight | 1793 | 3 | 4 | 12 | 2026-09-19 |
| 4 | Alexander Volkanovski | Featherweight | 1735 | 2 | 2 | 19 | 2026-10-24 |
| 5 | Petr Yan | Bantamweight | 1721 | 2 | 2 | 17 | 2026-10-24 |
| 6 | Sean Strickland | Middleweight | 1610 | 1 | 2 | 25 | 2026-05-09 |
| 7 | Merab Dvalishvili | Bantamweight | 1455 | 2 | 2 | 18 | 2026-10-24 |
| 8 | Khamzat Chimaev | Middleweight | 1428 | 1 | 1 | 10 | 2026-05-09 |
| 9 | Ilia Topuria | Lightweight | 1359 |
Limitations
All-time is retrospective, elite wins reward opportunity, and the age curve
misses decline in fighters who never returned. Promotion labels are missing from 54% of rated fights;
11% of filled weight classes are estimated wrong. Whole-career coverage is
complete for every eligible fighter, and none has an evidenced source-ID
conflict. See the decision register.
Repository files
| Path | Use it for |
|---|
RANKINGS.md | Full rankings |
ratings/ / loaders/ | Model / data assembly |
ratings/fights.py, divisions.py, history.py | Shared fight preparation, division names and pre-fight lookups |
ratings/evaluation.py, bootstrap.py, boards.py | Probability metrics, interval setup and published board definitions |
rust/whr_rs/ | Whole-History Rating fitting and conditional variances in Rust |
rust/rating_rs/ | Glicko-2 updates and inactivity transitions in Rust |
data/snapshots/<date>/ | The release: inputs, fitted ratings and boards, all versioned |
docs/ | Method and decisions |
docs/FORECAST.md | The pre-fight forecast benchmark against betting odds, and the selection leak it avoids |
docs/RELEASE_CHECK.md | Source freshness, fresh-checkout reproduction and the limits of current predictive evidence |
site/ | Interactive analysis site, published at https://symonyeal.github.io/MMA-Career-Rankings/; open site/index.html locally |
tests/ | Verification |
Use the system Python:
python -m pip install -r requirements.txt
python -m pip install maturin ./rust/whr_rs ./rust/rating_rs
python -m pytest -q
python check_release.py
python build_boards.py data/snapshots/2026-10-24 --scope majors,pre_unified --write-readme
The second line requires a Rust toolchain (rustup). Both compiled extensions
are required: there is no Python solver or fallback. Tests check captured numerical results and model behavior.
Refresh the narrative figures after rebuilding a release:
python analysis/readme_figures.py --write-readme. The tests check these figures against the data.
The site draws its analyses from one snapshot. Its data file, site/data.js, is
generated; rebuild it after the boards change:
python analysis/build_site.py data/snapshots/2026-10-24
Use --output <directory> to build an isolated copy for review. The retired notebook and its
builders are preserved in _archive/20261029-notebook-retired/.
index.html loads each asset as name?v=<content hash>, so a browser never pairs the page with a
cached older asset. After editing app.js or style.css alone, re-stamp with
python analysis/build_site.py --stamp; a test fails while the stamp is stale.