Or, the Unexpected Virtue of Active Bidding…

Unlike a certain appendage of mine, I like to keep my intros short, so let’s get down to business. For those of you who were not with us last week, I spewed some thoughts on auction theory and expressed a desire to create a tool to simulate auctions. Seven days later, I have created such a tool. Or at least a basic, yet functional form of one…

GitHub of Code

Some Details on How the Code Works

In the program there is a list of players to bid on, there is a list of the owners, and there is also a list of what every owner values each player at. All of these values are input by the user.

How the bidding process works is like this. The bidding starts at 1. At this point the program checks to see if each of the owners value the player above the current bid price. If true for a specific owner, that owner becomes “primed” and submits a bid (the virtual equivalent to raising your hand shouting “I bid 11!”). Each owner is assigned a Bid Time by the program, chosen randomly from the uniform distribution, and the one with the smallest bid time becomes the new highest bidder. The high bid is now 2.

If the bidding goes above what an owner values a player for, that owner becomes “un-primed” and stop submitting bids. The rounds of bidding continue while at least more than one owner is “primed”, otherwise the current highest bidder wins the player for the current bid price.

A output of a quick auction where three owners are bidding on one player, whom they all value at $5 is printed below:

pauls-air-3:pyth paulsingman$ python multiaucsim.py
The current bid is: 1
The highest bidder is: paul
Bid times: {‘paul’: 100, ‘tortoise’: 1.258023, ‘hare’: 6.44192}
The current bid is: 2
The highest bidder is: tortoise
Bid times: {‘paul’: 7.96800, ‘tortoise’: 100, ‘hare’: 4.67083}
The current bid is: 3
The highest bidder is: hare
Bid times: {‘paul’: 6.48726, ‘tortoise’: 5.99945, ‘hare’: 100}
The current bid is: 4
The highest bidder is: tortoise
Bid times: {‘paul’: 6.157037, ‘tortoise’: 100, ‘hare’: 3.58576}
The current bid is: 5
The highest bidder is: hare
The results of the auction are: [[(‘hare’, 5)]]

That’s what it looks like. In this run the Hare won the player for, unsurprisingly, $5. No one bids above what they value a player for, and if you are the current highest bidder, you can’t bid. You should see that if an owner doesn’t submit a bid, what they are actually doing is getting assigned a bid time of 100, which will always be larger than the owners’ bid times who are submitting bids. In this run they have bids times selected at random between 1 and 10.

The program can handle bidding on more players. I can also easily add additional owners. The two biggest areas of a real auction that I don’t incorporate at the moment are budgets for owners and positions for players (and fitting those players on their winning owners teams based on those positions). There are numerous other areas I’d like to make the behavior of the agents more nuanced, but I won’t go into those in detail  here.

As always, all suggestions of ideas for future versions are welcome.

Test #1: The Importance of Active Bidding

If I had to categorize real people by their bidding behavior into two categories, I would divide them into Active Bidders and Passive Bidders. Simply put, Active Bidders are generally involved in the bidding on a larger percent of players, and they also place bids more frequently for a given player. Passive Bidders… well… don’t. Passive Bidders will observe how the bidding begins for a certain player and if it’s a player they like and the price is approaching their listed value, then and only then will they throw their hat in the ring, likely to the surprise of those involved earlier in the bidding. Passive Bidders also place more bids at the last second, right before a player is about to be “sold”.

While people are the complex, inconsistent, “teetering bulbs of dread and dream” that we are, during auctions we do generally fall into these two categories. Based on my experience, a typical 12 person auction will contain maybe 3 Active Bidders and 9 Passive Bidders. The Passives outnumber the Actives.

“Being There”

Time for a quote. During Tout weekend after the auction, I won’t needlessly name drop, but I was sitting at a table with some industry guys, one of whom is Jeff Erickson of Rotowire. (Side note: Jeff is the auctioneer of the Tout Mixed Auction, and a damn fine one at that.) We were discussing auctions and Jeff made a comment I thought was interesting. He said, “In auctions I try to be involved on almost every player because you never know when the bidding will stop, and being active allows you to be “there” when a bargain unexpectedly pops up.”

For my part, I agree with Jeff and believe his approach is the correct way to approach an auction. Allow me to expand.

Basically, auctions are overwhelming. The shipload of information to keep track of combined with the virtually unlimited possibilities of what could happen make it appealing to pursue a strategy that narrows your options.

For an auction amateur, this means targeting guys specific guys and to an extent, paying whatever the price is to land them. The amateur has one, maybe two two contingency plans, e.g. “If I miss out on Dozier, I’ll target Chase Utley or Brett Lawrie for a few bucks later.”

It shouldn’t be difficult to see why this type of strategy isn’t optimal. However, if a person truly isn’t able to process the entire mountain of information coming at him in an auction (nothing to be ashamed for the first few times), choosing a narrowing strategy that turns that mountain into a molehill could prevent him from making a huge blunder (as my backgammon app would say) and prove better.

An auction expert on the other hand, can be — to use an increasingly overused word in the corporate and entrepreneurial worlds — more nimble. If you try to freeze the room with a surprise $8 bid on Rusney Castillo, the expert won’t be fumbling through the bottom of his rankings; the expert will likely already know whether they value him above or below that, and either bid $9 or not bid $9 according. In this instance, a person’s expertise in auctions and knowledge of their bid values allowed them to act faster. What I’m asking is: How much does their quick behavior increase their odds of winning a player?

Enter the Simulator

So, let’s put this new tool of ours work, eh? To test this question, we will use the following parameters for the model.

Simulation Parameters

For this auction there will be only one player bid on, Mike Trout. There will be three agents (or owners) in the auction, Paul (myself), the Hare, and the Tortoise. All three value Mike Trout equally, at $40.

What separates our three agents is their bid times. The Hare’s bid time is a random number generated form the uniform distribution from 1 to 8. The Tortoise’s is generated from the uniform from 1 to 10. My range is in the middle, from 1 to 9. Even if you are no expert on the uniform distribution, you should be able to tell that the Hare will on average be the quickest bidder and the Tortoise the slowest. Since the number is random and re-generated at each bid point, sometimes the Tortoise will be faster than the Hare, but not always.

In the mini-simulation above the Hare ended up winning.  But the real power of simulation comes from repeating this process many, many times. How many times shall we try? 100? 1000? Still too timid for my tastes. Let’s go with 50,000 times. Instead of printing out the exact steps of each iteration, I’ll just have it output how many times each agent wins.

I’ve got the program set up to run, all that’s left is to hit… the… button… and BAM!. Results in not more than a few seconds.

pauls-air-3:pyth paulsingman$ python multiaucsim.py
Paul won the player 16647 times
The Hare won the player 18715 times
The Tortoise won the player 14638 times

From these results the Hare does win the most often. Winning percentage wise, that comes out to:

Owner Win %
Paul 33.3%
Hare 37.4%
Tort 29.3%

So, yes, the Hare does win the most, but all three win the player close to a third of the time. Is this more or less often than we should have expected?

The answer to that question is more complex than I originally thought, and since there’s already a lot to grasp in this article, I’ll save it for another time. Overall the main takeaway is the Auction Simulator is built, it works, and I’m looking forward to hearing all of your guys’ ideas on what we can include in this thing and what we can learn from it.



  1. Buddo Chezuski says:

    Why trying to use the War Room feature and getting errors:

    Application Error
    An error occurred in the application and your page could not be served. Please try again in a few moments.

    If you are the application owner, check your logs for details.

    • Grey

      Grey says:

      Use Firefox, go to Preferences, go to Privacy, clear individual cookies, search Razzdraft, delete razzdraft, try again

  2. GhostTownSteve says:

    Interestingly, after our last conversation I gave it a lot of thought as I was headed out to Vegas for the NFBC auction championships and I arrived at the same conclusion as above. There is no downside to being in on every bid and to bid in single unit increments as quickly as possible. It’s pretty simple. The more bids you have in on players below the dollar value you want to spend on the player, the more chances you have to own players for dollar values below your spend limit.

    The other advantage is that if you bid very quickly and then abruptly drop out of bidding it warns other players not to try to price enforce on players they aren’t interested in as there’s a risk they’ll be stuck with them.

    One observation is that I think what I ended up with is very likely to happen often with this style: I bought a lot of players near the median auction value. In virtually every auction, players overspend the actual projected value of the top players with the belief that they can offset the overspend by pairing this player with a low priced player later. A 39 and a 1 dollar player rather than two 20s. If you want to end up with any of the top tier players your “God Value” must reflect an expected auction value or you won’t end up with any one from the first 50 ADP (which is what happened to me). Not that it’s a bad thing. I absolutely love the team.

    15 team mixed NFBC

    C1 Phegley $1
    C2 Chirinos $4
    1b Pujols $21
    2b Lawrie $7
    ss A. Ramirez $14
    3b D. Wright $12
    MI S. Castro $14
    CI Carlos Santana $19
    OF Pence $12
    OF Trumbo $13
    OF Soler $16
    OF Revere $14
    OF Alcantara $6
    Util Vogt $2

    p Harvey $23
    P Arieta $14
    P Wacha $16
    P Carrasco $17
    P Liriano $9
    P Hahn $6
    P Miley $4
    p K. Jansen $13
    P Hawkins $3

    • GhostTownSteve says:


      great work on the simulator. I’m really enjoying this project.

    • paul

      paul says:

      @GhostTownSteve: I would bet the bidding often does get out of control for the top guys in most auctions, but I will add I’ve seen auctions where everyone’s a little hesitant early on with the top guys. Then people are flush with cash for the next tier of players, and you end up where tier 2 guys go for almost as much as the top guys when bidding wars start. So, sometimes it’s not bad to snag the top guys early and leave yourself with a few $1 guys, particularly in a mixed league where players on waivers aren’t too bad.

      Can’t argue with that pitching staff GTS.

  3. jake says:

    Good stuff.

    Is this how the big leagues (TOUT) does auctions, one can just jump in at anytime? Sounds like mass chaos. How can you tell precisely whether Grey or Rudy yelled $3 first?

    When I did a home auction league, we went around the horn. If you pass on bidding you were out permanently (though that was mostly on the honor system). Though the serious bidders, seemed to spend less time thinking about it before just spitting it the next bid. But it was more psychological.

    The success of the active system seems to be maximizing the time time in the lead. That was my strategy in the slow eBay style auctions I did this year. The players I really wanted, I made sure I had a dollar or two extra hidden bid, over the bid seen by the public. It seemed to deter people from trumping my bid. They’d try to take over the lead with $1, it didn’t work and they’d give up.

    • paul

      paul says:

      @jake: Yes, the Tout auctions are a free-for-all bidding wise. 99 percent of the time, it’s clear who places the next bid. If two guys shout “$12!” at the same time, most of the time one of them quickly snaps back with “13”, which resolves the issue. On even rarer occasions the auctioneer does have to make somewhat of a judgment call of who spoke first, though it’s usually not the determining bid. Maybe 1-2 guys per auction are won or lost because of a judgment call, but usually their lower tier players and it’s not a bid deal. It does put some pressure on the auctioneer and does leave the door open for controversy, I’ll admit.

      I’ve never done this kind of slow auction with a public and hidden bid but I’ll look into it.

  4. Huh? says:

    As an experienced auction participant, this analysis feels misdirected. Let’s start with some hypothetical god values for players, created such that every team’s auction value total represents actual performance, and no one ever over bids or under bids. If all participants value the players equally, everyone ends up tied. Whether that total is reached by a $39 + $1 or $20 + $20, each team that spends all $260 of auction money gets $260 of value.

    It doesn’t matter whether one owner is faster and more active than another, in this scenario. The faster owner will spend his $260 budget first, but each owner will eventually spend their $260. Since the values were assigned by god, the total auction value of all players bought will always be $260 * # of teams.

    Furthermore, in this scenario, the maximum “advantage” an owner can ever get over another on one player is $1.

    OK, now let’s talk real life. Each player has a projection that results in an owner assigning an auction value. Even if all owners are using the same exact projections, their risk tolerance will have some influence on what the ultimate auction price for a player will be. Some people overspend on the high dollar players because they are see as having less variance relative to the projection. Others may overspend on a hot rookie because they want to buy a lottery ticket and have a shot at some high upside, even if it is not the true expected value.

    What I’m saying is that in a room of auction participants, people won’t truly have the same auction values for all players. Succeeding in the auction format is much more about identifying inefficiencies in how the other owners are pricing their players. Some of this may be due to differences in projections, or risk assessment/tolerance, or herd mentality (run on closers, better get one!).

    You are designing a simulator that can offer $1 advantage to your fastest owner. In a real auction, finding players with a $5 advantage or more relative to the value you’ve assigned is more likely to be a winning strategy.

  5. I agree with Paul (and Jeff) in bidding on as many players as possible in case you get lucky. The key is just to avoid getting too close to retail price if you don’t like a guy.

    I like making 3/4 retail price bids when I throw out a player. In CBSSports AL auction, I got Michael Saunders and Brandon Moss by just being active (i know Saunders I did a 3/4 bid).

    • paul

      paul says:

      @Rudy Gamble: 75% seems like a good sweet spot between not overpaying for a player in case you value him way more than everyone else, and still making them hesitate to bid above the price. That 75% is something that is well-suited to be tested by the program…not that there is one right answer, but just to see the effect of trying 80% or 70% for example.

  6. GhostTownSteve says:

    Paul I was thinking about this during my commute this morning.

    How are you going to address the distribution of dollars? Let’s say that top tier talent is going at slight discounts to your god values. In theory you might end up with 8 first round players and 15 $1 players. Would your bot consider this a good outcome? This would be stars and scrubs in extremis. Maybe you could include a standard deviation preference setting with stars and scrubs at one end an median values in the other and have some of the bidding reflect that preference as well as the god value. Sort of a latitude and longitude.

    • paul

      paul says:

      @GhostTownSteve: Well, I don’t believe there is anything intrinsically wrong with grabbing the top 8 guys if no one else is valuing them as highly as you think they should be. However, I agree it is obviously the case that your dollar values should be dynamic throughout the auction, an extreme example is if you have no more 3B/CI spots open, remaining 3Bmen should essentially be valued at $0 going forward.

      I’ll get there eventually but it isn’t something I’m going to worry about today. I know Rotowire’s auction software adjusts player values during the auction based on who you’ve already bought. I’m hoping later I might get to see under the hood of how that works when I might have suggestions of my own of how best to do that.

  7. Jake says:

    Hi Paul,

    Tech question: Are you aware of excel functions that I could use to pull data from the stream-o-nator and hit-o-tron? and/or possibly espn?

    If not any tips on scraping using visual basic to accomplish this?

    I have limited experience, but it’s too manual of a process to copy and paste every day (or real time as rosters are set). Any direction would be appreicated.


    • paul

      paul says:

      @Jake: Jake, I am aware of a technique for this. When I’m back home tonight I’ll share the basics. Don’t have much experience with it tough.

    • paul

      paul says:

      @Jake: So I’ll give into more detail if you ask, but maybe this’ll get you started enough in figure the rest out (not that I’ve gone much further).

      Just open Excel and go to the Data tab ribbon. Under External Data Sources click From Web. If you paste in the URL you want, you should see the webpage populate in Excel. From there you can use a macro to “grab” the info you want.

      • Jake says:

        @paul: Thanks for the response. Look like the cointent login for the subscription doesn’t work with the excel web linker.

Comments are closed.