You are on page 1of 4

THE PROBLEM

In a fantasy football draft, you pick 16 players. Generally, this 16 player mix is composed of 1-2 quarterbacks,
4-5 running backs, 4-5 wide receivers, 1-2 tight ends, 1-2 defenses, and a kicker. Last year I was inspired by my
fantasy draft to answer a beguiling question – what is the ideal order to pick the different positions to
maximize outcomes, year-to-year? Put another way: should I pick a QB first, then an RB, then a WR, then a
second RB, etc.? Or should I pick an RB first, then a WR, then a QB, then another RB, etc. What is the absolute
best strategy to ensure you get the most value out of a fantasy draft, year-to-year?
The question seemed like it should yield pretty easily to a moderate amount of analysis. However, as I soon
discovered, the answer was surprisingly difficult. There are a number of factors that come into play which
make this question difficult to answer.
Consider the dimensions you are trying to maximize simultaneously. First, you do not actually know the
performance of any player pre-hoc; hence you are always using some proxy of their skill to set your
preference. That means you’ve got to account for how well your ranking scheme accords with eventual
performance. If your scheme tracks better with certain positions than others, it no longer becomes a
straightforward game of picking the positions with the best outcomes. Rather it’s now a mix of the players with
the best outcomes that you can reliably predict.
Second, your best pick isn’t always the best player available to you at any moment. In the language of game
theory, you are trying to “minimax.” For instance, at a given moment your current pick might be between a
running back set to get 250 points this season vs. a tight end likely to get 200 points this season. In a world
where you only have to make a single decision, your choice is clear – you want the running back in this pick
because he is worth more points to you. Yet, your next pick may be between a running back likely to get 225
points this season vs. a tight end likely to get 100 points. Over two picks, your best bet is to get the tight end
first and the running back second (200 + 225 = 425) vs. the other way around (250 + 100 = 350). Even though
the tight end looks like the worst choice in the first moment, it is ultimately your best pick overall, because
your next available tight end is worth so much less and your next available running back is still worth a decent
amount of points.
A final complication that muddies the water is that there are certain default strategies fantasy players cling to
that make certain positions available longer (or shorter) than might be expected. For instance, some common
wisdom holds that you can hold off on picking a QB till your later picks. Given that positions will be available
depending on the combined wisdom of the crowd, who you pick at any given moment doesn’t always have to
do with what strict maximization of points would advise.
Given that there are so many dimensions to maximize at the same time, how could you possibly arrive at the
best order of positions to pick?
THE SOLUTION
The answer was to consider all of the possibilities. Truly – all of them – every possible unique permutation of
positions you could entertain. To do that, I started by writing a script that spit out every unique permutation of
a default team of offensive players: two quarterbacks, four running backs, five wide receivers, and two tight

ends. For those who remember middle school math, you know that the number of unique permutations in
such a mixed set is equal to:

That means there are 540,540 unique ways to rearrange a set of two QBs, four RBs, five WRs, and two TEs.
Now, I would have loved to also include two defenses and a kicker to round out a full team. However, with
those included, we’re at 908,107,200 unique permutations – a number that is a bit big to run analyses on
(more to come). So, for the moment, we have to assume that the results of my research are contingent on
your last picks being two defenses and a kicker (not an unreasonable or unusual scenario).
With these 540,540 permutations in hand, the next step was to simulate the outcome of drafts for the
different permutations. I play in a ten franchise league where the draft order is assigned randomly shortly
before the draft occurs. For each franchise, the picks in the draft follow a “snaking” scheme proceeding from
franchise 1 to 10, and then back from franchise 10 to 1. That means that franchise 1 will pick 1st, then 20th,
21st, and so on. Franchise 10 will pick 10th, 11th, 30th, 31st, etc. (see chart below). When simulating every
permutation of positions, we need to consider what would have happened had each of the ten franchises tried
the different strategies.

16 Picks

Franchises
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

1
1
20
21
40
41
60
61
80
81
100
101
120
121
140
141
160

2
2
19
22
39
42
59
62
79
82
99
102
119
122
139
142
159

3
3
18
23
38
43
58
63
78
83
98
103
118
123
138
143
158

4
4
17
24
37
44
57
64
77
84
97
104
117
124
137
144
157

5
5
16
25
36
45
56
65
76
85
96
105
116
125
136
145
156

6
6
15
26
35
46
55
66
75
86
95
106
115
126
135
146
155

7
7
14
27
34
47
54
67
74
87
94
107
114
127
134
147
154

8
8
13
28
33
48
53
68
73
88
93
108
113
128
133
148
153

9
9
12
29
32
49
52
69
72
89
92
109
112
129
132
149
152

10
10
11
30
31
50
51
70
71
90
91
110
111
130
131
150
151

In addition to knowing the timing of different picks by each franchise, you need two more components to
simulate a draft. First, you need a ranking scheme that tells you the order of players a franchise would prefer
at any given moment in the draft. Then you need a reasonable approximation of which players will be
available at any given point in the draft. Combining these two elements, you simply work down the list of

players each franchise wants, until you find the first player who should be available at that given moment for
that given franchise.
The ranking part is quite easy. For instance, you can use last year’s fantasy performance to order your
preference for this year’s players. The second component is relatively easy as well, because we have access to
“average draft position” (ADP) numbers for each player. A player’s ADP tells us when, on average, a player was
picked in thousands of previous drafts that year. For instance, an ADP of 7.03 means that a player was taken
around the 7th pick, on average, across all drafts that occurred. Using ADP, we know if a player is generally still
around, say, by the time franchise #1 is making their third pick (which is pick 21 overall – see the chart above).
Every player with an ADP lower than 21 is assumedly already gone at that time. To find out who player #1 will
likely get in their third pick, all we have to do is find the next preferred player whose ADP is higher than 21.
RUNNING THE NUMBERS
I wrote a script that accomplishes precisely what I just outlined. The script starts by grabbing a permutation
from the list of 540,540. It runs through each franchise, from 1 to 10, using the snaking scheme I just outlined.
As it runs through a franchise’s picks it finds the best player available for the currently desired position. In my
scheme, I actually ranked the preference of players by their ADP. (NOTE: I used ADP both for when a player
would be available, and as my ranking scheme of choice. I tried using past year’s fantasy points to set my
preference, but it turns out that past year’s performance did worse than current year’s ADP. There is nothing
illogical about this method; in fact ADP is a popular choice for picking players among fantasy football fans).
Afterward, when I had all 10 franchises’ outcomes, I took the average of the 10 outcomes to set an overall
score for each permutation. This average score is the general perspective on how that permutation did.
With this script written, all I needed was to run every permutation… right? Well, it turns out that I encountered
a problem. Even after much tweaking and rewriting of my script, I only managed to get each run of a
permutation down to .11 seconds. That sounds pretty fast (and it is quite fast, given the complexities of the
calculations), but when you extrapolate 540,540 runs across .11 seconds per run, you realize that it will take 16
hours and 31 minutes for the script to go through all of them. I was sure there is no way that I could let a
script run for 16 and half hours and it would avoid screwing up in some way. Also, I wanted to run six years of
data (2009-2014), and that means six times 16.5 hours, for a total of 4 days and 3 hours.
Try as I might, I could neither get the script to run any faster, nor could I come up with some mathematically
elegant application that could resolve away my problem. So I did the next best thing – I took a sample. In fact,
I set the script to take every 67th permutation, for a total of 8,008 permutations. That still takes about 15
minutes to run for each year of data, but at least I was down to a timescale I could stomach.
WHAT DID I FIND?
With this sampling method in hand, I ran through the same 8,008 permutations for six years of data from
2009-2014. My goal was to find the permutations in the sample that did the best across all six years. And I
found some decent ones! In fact there is noticeable consistency to the permutations that do the best across
years. None of them are perfect every year. Still, there is one I like. In fact, I found one of the top
permutations that was never less than 91% of the best permutations in any given year, and averaged 93% of
the best permutations across the six years.

Would you like to know what the best permutation was? I BET YOU WOULD! No way I did all of this work just
to share it on the internet.

Grab one of the 540,540
permuations of 13 positions
(QB, RB, RB, WR ...)
See which players each of the 10
franchises can likely get when
they pick postions in that order
Sum together the fantasy
football points each franchise
would get from those players
Average the fantasy football
points the 10 franchises
achieved for that permutation
Repeat the process to see which
permutation results in the
highest average points