Player Rating Calculation

From Soccerverse Wiki
Revision as of 21:46, 22 July 2026 by Andrew.gore (talk | contribs) (Created page with "# How Player Ratings Are Calculated > Draft for review. This article separates the easy explanation from the full technical detail. It describes the current `player_ratings_v2` and `baseratings` calculations found in the Soccerverse source repositories. ## The simple explanation Every player has four skill ratings: - **Goalkeeping** - **Tackling** - **Passing** - **Shooting** A player's **overall rating is their highest skill rating**. It is not an average of all fo...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
  1. How Player Ratings Are Calculated

> Draft for review. This article separates the easy explanation from the full technical detail. It describes the current `player_ratings_v2` and `baseratings` calculations found in the Soccerverse source repositories.

    1. The simple explanation

Every player has four skill ratings:

- **Goalkeeping** - **Tackling** - **Passing** - **Shooting**

A player's **overall rating is their highest skill rating**. It is not an average of all four skills.

For example, a player with these skills:

```text Goalkeeping 50 Tackling 72 Passing 76 Shooting 81 Overall 81 ```

has an overall rating of 81 because shooting is their strongest skill.

      1. Where the ratings come from

The calculation has two main parts:

1. **The strength of the player's real-life club** provides a starting or "base" rating. 2. **The player's own recent real-life performances** add skill points for passing, shooting, tackling or goalkeeping.

In simple terms:

```text Player skill rating = club base rating + performance skill points ```

Some adjustments are then applied for the player's position, and every final skill rating is kept between 50 and 99.

      1. Why club strength matters

A player's statistics must be viewed in context. Performing well for a strong club in a strong competition is not treated exactly the same as recording similar numbers at a much lower standard.

The Base Ratings service estimates club strength using league results and competition context. It uses:

- points per game; - the club's position relative to other clubs in the same division; - the absolute division level; - the country's strength multiplier; and - a small list of documented manual overrides for clubs whose latest covered standings no longer reflect their real competition level.

The country multipliers run on a scale up to 100. England, France, Germany, Italy and Spain currently use 100. Examples below that level include Portugal 88, the Netherlands 83, Austria 81, Brazil 80, Belgium 79, Scotland 78, Croatia 77, Mexico 75, Argentina and Saudi Arabia 74, and the United States 70.

This produces a club base rating between 50 and 79, which is then used as the starting point for player skills.

      1. How performance skill points work

The system compares a player's statistics with other players in the same country, division and monthly period. Very low and very high statistical outliers are limited so that one unusual result does not dominate the calculation.

The main inputs are:

- **Passing:** passes, key passes and successful dribbles per minute. - **Shooting:** goals, shots on target, assists and minutes played. - **Tackling:** duels won, interceptions, tackles, blocks and minutes played. - **Goalkeeping:** currently based primarily on qualifying minutes played as a goalkeeper.

A player normally needs at least **300 qualifying minutes** before the match-data calculation is used.

      1. What happens when there is not enough data?

If a player does not have enough qualifying match data, the system does not invent statistics. It instead estimates the player's skills from:

- their club's base rating; - their age; and - their position.

If the player is linked to more than one club, the highest available club base rating is used. If no usable club base rating exists, the player is retired, or the player is a free agent, the fallback base rating is 50.

      1. Why projected ratings do not always jump straight to the calculated number

For existing players, large movements are softened. Each skill moves towards its newly calculated target, but a very large change is not always applied all at once.

This reduces sudden extreme changes caused by a new data source, a small sample, a transfer or a major change in competition level.

      1. Example: player with match data from two clubs

Suppose a player records 600 qualifying minutes for Club A and 300 for Club B. After the club-level calculations, their tackling rating is 79 for Club A and 72 for Club B.

The combined rating is weighted by minutes:

```text ((79 × 600) + (72 × 300)) ÷ 900 = 76.67 Rounded tackling rating = 77 ```

The club where the player played more minutes therefore has more influence on the result.

      1. Example: player without enough match data

Suppose a 30-year-old defender has a club base rating of 64. The age-and-position table gives this example defender:

```text Tackling adjustment +8 Passing adjustment +2 Shooting adjustment +3 ```

The estimated skills are:

```text Goalkeeping 50 Tackling 64 + 8 = 72 Passing 64 + 2 = 66 Shooting 64 + 3 = 67 Overall 72 ```

The overall is 72 because tackling is the highest skill.

    1. Detailed explanation
      1. Current and projected ratings

On SoccerRatings, **current** and **projected** refer to different stored rating snapshots:

- The current rating is the historical/current Soccerverse rating snapshot. - The projected rating is the result currently calculated for a future ratings update.

The website displays these stored results; it does not calculate them separately in the browser.

      1. Verified club base-rating formula

The Base Ratings calculation uses the most recent sufficiently complete season available for each club. Its only performance input is:

```text Points per game = league points ÷ matches played ```

It does not use goals, recent form, squad value, player reputation or market data.

Within each country and division, the 5th and 95th percentile points-per-game values are used to reduce the effect of outliers. The club is placed within a division score band:

```text Division 1: 700–1000 Division 2: 490–700 Division 3: 343–490 Division 4: 240.1–343 ```

For division number `d`, the general formula is:

```text maximum division score = 1000 × 0.7^(d − 1) minimum division score = maximum division score × 0.7 ```

The club's points per game is limited to the percentile range and converted into its position within that division band:

```text position =

 (clipped PPG − 5th-percentile PPG)
 ÷ (95th-percentile PPG − 5th-percentile PPG)

country score =

 minimum division score
 + position × (maximum division score − minimum division score)

```

The country multiplier is then applied:

```text global score = country score × (country multiplier ÷ 100) ```

Finally, the global scores from the current calculation run are scaled into the 50–79 base-rating range:

```text effective score = max(0, global score − 200) effective maximum = strongest global score in the run − 200

base rating =

 round(50 + (effective score ÷ effective maximum) × 29)

base rating is limited to 50–79 ```

A missing country multiplier behaves as zero. A club without usable standings, or whose strength falls below the global floor, receives the minimum base rating of 50. The strongest calculated club in each run anchors rating 79, so the final scale is relative to that run rather than to a permanently hardcoded maximum club.

      1. Statistical normalization

For each statistic, the system finds configured low and high percentile values among the comparison group. The player's value is limited to that range and converted into points:

```text clipped value = value limited to the low/high percentile range

component points =

 (clipped value - low value)
 ÷ (high value - low value)
 × maximum points for that component

```

If the comparison range is missing or has no width, that component contributes zero points.

      1. Skill-point weights
        1. Passing — maximum 20 skill points

```text Passes per minute up to 16 points Key passes per minute up to 2 points Successful dribbles per minute up to 2 points ```

        1. Shooting — maximum 20 skill points

```text Goals per minute up to 8 points Minutes played up to 6 points Shots on target per minute up to 4 points Assists per minute up to 2 points ```

        1. Tackling — maximum 20 skill points

```text Duels-won percentage up to 12 points Minutes played up to 4 points Interceptions per minute up to 2 points Tackles per minute up to 1 point Blocks per minute up to 1 point ```

The duels-won percentage is set to zero where fewer than 10 duels are recorded for that row.

        1. Goalkeeping — maximum 16 skill points

For recognised goalkeepers, the current calculation awards goalkeeping points from normalized qualifying minutes. Non-goalkeepers receive a goalkeeping rating of 50.

      1. Final match-data skill formula

For most skills:

```text Final skill rating =

 club base rating
 + calculated skill points
 + any positional adjustment

```

The result is limited to the range 50–99.

Current positional adjustments include:

- Goalkeepers receive a 15-point reduction to passing, shooting and tackling. - Players whose main position is left-back, centre-back or right-back receive a 5-point passing reduction. - A non-goalkeeper's goalkeeping rating remains 50 rather than having the club base added to it.

      1. Combining records from more than one club

Each skill is combined separately using minutes played:

```text Combined skill =

 round(sum(club skill rating × club minutes) ÷ total club minutes)

```

The overall is then:

```text Overall = maximum of goalkeeping, tackling, passing and shooting ```

      1. No-data calculation

Where qualifying match data is unavailable, the system selects an age-and-position adjustment from a lookup table.

For an outfield player:

```text Goalkeeping = 50 Tackling = club base + age/position tackling adjustment Passing = club base + age/position passing adjustment Shooting = club base + age/position shooting adjustment Overall = highest skill ```

For a goalkeeper, the age adjustment is applied to goalkeeping, while the other three skills also receive the goalkeeper's 15-point positional reduction.

The lookup uses whole ages and does not interpolate between birthdays. Ages outside a table use the first or last available adjustment.

      1. Limiting large movements

For an existing player, each new target skill is compared with the current skill.

If the difference is five points or fewer, the target is accepted. For larger differences:

```text Allowed movement = 5 + ceil((absolute difference - 5) × 0.5) ```

The skill moves by that allowed amount towards the target. Overall is then recalculated from the adjusted skills rather than limited separately.

Example: current shooting 60, calculated target 77:

```text Difference = 17 Allowed movement = 5 + ceil((17 - 5) × 0.5)

                = 11

Projected shooting = 60 + 11

                  = 71

```

      1. Important limitations and data-quality notes

- A projection is not the live Soccerverse rating until a rating update is applied by the game. - Players with fewer than 300 qualifying minutes normally use the no-data route. - Missing club mappings, retired status or free-agent status can cause the base-50 fallback. - Existing-player movement limits can make the displayed projection different from the raw statistical target. - Real-life data providers can correct or update match statistics after matches. - Country strength is applied using the maintained multiplier table in the separate Base Ratings repository. - A missing multiplier behaves as zero and can therefore cause a club to receive the rating floor.

    1. Sources for verification

Public pages:

- https://soccerratings.org/ - https://baseratings.soccerratings.org/ - https://soccerratings.org/player/184

Current calculation source reviewed:

- `baseratings/country_multipliers.csv` - `baseratings/docs/base-ratings-calculation.md` - `baseratings/scripts/calculate-new-base-ratings.ts` - `player_ratings_v2/config/skill_config.yaml` - `player_ratings_v2/processors/skill_calculator.py` - `player_ratings_v2/processors/season_player_builder.py` - `player_ratings_v2/processors/nodata_handler.py` - `player_ratings_v2/processors/skills/` - `player_ratings_v2/utils/normalization.py` - `player_ratings_v2/utils/rating_movement.py`

---

  1. Editorial notes before publication

1. Decide whether the complete 154-country multiplier table should be reproduced on the wiki or summarized with examples. 2. Confirm whether the current goalkeeping model being minutes-led is intended for public emphasis. 3. Decide whether positional penalties should be shown in the public technical section or summarized more generally. 4. Resolve a documentation contradiction: the community summary says there are no manual adjustments, while the source-of-truth calculation document confirms a small post-calculation override list. 5. Replace private repository references with suitable public wiki citations where appropriate.