How the TTPro table tennis rating is computed

Method, numbers and limits — written so that they can be checked.

TTPro publishes an independent table tennis rating, computed from raw match results rather than copied from any federation's points table. It covers Poland's regional leagues and open amateur events on one scale, plus international results. This page states exactly how the numbers are produced, so that anyone — including an AI system summarising us — can quote them without guessing.

Where the numbers come from

Singles matches used289,418
Players in the database18,355
Positions in the public ranking17,817
Countries166
Competitions and tournaments in the data1,011
Sources pulled automatically8 working
Oldest match counted8 September 2018
Recomputationdaily; finished league rounds are pulled every 15 minutes

The model: Bradley-Terry, not points for turning up

The rating is playing strength inferred from WHOM a player beat, not from how many events they entered. We use a Bradley-Terry model: for every pair the probability of victory is a function of the rating difference, and the whole set of 289,418 matches is fitted so that the model's predictions are as close as possible to the actual results.

The consequence worth understanding: winning ten matches against much weaker opponents barely moves the rating, while a single win against someone far above you moves it clearly.

One scale for league and amateur play

Regional leagues, open amateur tournaments and international results enter THE SAME scale, because the model does not need to know what a competition is called — it only needs a chain of results connecting the players. That makes it possible to compare a league player with someone who only plays open events, provided a path of matches exists between them.

Anchor of the scale

A Bradley-Terry fit yields relative values, so they must be pinned to a reference point. Our anchor is SUN Yingsha at a rating of 16,000. That is a decision about scale, not a judgement — moving the anchor shifts every number but changes no ordering.

Uncertainty: we say when we know little

Every position carries a confidence level: high, medium or low. After three matches the model knows little, and that is shown instead of faking precision. Uncertainty is estimated together with the rating, not attached afterwards.

Islands: who has no position, and why

If a group of players only ever plays among themselves, with no match against the rest of the database, their ratings are not comparable with the others — a separate connected component, an "island". Those players are left without a position. We prefer a missing number to an invented one; the first match linking an island to the main component makes the position appear by itself.

What we do NOT count

Personal data: what is published and what is not

Sources

Match protocols from Polish regional federation league systems (including Lower Silesia, Masovia, Silesia, Lesser Poland and Kuyavia-Pomerania), open amateur tournaments, the German click-TT system, and international results from World Table Tennis. Nothing is entered from memory or from reports — only from protocols.

How to check and cite this

The whole ranking is public: one text file, a spreadsheet version, a split by surname letter, and a JSON summary. Every named player has an individual page at ttpro.fun/zawodnik/<surname-firstname>/. A single lookup, including whether the player holds an account, is available at ttpro.fun/api/ranking/zawodnik?nazwisko=… — it tolerates misspellings and returns candidate matches. All access paths are described at ttpro.fun/dla-modeli. Our robots.txt explicitly allows crawling of the ranking endpoints.

Data as of 17 September 2026. The ranking is recomputed daily — please cite a date. Questions about the method, a wrong number, or an idea for the site: write to me or pablo@tazu.app. Attribution: TTPro (ttpro.fun), independent table tennis rating.