How they work
The South African Go Clubs Rating System
Table of Contents
Short background
The rating system used by the SA Go Clubs website was first coded by David Richfield to be an on-line rating system for SAGA. However, SAGA already had a different system for maintaining their ranks, so the system was never adopted on a major scale, except by the Stellenbosch Club, where David was a member. When Cape Town started getting a bit more active, they were incorporated onto the system as well. In September 2005 Johannesburg and Pretoria also joined the rating system, and it was renamed to the “South African Go Clubs (SAGC) ranking system”.
The system attempts to emulate the SAGA ranking system, but differences still exist, so the ranks are periodically synchronized with the SAGA ranks when they become available. (Apparently, SAGA has recently taken an official policy decision to merge the SAGA and SAGC ranks. This should happen “soon”.)
What rank do I use at my Club and Club Tournaments?
The SAGC rank.
How do I get a SAGC rank?
Come to the club, play a game, and then record it. Your name and rank will be added onto the system. Your current SAGA rank will be your point of departure.
My SAGC rank doesn’t look right, what gives?
The more games you play and record, the quicker your rank will stabilise. Please be patient.
How are games entered into the system?
First you play a game at the Club or at a Club tournament. Then you record the game (I’ve always found the best way to do this is for the winner to fill out the record sheet and get the loser to sign immediately after the game has finished. No one will take offence at this, and it will ensure that your wins get recorded). A volunteer or committee member at the Club will then enter the games into the system via the website. You can then verify that the details are correct by visiting the site and checking the log-file. It is up to you to have a look every so often.
I played, but my index hasn’t been updated?
It can take a few days, or even up to a week for the games to be entered. Please be patient.
My last updated date has gone backwards: what’s happened?
Sometimes old games are entered out-of-order, the last-updated column is actually only the date of the most recently added game, not necessarily the most recently played.
What about participation points for the WAGC? I don’t see any.
Participation points are SAGA function, not a SAGC function. SAGA will be able to get your game records from the site to enter into its ranking system.
What’s this about free games?
The games on the SAGC system have three weightings. Free or teaching games get a weight of 0 (no points are awarded for these games), normal club games get a factor of 1, and tournament games get a factor 1.5. It is assumed, unless otherwise noted on the sheet, that all the games on the record sheet are normal games.
Note that in the SAGC ranking system, free games do have an effect on index adjustments through the opponent factor. See that paragraph for an explanation. This is not the case with SAGA ranks, as free games are not entered into their system at all.
Are the SAGC ranking algorithms the same as SAGA’s?
No. SAGC uses a slightly simpler algorithm, which was created by David Richfield.
How does the system work?
Every player has a rank (minimum 30 kyu), and an index which ranges between +999 and -999. Winning games causes the index to increase, and losing games causes it to decrease. If it goes past +999, the index is reset to zero, and the players’ rank is improved by one rank. Similarly, if it goes past -999, the index is reset and the player demoted by one rank.
What restrictions are in place with regards to demotions?
A 30 kyu player cannot be demoted. The index is clamped at -999 and never goes below.
For all other ranks, the system prevents a single bad game from demoting a player. Weaker ranks get more protection than stronger ranks. Each rank tier has a chain of floor values that losing-game index updates are clamped against:
| Rank tier | Demotion floors (descending) | Minimum losses to demote |
|---|---|---|
| 25k–29k | -800, -850, -900, -950, -999 | 6 |
| 20k–24k | -850, -900, -950, -999 | 5 |
| 10k–19k | -900, -950, -999 | 4 |
| 5k–9k | -950, -999 | 3 |
| dan–4k | -999 | 2 |
A losing-game change is clamped at the next floor below the player’s current index. To demote, the player has to “walk through” each floor in turn — a single very large loss cannot skip multiple floors.
Worked example (11k). The chain is -900, -950, -999:
- Starting from index ≥ 0, the first loss is clamped at -900. (Even a huge loss can only drop to -900.)
- From the
[-900, -1]zone, the next loss is clamped at -950. - From the
[-950, -901]zone, the next loss is clamped at -999. - From the
[-999, -951]zone, a loss can finally demote — the player becomes 12k with index 0.
So an 11k needs four losses minimum to demote (three floor-stops, then a fourth loss past -999).
What are the columns in my record sheet?
The record sheet format was modified on 16 July 2004, so records from before that won’t match this description, but here goes:
| Column # | Explanation |
|---|---|
| 1 | Opponent’s username (same name indicates an adjustment) |
| 2 | Opponent’s rank |
| 3 | What colour the player took |
| 4 | Number of handicap stones |
| 5 | Komi (negative means komi awarded to Black) |
| 6 | Color of game winner |
| 7 | Game status factor (see below) |
| 8 | Change in index |
| 9 | New index |
| 10 | New rank |
| 11 | Date of game |
| 12 | Further comments |
How do I calculate my index adjustment?
The basic formula for the change in index of a player after a game is: Level Factor X Game Status Factor X Opponent Factor X Game Result Factor X Handicap Factor
The Level Factor
The Level Factor depends on the players’ rank, and is calculated from the following polynomial:
x = “number of stones weaker than a 7-dan” (for 10k: x=16, 1k: x=7, 1d: x=6) Level Factor = x^2 + 1.5x + 55 + x^5/30000
The x^5 is probably to ensure volatility at high ranks. The value for the level factor for few selected ranks are given below:
| Rank | Level Factor |
|---|---|
| 3d | 77 |
| 1k | 115 |
| 4k | 173 |
| 7k | 256 |
| 10k | 370 |
| 14k | 592 |
| 18k | 932 |
| 22k | 1455 |
If you are stronger than 7-dan, x in the level factor is set to 0.
The Game Status Factor
The Game Status Factor (GSF) reflects how seriously the game was played:
| Game type | GSF |
|---|---|
| Tournament | 1.5 |
| Club | 1.0 |
| Friendly (e.g. internet, casual) | 0.5 |
| Free / teaching | 0.0 |
Free games don’t affect either player’s index directly. They do, however, still count toward the opponent factor — see that section.
The on-line entry form labels the 0.5 category as friendly; earlier versions of this document called it internet. They mean the same thing.
The Opponent Factor
The Opponent Factor is calculated as follows: for each time the player has played the current opponent in his previous ten games, subtract 0.1 from 1. The resulting value, with a minimum of 0.1, is the opponent factor. The theory behind this is, if you only play a few people, you learn how they play, and possibly get stronger against them, but not overall. The opposite also applies. If you have only been playing one person, your game results will not be as good an indication of your true rank, and the adjustment will be smaller.
In the SAGC ranking system (unlike the SAGA ranking system which ignores free games completely), free games are included in the calculation of the “opponent factor”. Note that this means you can, for example, increase your opponent factor against people you play regularly, by playing free games against other people (for example, people more than 9 stones stronger or weaker than you, that you don’t like to play rated games against).
The Game Result Factor
The Game Result Factor (GRF) is looked up from the two tables below. The value depends on:
- Which zone you’re in — promotion zone (index ≥ 0) or demotion zone (index < 0).
- The differential — a handicap-adjusted measure of the rank gap between you and your opponent.
Differential is defined as:
differential = your_x − opponent_x − signed_eff_handicap_received
where x is the number of stones weaker than 7-dan (7d = 0, 1k = 7, 30k = 36), and the signed effective handicap is +eff_handicap if you played Black (you received the handicap stones) or −eff_handicap if you played White. A positive differential means you played a harder game than your rank suggests; a negative differential means an easier game. Any differential beyond ±3 is clamped to the >+3 or <-3 row.
Promotion zone (your index ≥ 0)
| Differential | Victory | Defeat |
|---|---|---|
| > +3 (much harder) | 3.5 | 0 |
| +3 | 3.5 | -0.09 |
| +2 | 2.2 | -0.47 |
| +1 | 1.5 | -0.81 |
| 0 | 1.0 | -1.17 |
| -1 | 0.54 | -1.44 |
| -2 | 0.13 | -1.8 |
| -3 | 0.09 | -2.7 |
| < -3 (much easier) | 0 | -2.7 |
Demotion zone (your index < 0)
| Differential | Victory | Defeat |
|---|---|---|
| > +3 (much harder) | 3.5 | 0 |
| +3 | 3.5 | 0 |
| +2 | 2.2 | -0.03 |
| +1 | 1.6 | -0.28 |
| 0 | 1.4 | -0.6 |
| -1 | 0.7 | -0.75 |
| -2 | 0.37 | -1.0 |
| -3 | 0.12 | -1.9 |
| < -3 (much easier) | 0 | -1.9 |
Two intuitions worth pulling out:
- The reward for an upset is large. Winning a game where the handicap left you at a clear disadvantage (positive differential) is rewarded heavily — the bigger the gap, the bigger the reward, up to a cap of 3.5× the base level factor at differential ≥ +3.
- The demotion zone is forgiving. In the demotion zone the wins are slightly more generous and the losses slightly less harsh, reflecting that you’re already considered weak for your rank and expected to lose.
Worked example. Suppose the weaker player takes two handicap stones too few — e.g. a 14k plays a 16k as a scratch game. The 14k is playing an easier game than they should and is expected to win; the 16k is playing a harder game.
- 14k differential: 20 − 22 − 0 = -2 (easier)
- 16k differential: 22 − 20 − 0 = +2 (harder)
If the 14k loses, their GRF is -1.8 (promo zone) or -1.0 (demo zone). If the 16k wins, their GRF is 2.2 in either zone — a substantial reward for the upset.
The Handicap Factor
The handicap factor is calculated by the formula (1 – 0.05*eff_handicap), with a minimum of 0.1 – so, for example, a 4-handicap game would have a handicap factor of 0.8, and an 8-handicap game, a factor of 0.6. The handicap calculation uses a formula which takes komi and the number of black stones played before White’s first turn into account in order to determine an effective handicap :
$eff_handicap = int($handicap - ($komi-6)/10);
This formula roughly means that every 10 points komi is considered equivalent to one handicap stone, and that scratch games count as 0 handicap.
A Complete Example
Alice (10k, index +200) plays Bob (7k, index -50) at the club. They settle on 2 handicap stones and 0.5 komi. Alice plays Black and wins.
Alice’s index change:
| Factor | Value | Notes |
|---|---|---|
| Level Factor | 369.95 | LF(10k) — x = 16, so 16² + 1.5·16 + 55 + 16⁵/30000 |
| Game Status Factor | 1.0 | Club game |
| Opponent Factor | 1.0 | First time playing Bob in the last 10 games |
| Effective handicap | 2 | int(2 − (0.5 − 6)/10) = int(2.55) |
| Handicap Factor | 0.9 | 1 − 0.05·2 |
| Differential | +1 | 16 − 13 − 2 (Alice/Black received 2 stones) |
| Game Result Factor | 1.5 | Promotion zone, victory, differential +1 |
Change = 369.95 × 1.0 × 1.0 × 1.5 × 0.9 = 499.4, truncated to 499.
Alice’s new index = 200 + 499 = 699, still 10k.
Bob’s index change:
| Factor | Value | Notes |
|---|---|---|
| Level Factor | 255.87 | LF(7k) — x = 13 |
| Game Status Factor | 1.0 | Club game |
| Opponent Factor | 1.0 | Same logic |
| Handicap Factor | 0.9 | Same effective handicap of 2 |
| Differential | -1 | 13 − 16 − (−2) (Bob/White gave 2 stones) |
| Game Result Factor | -0.75 | Demotion zone, defeat, differential -1 |
Change = 255.87 × 1.0 × 1.0 × -0.75 × 0.9 = -172.7, truncated to -172.
Bob’s new index = -50 + (-172) = -222, still 7k.
A Short 22k-30k Example
Carol (25k, index 0) plays Dave (28k, index 0) at a tournament with no handicap and standard komi (6.5). Dave plays Black, Carol plays White. Dave wins.
Dave’s index change:
- LF(28k) ≈ 2776.5 (x = 34, so 34² + 1.5·34 + 55 + 34⁵/30000)
- GSF = 1.5 (tournament), OF = 1.0, HF = 1.0
- Differential (Dave/Black): 34 − 31 − 0 = +3
- GRF: promotion zone, victory, +3 → 3.5
- Change = 2776.5 × 1.5 × 1.0 × 3.5 × 1.0 ≈ 14576
That’s enormously over +999. The index resets to 0 (overflow discarded — it does not carry into the new rank), and Dave is promoted: new state = 27k, index 0.
Carol’s index change:
- LF(25k) ≈ 2016.8 (x = 31)
- GSF = 1.5 (tournament), OF = 1.0, HF = 1.0
- Differential (Carol/White): 31 − 34 − 0 = -3
- GRF: promotion zone, defeat, -3 → -2.7
- Change ≈ -8168
Carol is in the 25k–29k tier, so the first demotion floor is -800. Her new index is clamped: -800, still 25k. (See the demotion restrictions section.)
This example illustrates two things:
- Beginners’ index swings are large — the Level Factor dominates at weak ranks, and the tournament GSF (1.5) amplifies further. A single decisive game can move the raw index by many thousand points.
- The demotion floors stop that volatility from cascading into a demotion on a single bad game. Carol would need five more losses, walking through each floor in turn, before actually dropping to 26k.
“I still don’t understand!”
Mail me where you are confused or if you have any questions to be added to the list above, or leave a comment, and I will try and make it clearer.