When bidders' values are affiliated (positively correlated), the auctioneer's linkage principle holds: revealing more information raises expected revenue. The English auction beats second-price, which beats first-price.
The revenue ranking
With affiliated values, auction formats rank by expected revenue. More transparent formats let bidders update their estimates from observed behavior, reducing the winner's curse and encouraging higher bids.
Scheme
; Revenue ranking under affiliated values; More transparency => higher revenue (linkage principle); Simulate: bidders with correlated values; Each bidder's value = common component + private signal
(define (make-values common-value signals)
(map (lambda (s) (+ common-value s)) signals))
; First-price: bidders shade their bids
(define (first-price-bids values shade)
(map (lambda (v) (- v shade)) values))
; Second-price: bid truthfully, pay second-highest
(define (second-price-revenue values)
(let ((sorted (sort values >)))
(cadr sorted)))
; English: price rises until second-to-last drops out; With affiliation, remaining bidders update upward
(define (english-revenue values affiliation-boost)
(let* ((sorted (sort values >))
(second (cadr sorted)))
;; In English auction, bidders observe others staying in;; and revise upward => second price is higher
(+ second affiliation-boost)))
(define values (make-values 50 '(1052)))
(display "Values: ") (display values) (newline)
(define fp-bids (first-price-bids values 8))
(display "First-price bids (shaded): ") (display fp-bids) (newline)
(display "First-price revenue: ") (display (apply max fp-bids)) (newline)
(display "Second-price revenue: ") (display (second-price-revenue values)) (newline)
(display "English revenue (affiliation boost +3): ")
(display (english-revenue values 3))
; English >= Second-price >= First-price
Python
# Revenue ranking simulationimport random
def simulate_revenues(n_bidders=5, common=50, n_trials=1000):
fp_rev, sp_rev, eng_rev = 0, 0, 0for _ inrange(n_trials):
signals = [random.gauss(0, 10) for _ inrange(n_bidders)]
values = [common + s for s in signals]
s = sorted(values, reverse=True)
# First-price: optimal shade ~ (v - E[2nd | win])
fp_rev += s[0] - (s[0] - s[1]) * 0.5# Second-price: pays 2nd highest
sp_rev += s[1]
# English: affiliation boost (bidders update from observed behavior)
eng_rev += s[1] + abs(signals[0] - signals[1]) * 0.1print("First-price avg: $" + str(round(fp_rev/n_trials, 1)))
print("Second-price avg: $" + str(round(sp_rev/n_trials, 1)))
print("English avg: $" + str(round(eng_rev/n_trials, 1)))
simulate_revenues()
The linkage principle
Publicly revealing information that is affiliated with bidders' values raises expected revenue. The seller benefits from transparency because it reduces the information advantage of the winner (the winner's curse), causing all bidders to bid more aggressively. In ad auctions, this means showing advertisers their relevance scores and competitor density. Transparency is irreversible: once you reveal the signal, you cannot credibly un-reveal it, which commits the platform to the higher-revenue equilibrium.