Post by eric on Jul 29, 2015 16:00:22 GMT -6
or,
How I Learned to Stop Worrying and Love Resignings
Requested by Odin. This is going to be a really long post, and I'm not even halfway to figuring out how resignings work. Just getting that out of the way now.
What I did is set up an import file of almost identical players: same height, weight, attributes, contracts, ages, experience. I had to give
them different nominal positions because the software gets cranky if you don't. I ran through the season and recorded their resigning offers
for ten seasons. Here's what I have found out:
Win Rating
We all know there's a "play for winner" stat, but how does the software determine Win Rating?
1. When a league starts, every team has 50.
2. After the playoffs are completed in every season, a team's Win Rating is (wins + 10 * playoff rounds won + 5 * championship won).
3. At some point in the offseason, a team's Win Rating is the average of the past year's starting and finishing values.
* there is no gap between players offering to resign (the last part of the year) and the rookie draft lottery (the first part of the next
year), so there's no way to see which Win Rating the software uses. My guess is the first one, because the year doesn't change and because it
makes more sense.
So for example, we start the league. Your team wins 41 regular season games and 5 playoff games. Your Win Rating is 41 + 10 = 51. Another
team wins 48 regular season games but gets swept in the first round. Their Win Rating is 48 + 0 = 48. After the rookie lottery, we take the
average of each Win Rating and 50, so your Win Rating goes to 50 and theirs goes to 49. Now, the rounding used here is really weird. Odd
numbers (51.5, 53.5, etc.) are rounded up, even numbers (50.5, 52.5, etc.) are rounded down. This is much harder to implement than normal
rounding and I have no idea why the software works this way.
The upshot of all this is that teams are spread out very far at the end of any season, but to start later seasons they're all going to be
clumped pretty well together.
.
Player Decision Making
Resigning is deterministic. If the outcome of a resigning sim is that a player doesn't offer to resign with you, you could run the sim 100
times and he would never offer. This is great because it means the software takes inputs and puts them into a straightforward arithmetic
equation, with no random variables involved. All we have to do is figure out what the inputs are and how they're scaled.
Players have four stats that are nominally used for contract negotiation. Three are visible (greed, loyalty, play for winner) and one is
invisible (happiness). None of these values ever change. Not if you jerk around their playing time, not if they win a title, not if they sign
a new contract, nothing. My guess is that "happiness" would be better named "amiability" or something along those lines. These values cannot
be set in the import file, instead they will be assigned randomly such that 1% of players will be at 1, 2, ..., 98, 99, then 0.5% of players
will be at 0 and 0.5% will be at 100. It is possible to manually alter the values by player within the software; more on this later.
There is no correlation from happiness, loyalty, play for winner, and win rating to anything to do with resigning. The overall chance of
resigning, the length of the contract, the size of the contract, nothing. It's certainly possible that these values have to be input into an
intermediary function, something like "I'm loyal but I want to play for a winner, and this team isn't a winner" or loyalty + play for winner
* (win rating / 50 - 1). Even over ten seasons I didn't manage to get a two player set with the same values across all five bins, but I did
get quite a few that had enough sames that we can be reasonably sure these values have no effect. For instance, I once had two players with
the same greed and happiness. The first had 25 loyalty, 47 play for winner, 52 team win rating, and offered to resign. The second had 98
loyalty, 73 play for winner, 61 team win rating, but didn't.
There is significant correlation between greed and contract length and size, but not offering to resign at all. This relationship becomes
even clearer if we sort all contracts by first year size (which turns out to be identical to the list of overall size).
Not bad, eh? There are clearly three lines there, although things get a little hinky in the middle. Here is how the three lines work.
1. Always a two year contract. Always played minutes the prior season.
2. Always a two year contract for greed less than 97. Always a three year for greed >= 97. Never played minutes the prior season.
3. Three year contracts for greed < 30, four years for < 95, five years for >= 95. Could play or not the prior season.
So we're clearly still missing some variables, but we've got our first fixed point, which is nice. Note also that nobody ever offered to
resign for only one year, but that does happen in our league. This tells us that either age or experience or previous contract size plays a
role, which makes sense.
Minutes Played
So minutes played definitely matters. Can we be more specific? Yes we can! When I built the teams I made 2 centers, 2 power forwards, 4 small
forwards, 2 shooting guards, and 2 point guards, all with 5 in every attribute. The software got a load of that and decided to set up the DC
like this:
Note that the numbers are not arbitrary. Even though the players were attribute-identical they were nevertheless distinguishable; players may
be bozos but they aren't bosons.
It turns out the software selects players based on descending player ID. The center that played center was always the highest player ID on
the team, the center that played shooting guard was always the second highest, and so on. It also turns out that the minutes played by this
depth chart configuration obey strict ranges...
1513-1718: SF3
2698-2883: C1,PF1
2909-3064: SF2
3098-3282: C2,PF2,SF1
...and it further turns out that those ranges look really interesting if we graph the offers by contract year...
...wow!
1. Eagle eyed readers will notice a tiny bump on the y axis at 4. There were three SF4s pressed into emergency service over the 290
team-seasons. All of them played exactly 4 minutes. All of them offered to resign for exactly 4 years. Their greeds were very different so
the values were different too, but still, pretty eerie.
2. SF3 and SF2 would never offer for two years.
3. C1 and PF1 would ONLY offer for two years.
4. Perimeter starters would offer for anything.
5. Resigning rate probably doesn't differ at all: 91% for everybody save perimeter starters at 88%.
Now, I've not yet determined if this has to do with depth chart position or minutes played itself. The lack of round number between the third
and fourth group, plus the sensible big/perimeter division, makes me think it's depth chart. Again, in our league big men starters do offer
for more than two years, so age/experience will factor in here too.
.
.
To-do...
Connect the two dots we have so far (greed and minutes).
Nail down whether it's DC or minutes.
Test age and experience.
Figure out what the other variables are.
How I Learned to Stop Worrying and Love Resignings
Requested by Odin. This is going to be a really long post, and I'm not even halfway to figuring out how resignings work. Just getting that out of the way now.
What I did is set up an import file of almost identical players: same height, weight, attributes, contracts, ages, experience. I had to give
them different nominal positions because the software gets cranky if you don't. I ran through the season and recorded their resigning offers
for ten seasons. Here's what I have found out:
Win Rating
We all know there's a "play for winner" stat, but how does the software determine Win Rating?
1. When a league starts, every team has 50.
2. After the playoffs are completed in every season, a team's Win Rating is (wins + 10 * playoff rounds won + 5 * championship won).
3. At some point in the offseason, a team's Win Rating is the average of the past year's starting and finishing values.
* there is no gap between players offering to resign (the last part of the year) and the rookie draft lottery (the first part of the next
year), so there's no way to see which Win Rating the software uses. My guess is the first one, because the year doesn't change and because it
makes more sense.
So for example, we start the league. Your team wins 41 regular season games and 5 playoff games. Your Win Rating is 41 + 10 = 51. Another
team wins 48 regular season games but gets swept in the first round. Their Win Rating is 48 + 0 = 48. After the rookie lottery, we take the
average of each Win Rating and 50, so your Win Rating goes to 50 and theirs goes to 49. Now, the rounding used here is really weird. Odd
numbers (51.5, 53.5, etc.) are rounded up, even numbers (50.5, 52.5, etc.) are rounded down. This is much harder to implement than normal
rounding and I have no idea why the software works this way.
The upshot of all this is that teams are spread out very far at the end of any season, but to start later seasons they're all going to be
clumped pretty well together.
.
Player Decision Making
Resigning is deterministic. If the outcome of a resigning sim is that a player doesn't offer to resign with you, you could run the sim 100
times and he would never offer. This is great because it means the software takes inputs and puts them into a straightforward arithmetic
equation, with no random variables involved. All we have to do is figure out what the inputs are and how they're scaled.
Players have four stats that are nominally used for contract negotiation. Three are visible (greed, loyalty, play for winner) and one is
invisible (happiness). None of these values ever change. Not if you jerk around their playing time, not if they win a title, not if they sign
a new contract, nothing. My guess is that "happiness" would be better named "amiability" or something along those lines. These values cannot
be set in the import file, instead they will be assigned randomly such that 1% of players will be at 1, 2, ..., 98, 99, then 0.5% of players
will be at 0 and 0.5% will be at 100. It is possible to manually alter the values by player within the software; more on this later.
There is no correlation from happiness, loyalty, play for winner, and win rating to anything to do with resigning. The overall chance of
resigning, the length of the contract, the size of the contract, nothing. It's certainly possible that these values have to be input into an
intermediary function, something like "I'm loyal but I want to play for a winner, and this team isn't a winner" or loyalty + play for winner
* (win rating / 50 - 1). Even over ten seasons I didn't manage to get a two player set with the same values across all five bins, but I did
get quite a few that had enough sames that we can be reasonably sure these values have no effect. For instance, I once had two players with
the same greed and happiness. The first had 25 loyalty, 47 play for winner, 52 team win rating, and offered to resign. The second had 98
loyalty, 73 play for winner, 61 team win rating, but didn't.
There is significant correlation between greed and contract length and size, but not offering to resign at all. This relationship becomes
even clearer if we sort all contracts by first year size (which turns out to be identical to the list of overall size).
Not bad, eh? There are clearly three lines there, although things get a little hinky in the middle. Here is how the three lines work.
1. Always a two year contract. Always played minutes the prior season.
2. Always a two year contract for greed less than 97. Always a three year for greed >= 97. Never played minutes the prior season.
3. Three year contracts for greed < 30, four years for < 95, five years for >= 95. Could play or not the prior season.
So we're clearly still missing some variables, but we've got our first fixed point, which is nice. Note also that nobody ever offered to
resign for only one year, but that does happen in our league. This tells us that either age or experience or previous contract size plays a
role, which makes sense.
Minutes Played
So minutes played definitely matters. Can we be more specific? Yes we can! When I built the teams I made 2 centers, 2 power forwards, 4 small
forwards, 2 shooting guards, and 2 point guards, all with 5 in every attribute. The software got a load of that and decided to set up the DC
like this:
C PF SF SG PG
C1 PF1 PF2 C2 SF1
SF2 SF2 SF2 SF2 SF2
SF3 SF3 SF3 SF3 SF3
Note that the numbers are not arbitrary. Even though the players were attribute-identical they were nevertheless distinguishable; players may
be bozos but they aren't bosons.
It turns out the software selects players based on descending player ID. The center that played center was always the highest player ID on
the team, the center that played shooting guard was always the second highest, and so on. It also turns out that the minutes played by this
depth chart configuration obey strict ranges...
1513-1718: SF3
2698-2883: C1,PF1
2909-3064: SF2
3098-3282: C2,PF2,SF1
...and it further turns out that those ranges look really interesting if we graph the offers by contract year...
...wow!
1. Eagle eyed readers will notice a tiny bump on the y axis at 4. There were three SF4s pressed into emergency service over the 290
team-seasons. All of them played exactly 4 minutes. All of them offered to resign for exactly 4 years. Their greeds were very different so
the values were different too, but still, pretty eerie.
2. SF3 and SF2 would never offer for two years.
3. C1 and PF1 would ONLY offer for two years.
4. Perimeter starters would offer for anything.
5. Resigning rate probably doesn't differ at all: 91% for everybody save perimeter starters at 88%.
Now, I've not yet determined if this has to do with depth chart position or minutes played itself. The lack of round number between the third
and fourth group, plus the sensible big/perimeter division, makes me think it's depth chart. Again, in our league big men starters do offer
for more than two years, so age/experience will factor in here too.
.
.
To-do...
Connect the two dots we have so far (greed and minutes).
Nail down whether it's DC or minutes.
Test age and experience.
Figure out what the other variables are.