Several bidders, each with a secret private value for one item, compete under four classic rules. The mechanics differ wildly, yet for values drawn at random, all four raise the same expected revenue. Scrub through the auctions and watch the revenue-equivalence theorem emerge. Live runs the real Python engine in your browser via Pyodide.
Running-average price paid, per mechanism, as auctions accumulate. The second-price pair and the first-price pair take different paths but converge to the same line: the dashed theoretical value (n−1)/(n+1).
Each bar is one bidder's true value; the winner is gold. The two lines show what the winner actually pays: the 2nd-highest value, vs the shaded first-price bid.
How the winning price is spread, pooled over the auctions so far. Both pairs share the same mean (dashed), but first-price is tighter: same revenue on average, less risk for the seller.
In English and Vickrey, bidding your exact value is a dominant strategy: you can't do better whatever the others do. The winner pays the runner-up's value.
Why truth-telling winsIn first-price and Dutch, bidding your value would earn you zero. The equilibrium shades down to v·(n−1)/n, bidding less, but winning the same auctions.
The equilibrium bidFour very different rules, one expected revenue. The running averages chase the same dashed line. That's the revenue-equivalence theorem in action.
Why they coincideSwitch to Live and raise the bidder count: revenue climbs toward the top value and shading shrinks (b → v): more rivals means less room to lowball.
The effect of nIndependent private values drawn uniformly on [0,1]. English ≡ Vickrey (pay the 2nd-highest value) and Dutch ≡ first-price (pay the shaded top bid) are strategically equivalent pairs, which is why each pair's line sits exactly on top of the other.