Back to blog
Game Theory··7 min read

The Winner's Curse: Why Winning an Auction Might Be Your Biggest Mistake

Unraveling the game theory myth of why winning a bidding process could actually guarantee a negative expected profit.

Game TheoryProbabilityPython

Who doesn't want to be a winner, right? From playing football on the field to playing FIFA with your friend, people like winning. In this article, I want to explain a phenomenon called the "Winner's Curse" as a topic of game theory, unraveling the myth of why winning a bidding process could actually be a massive mistake.

The Scenario

Picture this: You and I are sitting at a high-end art auction. Up on the block is a mystery painting hidden under a sheet.

I turn to you and whisper: "I have no idea who painted that, but I know its true value is completely random — somewhere between 0 and 100,000. I also happen to know a museum director who will buy it off you today for 1.5× whatever it's actually worth."

Bid higher than the painting's secret value → you win. Bid lower → you lose, and we go home.

You are thrilled, greedy, and believe you are the smartest guy in the auction room. You think: "Well, the average price is 50,000, so my average gain is 25,000. There is no way I am losing this trade with a bid of 50,000."

I know, it sounds bulletproof. But you know what? You just locked yourself in for a losing trade.

Let V denote the actual value of the painting, and B denote the bid you place. Here's what actually happens in each case.

Scenario AYou Win

Winning means V < B. The painting is now uniform on [0, B]. You just learned it's worth less than you paid.

E[V | V < B] = B / 2
Revenue = 1.5 × (B/2) = 0.75B
Profit = −0.25B
Scenario BYou Lose

Your bid is rejected. V > B — you underpriced it — but you also dodged a guaranteed loss.

Profit = $0
You lose nothing. You walk away clean.
The Plot Twist

Can't I Still Get Lucky?

Now, if you are a sharp reader, you might be thinking: "Wait a minute. Expected value is just an average. What if the painting's actual value is 40,000 and I bid 50,000? The museum pays me 60,000, and I make a sweet 10,000 profit! I can still win this, right?"

You are absolutely right — it is entirely possible to make money on a single trade. But let's look at exactly how lucky you need to be. To turn a profit, the museum's payout must beat your bid:

// Profit condition
1.5V > B
V > B / 1.5
V > (2/3) × B

Your bid is only profitable if the painting's true value falls in the upper third — between 66.7% and 100% of your bid. Since V is uniform on [0, B] when you win, the odds are fixed:

Profit · 33.3%
Loss · 66.7%
V > (2/3)B → you profitV ≤ (2/3)B → you lose

Why does the house always win the long game? The scales are unbalanced. Your upside is capped — bid 60,000 and the maximum profit is barely under 30,000. But if the painting is worth 0, you lose your entire 60,000 bid. That heavy 67% chance of severe losses drags your average straight down to the mathematically guaranteed −0.25B.

Conclusion

Key Insight

Notice the negative sign. Whatever bid B you place, your expected profit is always negative. Every time you "win" this auction, you can expect to lose exactly 25% of your bid.

This is the Winner's Curse: sometimes, the only winning move is not to play. Or in this case, to confidently bid 0 and walk away.

Simulation

Proving It with Python

Math is great, but code is better. Let's write a quick simulation to play this exact game 100,000 times and see if the math holds up.

import random

# 1. Set the Parameters
revenueCoeff = 1.5
B = 50000
n = 100000

# 2. Set up Trackers
netProfit = 0
profitableWins = 0
numberOfWins = 0

# 3. Run the Simulation
for i in range(n):
    V = random.uniform(0, 100000)

    if V > B:
        continue

    numberOfWins += 1

    revenue = V * revenueCoeff
    currProfit = revenue - B
    netProfit += currProfit

    if currProfit > 0:
        profitableWins += 1

# 4. Results
averageProfit = netProfit / numberOfWins
winRate = (profitableWins / numberOfWins) * 100

print(f"Auctions Won: {numberOfWins} out of {n}")
print(f"Average Profit per Win: ${averageProfit:.2f}")
print(f"Profitable Win Rate: {winRate:.2f}%")

The output:

Auctions Won: 49812 out of 100000
Average Profit per Win: $-12511.40
Profitable Win Rate: 33.21%

The Law of Large Numbers never lies.

  • We won roughly half the time (bidding 50,000 out of 100,000).
  • We only made a profit on about 33.3% of the games we won.
  • Our expected profit settled right at −12,500 — exactly −0.25 × B.

Want to play with the parameters and run the simulation yourself? You can find the full Python Jupyter Notebook on my GitHub.