I'm trying to learn more about auction theory and after studying Vickrey and first price auctions I wanted to try including a reserve price (in a Vickrey auction), but something seems to be going wrong, specifically the theoretical expected revenue deviates from the average revenue in simulated auctions for small numbers of bidders, but seems to agree for large numbers of bidders. Furthermore, the result here explicitly disagrees with the known 2-bidder results. Any indicators as to how to correct this would be greatly appreciated.
The approach comes from this lecture series: https://www.youtube.com/watch?v=w67K0PY7n9U&list=PLcrc6i6xwaQT52YtKdIpdARVZ4BTFOrQP&index=10
Here is the setup and my current work:
Let $N$ be the number of bidders. The bidders draw their values from a distribution with CDF $F$, PDF $f$. This distribution is assumed to be bounded and supported on $[0,1]$. Let $r\in[0,1]$ be a publicly announced reserve price.
Let $y$ denote the value of the second highest bidder. The bidder with valuation $s$ knows their valuation and the reserve but sees the other bidders valuations as random variables. So we define the CDF $G(s)=P[y\leq s]$ for $s\geq r$ and $G(s)=0$ for $s<r$. This can be interpreted as the probability that bidder with valuation $s$ wins the auction provided $s>r$.
$$G(s) = P(y\leq s) = \begin{cases} F(s)^{N-1} & \text{for $s\geq r$}\\0&\text{otherwise}\end{cases}$$
Next let $g(s)$ be the pdf associated to $G(s)$. Then the expected payment for a bidder with value $s\geq r$ is:
$$m(s) = \int_{r}^{s}xg(x)dx$$
The ex ante expected payment is computed by:
$$m = \int_{r}^{1}m(s)f(s)ds$$
Finally, the expected revenue is $Nm$.
If we take the uniform distribution, $F(s) = s$, $f(s) = 1$, then we have:
$$G(s) = P(y\leq s) = \begin{cases} s^{N-1} & \text{for $s\geq r$}\\0&\text{otherwise}\end{cases}$$
and so for $r\leq s$ we have $g(s) = (N-1)s^{N-2}$.
The expected payment is: $$m(s) = (N-1)\int_{r}^{s}x^{N-1}dx = \frac{(N-1)}{N}(s^{N}-r^{N})$$
And the expected revenue of the seller is:
$$Nm=(N-1)\int_{r}^{1}(s^{N}-r^{N})dx = \frac{N-1}{N+1}(1-(N+1)r^{N}+Nr^{N+1})$$
Taking $r\to0$ gives expected revenue $\frac{N-1}{N+1}$ which agrees with the result for a Vickrey auction with no reserve, and taking $r\to 1$ gives $0$ expected revenue as expected. So the limiting behavior is correct.
Taking $N=2$ we have the expected revenue: $$\frac{1}{3}(1-3r^{2}+2r^{3})=\frac{1}{3}-r^{2}+\frac{2}{3}r^{3}$$
This disagrees with the known result in $N=2$ of $\frac{1}{3}+r^{2}-\frac{4}{3}r^{3}$ (see Expected revenue obtained by the Vickery auction with reserve price $1/2$ and Expected Revenue of 2nd Price Auction with Reserve Price)
On the other hand, for large $N$, simulation generally agrees with the theoretical result:
max_N = 100
r = 0.5
num_trials = 1000
f = scipy.stats.uniform(0,1)
simulated_revenue = []
theoretical_revenue = []
deviation = []
Ns = numpy.arange(2,max_N)
for N in Ns:
payments = []
for trial in range(num_trials):
valuations = f.rvs(N)
valuations = valuations[valuations >= r]
if valuations.size == 0:
winner_payment = 0
elif valuations.size == 1:
winner_payment = r
else:
winner_payment = numpy.sort(valuations)[-2] if N > 1 else 0
payments.append(winner_payment)
simulated_revenue.append(numpy.mean(payments))
theoretical_revenue.append((float(N-1)/float(N+1))*(1-(N+1)*(r**N)+N*(r**(N+1))))
simulated_revenue = numpy.array(simulated_revenue)
theoretical_revenue = numpy.array(theoretical_revenue)
