Edit8:
Minimum points won cap explained**************************************************************************************************************
Edit7:
Full match history from low Bronze to mid Master:**************************************************************************************************************
Edit6:
F with minor corrections:
**************************************************************************************************************
Edit5:
Third offset estimates released**************************************************************************************************************
Edit4:
Second offset estimates released**************************************************************************************************************
Edit3:
First offset estimates
released for EU and US:
**************************************************************************************************************
Edit2:
New F function found.
Post.**************************************************************************************************************
Edit:Skeletor and I published a tool that helps you calculate your MMR automatically, as well as have the option to help the community gather data which will hopefully help us figure out the secret division modifiers below Masters, division tier modifiers, how much MMR is needed to cross into different leagues, etc. You can read more about it
here.
**************************************************************************************************************
I will try to keep this brief for clarity, but I also want to describe how I came upon what I present here. If you simply wish to find out how you can calculate your MMR based on the results of a single match, skip to the end.
I assume readers are familiar with the ladder system and it's inner workings, including what are adjusted points, MMR, etc. If you aren't or need a reminder check out Excalibur_Z's sticky thread
here. Questions relating to basic, known, elements of the ladder system
please take to that sticky thread.
Before I start, let me quickly run through some reasons why should you care about your MMR:
- MMR is the ELO rating which represents your skill. It shifts wildly, that is why Blizzard does not reveal it. However some of us want to know our skill and whether or not we progress.
- It can (eventually) be used to find out league promotion / demotion threadholds, and how close are you to a promotion.
- At the beginning of each new season everyone's adjusted points starts at 0. It can take anywhere up to a 100 matches or even more before your adjusted points have caught on with your MMR. Until then your adjusted points will continue to slowly shift towards your MMR. This is good if you like seeing your points change and get a feeling of 'progression' with each game you play, but if you wish to tell whether or not you improve as a player it is meaningless.
- You could see who the best players on each server truly are.
- It can (with work) be used to help find out the hidden league points modifiers and league tiers modifiers of each league.
Hopefully I have you intrigued by now.
This past month I have been working on a tool that tracks adjusted points over time of multiple players (Which can be found
here). It bothered me that it took several dozens games for player's adjusted points to begin catching up with their skill level and I wanted to find a way around it. As you know from Excalibur_Z's thread, the points your opponent gains/loses after the match are dependent on
the difference between your opponent's adjusted points, and your MMR. Let's call this formula F.
F(your MMR, your opponent adjusted points) -> [0..24]
When you lose a match you lose 24 minus the amount of points you would've gained had you won it. So if you lose a match, to find out how many points you would've gained, we simply calculate 24 minus the amount of points that you lost.
If we knew F, then calculating your MMR would be a simple matter of looking at your opponent's adjusted points before his match with you, looking at how many points your opponent gained / lost, and finding out your MMR would be trivial. We know your opponent's adjusted points, can we find out function F?
I tried several approaches until I found one I was satisfied with, but now I'm fairly confident I nailed it.
I started out with looking at some matches of 7 different Grandmaster players. To start out with I assumed their MMRs were fixed (naturally this isn't the case) and grabbed some data points. Before I could plot them on a single graph I had to normalize the results of the 7 different players by adding a different value for each (representing their individual MMRs). When I did that I was able to get a graph that was fairly linear.
Click on photo for full screen version.
I started out suspecting that F was a linear function, and this made me more sure of it. If F is a linear function, what we expect to find from plotting it on a graph is 2 parallel lines with a downward slope, that pass point xy (12, 0) from either side, and that cover unique ranges for each number between 0 and 24. In the graph above this isn't the case, but that is due to my assumption that the players MMRs were fixed.
I ran trend lines on the high results and low results from the data, and came up with slopes of 30.5 and 31.5. I came up with a candidate that seemed good to me and use 32 as slope. I picked this number because it was close to the numbers I got, because it seemed like a number some algorithm writer that works for Blizzard may use for the algorithm, and because this mean the range covered is between -400 and +400, nice round numbers. Also I seem to recall the 400 number used as an extreme gap in ELO differences cases. Here is the candidate for F function that I picked (Edit: A better F function has been found, linked at top of the post. Keeping this for record):
To reiterate, F function takes as input the difference between your MMR and your opponent's adjusted points, and outputs a number between 0 and 24 which is the amount of points your opponent will gain in case he wins.
I needed a way to test out my F candidate. The problem is we have 2 unknown variables, F and MMR, and each additional player just brings another unknown variable in his own MMR. I was searching for a way to remove MMR from the equation. I decided to try looking at Grandmaster players who have between 180 and 210 adjusted points, who played at least 80 games this season, and who have less than 70% win/loss ratio. There were 15 such players, and for each one I looked only at the last game he won. The idea was that hopefully their MMRs are fairly close. Nope.
In retrospec it's not surprising it didn't work. Even for fairly closely skilled players, MMRs vary greatly on a game by game basis. Their MMRs are too far apart for this to have worked.
Then I came up with the solution. Instead of looking at multiple players, look at a single player over many matches. This way eventhough the MMR changes from match to match, we still know some things about it at each point. We know that MMR rises after a win and drops after a loss. Should an F candidate tell us that a player lost MMR after winning a game, we'll know it to be wrong.
Allow me to intersect for a moment at this point and describe my data gathering process. This is technical but I feel important to mention for those who are interested. I would pick a player (player A) I wanted to gather data about, and look at his match history in game (the website based one is far too inadequate for this. It doesn't even tell you who his opponent was). For each game I would go to the opponent's (B) profile and see how many points B gained/loss for his match against A. If A won and B lost this was easy. Simply see how many points B lost, add 24 and that was how many points B would've gained. When B won it was much harder, because all we see is the amount of points B gained, but that includes bonus pool points as well. We don't care about bonus pool points, only adjusted points gained. In a lot of cases, it's impossible to tell how many points B won. If B has a large bonus pool it's easy, you know he got 100% bonus pool points. In all other cases, there is some guesswork involved. Even if you know for a fact B didn't have stored unspent bonus pool at the time of playing A, it's possible he got another point during his match with A.
Another note about data gathering: We wish to know the amount of adjusted points B had at the beginning of his match against A. To know this we have to calculate retrospectively from his current points and add/subtract the points he gained/lost since his match with A (a long, tedious process, made more so the more games B played since his match against A). To this number we then add B's current unspent bonus pool. What we end up with isn't the amount of adjusted points B had at the time of his game against A, instead with come up with the adjusted points B had at the time of his game against A PLUS the current server total bonus pool. This is okay because as long as we collect all the data points for all of A's opponents at the same time, this number is shared across all of A's opponents, and does not tilt our calculations for F. It's like all of A's opponents (and consequently A's MMR) get a bonus of the amount of current bonus pool points of the server. This number can simply be subtracted from all the data at the end of the data gathering process.
Due to the reasons stated above and the nature of the work I was looking for a player who plays a lot of games, in Master's league, and preferably that plays no or very few Diamond / GMs (mostly Diamond players that really hurt the data gathering, since Diamond league has 7 division tiers with hidden points modifiers). I used SC2Ranks to sort the list of European Master players by games played, and ended up finding the #7 one in game, a player named FoPǂChimaira who plays 30 games/day average for the entire season, 420 games total. Pretty nice.
I gathered data from his last 107 games that he played in the last 2 days. Unfortunately he played 15 Diamond players among those games, and these are all basically null data points as far as I'm concerned.
Here is the result:
The Y axis is adjusted points in Master league. On the X axis we have 107 games, on the far left is the first match and they progress moving rightwards. The bars are the results of inputting the opponent adjusted points and amount of points gained/lost into my F function candidate.
Blue bars are wins, red bars are losses. The error margins at the top of each bar are 32 points wide and represent all possible MMR values that match the data for opponent adj points and points gained/lost from match. It's important to emphasize that these are not 'error margins' per say, rather the result of F outputting one value for 32 difference inputs. One last thing about the graph: The bar and predicted MMR values are based off the values that exist at the beginning of the match. The opponent adjusted points, and points gained/lost and FoPǂChimaira's MMR. This means for a bar that is red indicating loss, you expect to see the MMR drop in the next game. Similarly for a blue bar you expect to see the MMR rise in the next game.
The way I tested my proposed F function was to look for things that shouldn't happen. If following a loss the MMR range is entirely above than it was for the previous game, then F is wrong. Similarly if following a win the MMR range is entirely below the previous value, then it is also wrong.
If you watch the graph closely you will note there are about 4 cases that similarly do not add up. This can be due to several things:
a) My proposed F function is wrong.
b) Data point is wrong due to mistake inputting the data.
c) A match against a Diamond league opponent / a match where the opponent won and I failed to account for the correct bonus pool part of the points won of the opponent.
edit: d) His opponent got promoted / demoted since they played their game.
Also important to note that matches where the opponent gains 24 or 0 points are also useless data. This is because a result of +24 +0 points only supplies a lower and upper boundaries for MMR.
Despite the few irregularities in the graph, I am fairly confident of the number 32 as the slope value. The only thing I have reservations about is that I noticed a few oddities that tend to happen when the opponent wins 23 points, and I am unsure why this happens. It could be that F is not linear at those ranges. I do not know. Either way if my F is wrong, it is very close, especially at the +2->+22 range, which is the great majority of matches.
I experimented with different slope values and ruled out slope values of 30 or less, and 33 or higher due to inconsistent results that I am sure are accurate.
Let's look at the same graph, with FoPǂChimaira adjusted points thrown on top of it.
As expected, MMR changes more rapidly than adjusted points. Another interesting thing is that the slope of the adjusted points is related with the changes in MMR. A big upwards rise in adjusted points corrolates with beating a stronger opponent, in which case the MMR will rise faster. Similarly a big lowering of the adjusted points line indicates a loss to a weaker opponent, in which case MMR will plummet.
Link to excel sheetI'll sum up with stating how to easily calculate your MMR based on the results of a single match of yours (alternatively use my script
here):
1. Calculate opponent's adjusted points before your match together by taking his current points, adding his current unspent bonus pool, subtracting current total season bonus pool for your server (can be found by looking at a player with 0 wins, alternatively
here), and subtract the amount of points that he gained from your match in case he won, or add the points that he lost from playing you in case of a loss.
2. Take the amount of points that he gained (if he lost, add 24 to the amount of points that he lost). Make sure you're not including bonus points that he gained, only actual points. Either ask him, guess, or wait until you beat an opponent. Find the matching row with the amount of points he gained here(Edit: A better F function has been found, linked at top of the post. Keeping this for record):
Add to your opponent adjusted points before the match the matching values from the right rows, and that's your MMR within 32 points range.
Example:
You played against a Master league opponent who had 150 adjusted points before your game. You won the match and he lost 9 points. -9 + 24 = 15, so look in the row with 15 next to it. It says 80-112, so you know that before your match against him, your MMR was between 230 and 262 points.
A note: you can only find your MMR in relation to the league modifier of your opponent. If you're playing Master opponents you'll get consistent results. If you meet up with Grandmasters you can translate the number into Master points by adding 430 to it. For those of you under Master league, you are going to see results that vary more. Leagues below master have the following separate division tiers with their unique points modifiers:
Grandmaster: One Tier
Master: One Tier
Diamond: 7 Tiers
- Tier 1: +150 from Master
- Tier 2: +213 from Master
- Tier 3: +276 from Master
- Tier 4: +339 from Master
- Tier 5: +402 from Master
- Tier 6: +465 from Master
- Tier 7: +528 from Master
Platinum: 3 Tiers, unknown offset
Gold: 2 Tiers, unknown offset
Silver: 3 Tiers, unknown offset per tier
Bronze: 7 Tiers, unknown point offset per tier
If you calculate your MMR based on a game against, a Platinum opponent, you will know that your MMR was within 32 points before the match against an opponent in some Platinum division tier.
I hope that using what I discuss here, people will be able to find out more about the ladder system so that we may all have better understanding of the environment we operate under.