THE BOOK cover
The Unwritten Book is Finally Written!
An in-depth analysis of: The sacrifice bunt, batter/pitcher matchups, the intentional base on balls, optimizing a batting lineup, hot and cold streaks, clutch performance, platooning strategies, and much more.
Read Excerpts & Customer Reviews

Buy The Book from Amazon


SABR101 required reading if you enter this site. Check out the Sabermetric Wiki. And interesting baseball books.
MOST RECENT ARTICLES
MAIL : You ask | We say

Advanced


THE BOOK--Playing The Percentages In Baseball

<< Back to main

Monday, August 22, 2011

How to convert an ordered list into a dollar-value list

By Tangotiger, 01:13 PM

Someone asked me how I convert the ordered list of ballots into an implied dollar-value list.

I think we’ve discussed this in the past.  And perhaps there are better ways to do it.  I’ll show you my way, and you can figure out if it works for you, or if you can improve it:


In my league, there are 550 players to draft, the average player is 10$, and the minimum is 1$.

This is the core:
=( 549 / (548+ORDER_ID) -0.5 ) ^ 1.56

The 549 is one less than 550, and the 548 is two less.  In this way, if ORDER_ID = 1, then you get 549/549 = 1, and if ORDER_ID = 550, you get 549/998 = 0.5.  That sets the extreme range from 1 to 0.5.

I then subtract 0.5 to get the range from 0.5 to 0.

I raise to the power of 1.56 to get a non-linear function that approximates how dollars are spent by ORDER_ID.

The average for all that (ORDER_ID from 1 to 550) is 0.095.  So, you do (10-1)/.095 to get the multiplier (which is 95 in my case), and then you add 1$ because that’s the minimum.  The “10” above is for an average of 10$ per player.  If your average is higher (say 260/23 = 11.3), then use 11.3 instead of 10.

So, you take the core above, and do this:
CORE * 95 + 1

You do that, and, in a league of 550 picks, you get this:
1 $33
50 $25
100 $19
150 $15
200 $11
250 $8
300 $6
350 $4
400 $3
450 $2
500 $1
550 $1

If you have say 300 players in your league drafted, where the average player is 11.3$, you start with this:
=( 299 / (298+ORDER_ID) -0.5 ) ^ 1.56

In this case, you multiply by 109 and add 1.  So, now you have this:
1 $38
50 $23
100 $14
150 $8
200 $4
250 $2
300 $1

Of course, this is “on average”.  We can’t always assume that the #1 guy is of the same expectation levels each year.  This is just a quick way to work this out.

#1          (see all posts) 2011/08/22 (Mon) @ 14:55

How did you derive the non-linear function to approximate how dollars are spent (i.e., the ^1.56)?  I was just working on a similar problem this weekend but decided to work back from observed values.  In practice, most fantasy football auctions seem to have a significantly steeper distribution than this model would suggest.


#2    Geoff Buchan      (see all posts) 2011/08/22 (Mon) @ 15:17

I’d say an ordered draft list isn’t enough information to determine prices - ideally you have some underlying value metric that you use to determine your ordered list, and you weigh by that.

The point is that some years there’s a clear #1 who is much better than #2-5, but other years #1-5 are all quite close. So you want a system that can reflect that possibility. Tango’s algorithm is assuming a shrinking spread between players as you move down the list. That’s good when all you have is a draft list, but you can do better with more information.

If you scale your value list so that the last player drafted has value 0, then you can sum the positive values to get a talent pool, and count the marginal dollars (total money above the minimum per player) to get a money pool. Then divide the money by the talent pool, and apply that ratio to each player’s value, adding back the minimum bid. That’s how I compute prices for RotoValue.

Now how you determine that value number is a whole different ballgame…


#3    Tangotiger      (see all posts) 2011/08/22 (Mon) @ 15:19

You need to figure out how many points above baseline for every player, such that the baseline is the last player picked.

That’s your starting point.  If you want to provide me with such a list, then I can figure it out for you in a couple of minutes.

email to:
tom~tangotiger~net

replace ~ as appropriate


#4    Tangotiger      (see all posts) 2011/08/22 (Mon) @ 15:21

"That’s good when all you have is a draft list, but you can do better with more information. “

Right, the ONLY reason I’m doing this was to take the ordered list from the 22 pro forecasters, so I can “work backwards” to derive a dollar value list.  I have no other information.

***

I already have a thread from a few years ago that shows how to compute the dollar values from the “estimated points” for each player.  So, if I have points as my information, then I can get you a much better dollar value.

***

Again, my constraints is the ordered list and that’s all I have.  Hence, the title of this thread.


#5          (see all posts) 2011/08/22 (Mon) @ 16:05

"Again, my constraints is the ordered list and that’s all I have.  Hence, the title of this thread.”

But how did you decide on the shape of the non-linear spending function?


#6    Tangotiger      (see all posts) 2011/08/22 (Mon) @ 16:08

I answered in Tango/3.


#7          (see all posts) 2011/08/22 (Mon) @ 23:09

Tom, I think we are talking past each other.  I, like you, am trying to convert an ordered list into dollar values.  There are no players, no projections, no points, just an ordered list that I need to convert into a dollar value list.

To convert an ordered list into dollars, the roughest approximation would be linear, but we know that that does not do a good job of describing how money would be spent.  Thus, you went a step further and “raise to the power of 1.56 to get a non-linear function that approximates how dollars are spent by ORDER_ID.” Why 1.56?  Why did you choose this particular non-linear function?  I’m sure I would recognize it if my college mathematics were fresher in memory, but unfortunately I am not seeing it.

If my questions don’t make sense or would be tiresome to answer, then just move on and don’t worry about it; at this point my little project is done so I am pursuing this only out of curiosity.


#8    Tangotiger      (see all posts) 2011/08/23 (Tue) @ 07:59

In order to create my function, I relied on past forecasted points.  So, in the forecaster’s challenge, the typical league leader would be around 150 points forecasted, and the bottom guy would be 50 points.  I used that distribution to convert into dollars.  Then I used that list to correlate dollars to order_id.

Therefore, if you can send me past seasons with past forecasted points, then I can help you out.


#9    Geoff Buchan      (see all posts) 2011/08/23 (Tue) @ 09:06

It sounds like Tom is choosing the exponent to better match a similar situation where he has points, e.g. previous forecasters’ challenge player results.

In the particular case of the forecasters’ challenge, I suspect he could get points from many forecasters if he asked - I could certainly provide them for my projections - but it may not be relevant or worth the effort for his purposes.

This exercise is similar to to Cy Young poll question: in both cases you could arrive at a better answer if given more input data, but it’s also interesting to see what you can do with less information.


#10    Tangotiger      (see all posts) 2011/08/23 (Tue) @ 09:09

Right, I don’t need anything for baseball.  I use the Marcel forecasts going back to 2001, and that’s good enough.

The question here is about football.  I don’t have any data, which is why I am asking for that data.  If I get a list of “points” forecasted, then I can do the same process.


#11    Jason Kramer      (see all posts) 2011/08/23 (Tue) @ 09:43

I can send you last year’s Football Outsiders projections. Email me at jasonakramer AT gmail.com


#12    Tangotiger      (see all posts) 2011/08/23 (Tue) @ 10:02

The list would have to be converted into a points list.  If someone else wants to do that, and then send it to me, then I can do what I do.

tom~tangotiger~net


#13    Jason Kramer      (see all posts) 2011/08/23 (Tue) @ 12:04

The Football Outsiders list is a points projection; both total points and points over baseline.


#14    Tangotiger      (see all posts) 2011/08/23 (Tue) @ 14:14

Thanks to James for sending me a file.

Using the 2011 forecasts provided, I get this:

$value = [1/(order_id + 87) - 1/287] * 4000

This is based on having 200 players in the league, such that the average player is worth 10$.

The #1 player, under this system, comes out to 32$, and the top 10 average 30$.

Is that typically what happens?


#15    Tangotiger      (see all posts) 2011/08/23 (Tue) @ 14:24

If I use the 2010 data provided, I get this:

$value = [1/(order_id + 70) - 1/270] * 3300

So, that’s all you have to do.  Play around with that “70” number.  The “270” is just 200 + the number you play around with.

And the “3300” is a constant you use so that the average dollar comes out to what you want.

***

Oops… the average is actually 11$, because we really should add 1$ to the above.  Right now, the above is set so the minimum is 0$.


#16    Tangotiger      (see all posts) 2011/08/23 (Tue) @ 14:25

Oh, and the 2nd equation gives you the top dollar of 34$ (or 35$ if we add 1$ across the board).

The top 10 is 32$ (or 33$ if we add 1$).

Hope this helps…


#17          (see all posts) 2011/08/23 (Tue) @ 16:47

Tango, this is James from the email.

In short, no, that’s not what happens. But to make sure we’re on the same page, let’s set up the league specifications: 10 teams, 16 slots, thus total player pool of 160 players, $200 per team, total of $2000 in play, minimum of $1.

Using your ordered equation above and the 1.56 exponent, that’s an average player value of 12.5, an average CORE of ~.095, a multiplier of ~121, so the prices work out to:

1 $42
10 $35
50 $16
100 $5
150 $1

I did the same calculations for a 200 player league and found lower values than you did ($27 for the top pick) so I’m assuming you must have changed the exponent to about 2 based upon the projections. Rerunning my calcs for the 160 player league with a exponent of 2 I found:

1 $51
10 $41
30 $25
50 $15
100 $4
150 $1

That’s closer but still undersells the upper end of ESPN and Yahoo’s suggested auction prices. For comparison:

1 $59
10 $45
30 $21
50 $14
100 $4
150 $1

Are they overvaluing the top tier of players, or could they be including some sort of “safe pick” premium?

On the other hand, we never factored in positional scarcity, and that’s probably my fault for providing you with an unrepresentative projection set. Give me a bit and I’ll try and send you what I figure that should look like.


#18    Tangotiger      (see all posts) 2011/08/23 (Tue) @ 16:52

The exponent was 1.  The formula was exactly what I said.

So, yeah, give me a more representative list, and if it’s only 160 players, then give me 160.  And if the dollar value per player on average is 12.50$ then that’s what I’ll use.

We’ll get to the bottom of this!


#19    JEH      (see all posts) 2011/08/23 (Tue) @ 17:17

Here’s a cut and paste of an answer I provided to someone who asked about assigning dollar values to an ADP list (that did not match the rules he was playing by).  There’s some extra stuff here, and I don’t claim it’s near optimal, but it seems relevant.  It’s how I do it, even if it is more work than how Tango does it.  It was a 14 team league.

“Quick hints on pricing players on the fly for this league (You don’t mention how you get to 29 roster spots so I’ll guess 3 extra pitchers and 3 extra hitters (any).):

Start with an ADP draft list for a 5v5 league.

Identify the players that do well/poorly in the additional categories (high BB, low K batters, starters with high QS (can use WHIP, ERA as a proxy) and set-up guys). Rearrange the list for these adjustments . . . the big change will be closers and high K/low BB hitters falling. Set-up men, good starters on bad teams and high OBP hitters will get a bit of a boost.

Then, assign each player the following dollar value:

(45.41 * SQRT(1.359 ^ (-1 * (ADP/14))) + 1

It’s a quick guess, but it passes the sniff test. Player #1 (of 406 rostered) comes in at $46, player 20 at $37, player 40 at $30, player 60 at $24, player 80 at $20 and player 100 at $16.

If you think the number 1 player should be higher, replace the square root function with another root smaller than 2 and recalculate the constant (45.41).

EDIT: for the curious 1.359 is half of e (2.718) and the formula inside the SQRT() is the PDF of an exponential distribution using lambda = 0.5 (which is how we got the 1.359). The SQRT is simply to compress the values to match ‘projected’ values (which are generated off of EV projections and are often quite compressed themselves).

It’s just a quick estimator . . . there are better formulas to use for assigning value, but it breaks down like this:

Value = (MaxPriceConstant * CurveFunction) + MinimumBid

MinimumBid is usually $1
CuveFunction = (e/CompressionConstant ^ - (DraftPosition/NumberOfTeams)) ^ CurveShapeConstant

In the example, I used a CompressionConstant of 2 and a CurveShapeConstant of .5 (which let me write it as a SquareRoot). I would guess you’ll want a slightly different curve, perhaps using a CurveShapeConstant of around .45. You can play with it easily in a spread sheet. The CompressionConstant simply compresses values toward the mean, this is reasonable as the ADPs come from projected values which generally incorporate a regression feature and are probabilistic (they deal with ExpectedValues).

After you set your other values, you calculate your MaxPriceConstant (if you have a Max Price in mind you’ll want to adjust your other values so give you this constant). Simply apply the function to every player with a MaxPriceConstant = 1, sum the result and divide marginal dollars by the sum. Marginal dollars = (NumberTeams * SalaryCap) - (PlayersPerTeam * MinimumBid).

I did this off the top of my head, so if something looks wrong it might be. Just ask and I’ll make sure it’s correct.

Good luck.”


#20    Tangotiger      (see all posts) 2011/08/23 (Tue) @ 18:05

I don’t see why you would have a non-linear function of ADP to dollars.

In any case, it’s not what this thread is about (not that I mind the post or anything). 

Rather than convert points to dollars, this thread is about converting ordinal ranks to dollars.


#21    JEH      (see all posts) 2011/08/23 (Tue) @ 18:17

@ Tango/20

Tango - I was using ADP as “Average Draft Position” (ordinal rank). 

It sounds as if you are reading it as “something something Points”

We may have a communication gap . . . though that may be that your post 20 was not directed at me. smile


#22    Tangotiger      (see all posts) 2011/08/23 (Tue) @ 18:25

Right, my bad.


#23          (see all posts) 2011/08/24 (Wed) @ 21:03

Tango and I have been emailing back and forth, and this is what we’ve found out.

Setting the stage: This is for a “standard” 10-team fantasy football league with 16 players per roster and $200 draft budget, $1 minimum. Each team starts 1 QB, 2 RB, 2 WR, 1 TE, 1 Def, 1 K, 1 RB/WR (aka Flex), and has 7 bench spots for a total of 160 drafted players.

I used ESPN’s point projections for their top 160 players for 2011, but removed defenses and kickers because those projections are too inaccurate to be useful. Thus 140 player pool, and $1980 cash pool ($200*10 teams - $20 for kickers/defenses).

To be able to compare different positions to each other, I calculated each player’s value over replacement level at that position and determined their price from there. Then, Tango used that data to determine a more accurate ordered list model.

The only remaining question was how to determine replacement level. Initially I used the first non-rostered player at each position as replacement level but that method’s prices seemed too low (see below). For my second attempt I used the Nth best player at each position, where N = 1.5 * # of starters (15th QB, 45th RB, 30th WR, 15th TE) and that passed the “eye-test”.

Here are the Ordered List Equations and their results:

Replacement = Unrostered
Price = [1/(order_id + 120) - 1/260] * 7914 + 1
Top Player is $36, Top 10 averages $33.5
#20 $27
#40 $20
#80 $10
#120 $4

Replacement = 1.5*Starters
Price = [1/(order_id + 20) - 1/160] * 1556 + 1
Top Player is $65, Top 10 average $53.1
#20 $30
#40 $17
#80 $7
#120 $2


Page 1 of 1 pages


Name (required)
E-Mail (optional; WILL be published)
Website (optional)

<< Back to main


Latest...

COMMENTS

May 25 08:11
What sabermetrics is NOT

May 25 06:43
Largest demonstration in Canadian history?

May 25 06:39
Lack of hustle during a game

May 25 02:38
NFLPA lawsuit against collusion

May 25 01:43
Neal Huntington’s best moves

May 24 23:50
Rooting for laundry

May 24 17:04
Firefox, IE, or Chrome?

May 24 12:07
How to beat the shift

May 24 11:11
Incredible story

May 24 09:41
Racial bias in card collecting: not the collectors, but the players on the cards