Monocurl Essays
Series Download

Consumer surplus, and what a tax destroys

Measure what a market is worth to its buyers and sellers, then tax it. Some of the loss reaches nobody, and who bears the rest depends on slopes, not the law.

21 min·High school and early college·

AssumesSupply and demand: where a price comes fromThinking at the margin: marginal cost and revenue

A tax per helmet is raised from $2 to $30 and then set at $15. The tax is the vertical gap between what buyers pay and what sellers keep. Buyers’ surplus (blue) and sellers’ surplus (orange) shrink, the government’s revenue (gold) appears, and the red triangle is surplus that goes to nobody.
Monocurl source
let Fill = |t| TaxFills(FL, t)
# readouts are computed from the whole-dollar tax that is displayed
let Marks = |t| block {
    let tr = round(t)
    . Seg(at(FL, Qt(t), Ps(Qt(t))), at(FL, Qt(t), Pd(Qt(t))), INK, 5)
    . center{[2.7, 1.12, 0]} scale{1.2} color{INK} Number(tr, 0)
    . center{[2.7, 0.12, 0]} scale{1.2} color{GOLD} Number(tr * Qt(tr), 0)
    . center{[2.7, -0.88, 0]} scale{1.2} color{ROSE} Number(tr * tr / 0.3, 0)
}
mesh fills = Fill(t: 2)
mesh plot = HelmetPlot(FL)
mesh lines = Lines(FL)
mesh words = [
    center{[2.7, 1.55, 0]} Note("tax per helmet ($)", 0.72),
    center{[2.7, 0.55, 0]} Cap("tax revenue ($)", 0.72, GOLD),
    center{[2.7, -0.45, 0]} Cap("lost to all ($)", 0.72, ROSE)
]
mesh marks = Marks(t: 2)

slide "wedge"
    play Wait(0.6)
    fills.t = 30
    marks.t = 30
    play Lerp(5, [&fills, &marks], linear)
    play Wait(0.5)
    fills.t = 15
    marks.t = 15
    play Lerp(2.5, [&fills, &marks])
    play Wait(1.8)

Uses the shared definitions for this lesson's figures.

A city puts a tax of $15 on every bicycle helmet sold. It collects $7,500 a month. Add up what the tax costs the people in the market and, in the example worked out below, the answer is $8,250 a month: $5,500 from buyers and $2,750 from sellers. So $750 a month left the buyers and sellers and did not arrive at the treasury. Where did it go?

There is a second puzzle in the same numbers. The law makes sellers hand over the tax, yet buyers bear two thirds of it. Both puzzles need a way to measure what a market is worth to the people who trade in it. That measure is built person by person first, in a market small enough to list.

What a trade is worth to each person

Take the used-textbook market from the lesson on supply and demand. Eight students each want one copy of a calculus book, and the most they would pay is $95, $85, $75, $65, $55, $45, $35 and $25. Call them, in that order, Ben, Fay, Dev, Hoa, Ana, Gus, Cho and Eli. Eight owners each have a copy, and the least they would accept is $10, $20, $30, $40, $50, $60, $70 and $80. Everyone takes the going price as given. At any price from $50 to $55 the five buyers with the highest willingness to pay want to buy and the five owners with the lowest costs want to sell, so five copies trade. Say the price is $52.

Ben would have paid $95 and pays $52. He ends up as well off as if he had paid his limit and then been handed $43. The owner with a cost of $10 would have sold for $10 and receives $52: she is $42 ahead.

Buyer would pay9585756555Sum
Consumer surplus at $52433323133115
Seller’s cost1020304050
Producer surplus at $52423222122110

Total surplus is $115 + 110 = 225$ dollars.

Pause and try

Any price from $50 to $55 clears this market. Recompute the two surpluses at $54. What changed, and what did not?

Show answerHide answer

Each of the five buyers pays $2 more, so consumer surplus falls by 10, to 105. Each of the five sellers receives $2 more, so producer surplus rises by 10, to 120. The total is still 225. The price moves surplus between the two sides and cannot change the sum, because every dollar a buyer pays is a dollar a seller receives.

  1. Five copies trade at 52 dollars.
  2. Each buyer gains the gap between what she would pay and the price: 43, 33, 23, 13 and 3 dollars.
  3. Each seller gains the gap between the price and her cost: 42, 32, 22, 12 and 2 dollars.
  4. At 54 dollars the buyers gain 10 less and the sellers 10 more. The total is the same.
Surplus in the book market, trader by trader. Each blue bar runs from the price up to a buyer’s willingness to pay, and each orange bar from a seller’s cost up to the price. Changing the price changes the split and leaves the total at $225.
Monocurl source
let CS = |p| map(range(0, 5), |j| Strip(FK, j + 0.07, j + 0.93, p, SV[j], tint(AZURE, 0.4)))
let PS = |p| map(range(0, 5), |j| Strip(FK, j + 0.07, j + 0.93, SC[j], p, tint(EMBER, 0.4)))
let PLine = |p| Seg(at(FK, 0, p), at(FK, 8, p), INK, 3)
mesh cs = []
mesh ps = []
mesh plot = BookPlot(FK)
mesh stairs = [DStair(FK, SV), SStair(FK, SC)]
mesh line = []
mesh side = []

slide "Five copies trade at 52 dollars."
    line = PLine(p: 52)
    side = Read(1.55, "price ($)", "52")
    play Fade(0.6)

slide "Each buyer gains the gap between what she would pay and the price: 43, 33, 23, 13 and 3 dollars."
    cs = CS(p: 52)
    side = [Read(1.55, "price ($)", "52"), Read(0.6, "buyers gain", "115", AZURE)]
    play Fade(0.6)

slide "Each seller gains the gap between the price and her cost: 42, 32, 22, 12 and 2 dollars."
    ps = PS(p: 52)
    side = [Read(1.55, "price ($)", "52"), Read(0.6, "buyers gain", "115", AZURE), Read(-0.35, "sellers gain", "110", EMBER), Read(-1.3, "total", "225", LEAF)]
    play Fade(0.6)

slide "At 54 dollars the buyers gain 10 less and the sellers 10 more. The total is the same."
    side = []
    play Fade(0.3, [&side])
    cs.p = 54
    ps.p = 54
    line.p = 54
    play Lerp(1.5, [&cs, &ps, &line])
    side = [Read(1.55, "price ($)", "54"), Read(0.6, "buyers gain", "105", AZURE), Read(-0.35, "sellers gain", "120", EMBER), Read(-1.3, "total", "225", LEAF)]
    play Fade(0.4, [&side])

Uses the shared definitions for this lesson's figures.

Since the payments cancel, total surplus can be written without the price: it is the sum of the traded buyers’ values minus the sum of the traded sellers’ costs, here $(95 + 85 + 75 + 65 + 55) - (10 + 20 + 30 + 40 + 50) = 225$. Pair the buyers and sellers in order and this is $85 + 65 + 45 + 25 + 5$, the gain created by each trade.

Could a different arrangement create more?

Suppose a planner who knew everyone’s numbers could decide who gets a book and who gives one up, ignoring prices altogether. Could she beat 225?

The gain from each possible trade when buyers are taken in order of willingness to pay and sellers in order of cost. The first five trades create $225 between them. A sixth, seventh or eighth would cost the seller more than it is worth to the buyer.
The gain from each possible trade when buyers are taken in order of willingness to pay and sellers in order of cost. The first five trades create $225 between them. A sixth, seventh or eighth would cost the seller more than it is worth to the buyer.
Monocurl source
let FGn = Frame(0, 8, -60, 100, [0.2, 0.15, 0], 6.2, 2.9)
mesh bars = block {
    for (j in range(0, 8)) {
        let g = SV[j] - SC[j]
        var col = tint(LEAF, 0.5)
        if (g < 0) { col = tint(ROSE, 0.5) }
        . Strip(FGn, j + 0.12, j + 0.88, 0, g, col)
    }
}
mesh plot = [
    GridLines(FGn, [], [-40, 40, 80]),
    Path([at(FGn, 0, 100), at(FGn, 0, -60)], SLATE, 2.5),
    Seg(at(FGn, 0, 0), at(FGn, 8, 0), SLATE, 2.5),
    map([-40, 0, 40, 80], |y| center{[fx(FGn, 0) - 0.4, fy(FGn, y), 0]} Math(to_string(y, 0), 0.72, SLATE)),
    map(range(1, 9), |j| center{[fx(FGn, j - 0.5), fy(FGn, -60) - 0.3, 0]} Math(to_string(j, 0), 0.72, SLATE)),
    center{[fx(FGn, 4), fy(FGn, -60) - 0.66, 0]} Note("trade number", 0.72),
    center{[fx(FGn, 0) + 1.85, fy(FGn, 100) + 0.32, 0]} Note("gain from the trade (dollars)", 0.72)
]
mesh labels = [
    center{at(FGn, 6.2, 60)} Cap("first five: 225 in all", 0.76, LEAF),
    center{at(FGn, 2.6, -22)} Cap("these would destroy value", 0.76, ROSE)
]

Uses the shared definitions for this lesson's figures.

An allocation that makes total surplus as large as possible is called efficient. The theorem says that a competitive market, with no planner and with each person consulting only her own number and the price, reaches the efficient allocation. This is a result about the model, and it leans on the model’s assumptions. Traders take the price as given. Each person’s number captures everything she gains or gives up. And nobody outside the trade is affected by it: no smoke, no noise, no risk to others. Where a trade harms a bystander, the sum $W$ leaves out a cost and the conclusion can fail.

The theorem also says less than it may seem to. Efficiency counts dollars and is blind to who gets them. Eli, who could pay only $25, gets no book in the efficient allocation, and a dollar of surplus counts the same in a rich hand as in a poor one. Whether an efficient outcome is a fair one is a separate question.

Surplus as an area

Now take a market big enough for smooth curves: bicycle helmets in a city. Read the demand curve by quantity. The buyer of the $Q$-th helmet would pay up to $P_d(Q) = 100 - \frac{Q}{10}$ dollars, and the $Q$-th helmet costs $P_s(Q) = 10 + \frac{Q}{20}$ dollars to supply; that is its marginal cost. The market clears where the two agree:

$$ 100 - \frac{Q}{10} = 10 + \frac{Q}{20} \quad\Longrightarrow\quad 90 = \frac{3Q}{20} \quad\Longrightarrow\quad Q = 600, \quad P = 40. $$

In the book market each buyer’s surplus was a bar one unit wide, reaching from the price up to her willingness to pay. With 600 buyers the bars are too thin to see and together they fill the region between the demand curve and the price line. That region is a triangle with base 600 and height $100 - 40 = 60$, so consumer surplus is $\frac12 \times 600 \times 60 = 18000$ dollars a month. Producer surplus is the triangle between the price line and the supply curve: $\frac12 \times 600 \times (40 - 10) = 9000$ dollars a month. (For curved demand the same area is an integral; for straight lines, triangles are enough.)

A tax drives a wedge

Go back to the eight students for a moment and tax their market: for every book sold, $30 must be handed to the student union.

Pause and try

With a $30 tax, the buyer’s payment exceeds what the seller keeps by $30. Which of the five trades, with gains of 85, 65, 45, 25 and 5 dollars, can still leave both parties better off? How much does the union collect, and how much total surplus is left, counting the union’s revenue?

Show answerHide answer

A trade can survive only if its gain exceeds $30, since otherwise no pair of prices $30 apart suits both sides. That leaves the first three. For instance buyers pay $68 and sellers keep $38: exactly three buyers would pay $68 or more and exactly three sellers accept $38 or less. Buyers’ surplus is $27 + 17 + 7 = 51$, sellers’ is $28 + 18 + 8 = 54$, and the union collects $3 \times 30 = 90$. The total is 195, which is 30 less than before.

  1. With no tax, five copies trade at 52 dollars and total surplus is 225.
  2. A tax of 30 dollars per book: buyers pay 68, sellers keep 38, and only three trades survive.
  3. The fourth and fifth trades would have created 25 and 5 dollars. Those 30 dollars are gone.
A $30 tax on each book. Buyers pay $68 and sellers keep $38. Three trades survive and yield revenue (gold). The fourth and fifth trades, whose gains of $25 and $5 are smaller than the tax, no longer happen, and their gains (red) go to nobody.
Monocurl source
let Gains = |p0, p1, n| [
    map(range(0, n), |j| Strip(FK, j + 0.07, j + 0.93, p1, SV[j], tint(AZURE, 0.4))),
    map(range(0, n), |j| Strip(FK, j + 0.07, j + 0.93, SC[j], p0, tint(EMBER, 0.4)))
]
mesh fills = []
mesh plot = BookPlot(FK)
mesh stairs = [DStair(FK, SV), SStair(FK, SC)]
mesh lines = []
mesh side = []

slide "With no tax, five copies trade at 52 dollars and total surplus is 225."
    fills = Gains(52, 52, 5)
    lines = [Seg(at(FK, 0, 52), at(FK, 8, 52), INK, 3)]
    side = [Read(1.55, "buyers gain", "115", AZURE), Read(0.6, "sellers gain", "110", EMBER)]
    play Fade(0.6)

slide "A tax of 30 dollars per book: buyers pay 68, sellers keep 38, and only three trades survive."
    fills = []
    lines = []
    side = []
    play Fade(0.4)
    fills = [
        Gains(38, 68, 3),
        Strip(FK, 0.07, 2.93, 38, 68, tint(GOLD, 0.45))
    ]
    lines = [
        Seg(at(FK, 0, 68), at(FK, 8, 68), INK, 3),
        Seg(at(FK, 0, 38), at(FK, 8, 38), INK, 3)
    ]
    side = [Read(1.55, "buyers gain", "51", AZURE), Read(0.6, "sellers gain", "54", EMBER), Read(-0.35, "tax revenue", "90", GOLD)]
    play Fade(0.6)

slide "The fourth and fifth trades would have created 25 and 5 dollars. Those 30 dollars are gone."
    fills .= Strip(FK, 3.07, 3.93, SC[3], SV[3], tint(ROSE, 0.6))
    fills .= Strip(FK, 4.07, 4.93, SC[4], SV[4], tint(ROSE, 0.6))
    side .= Read(-1.3, "lost to all", "30", ROSE)
    play Fade(0.6)

Uses the shared definitions for this lesson's figures.

The missing $30 is $25 + 5$, the gains from the fourth and fifth trades. Hoa would pay $65 and the fourth owner would sell for $40. Without the tax they trade and share $25. With it, she would need to pay at least $70 for the owner to keep $40, so they do not trade. Hoa does not get the $25, the owner does not get it, and the union does not get it either, because a trade that does not happen pays no tax.

The helmet market tells the same story with areas.

  1. No tax: 600 helmets at 40 dollars. Buyers’ surplus is the blue triangle and sellers’ the orange one.
  2. With the tax: 500 helmets. Buyers pay 50, sellers keep 35, and the government takes the band between.
The helmet market before and after a $15 tax. Afterward, the area between the two curves is divided among buyers (blue), sellers (orange) and the government (gold), except for the red triangle beyond the 500th helmet, which nobody receives.
Monocurl source
mesh fills = []
mesh plot = HelmetPlot(FL)
mesh lines = Lines(FL)
mesh marks = []
mesh side = []

slide "No tax: 600 helmets at 40 dollars. Buyers' surplus is the blue triangle and sellers' the orange one."
    fills = [
        Region([at(FL, 0, 100), at(FL, 0, 40), at(FL, 600, 40)], tint(AZURE, 0.32)),
        Region([at(FL, 0, 10), at(FL, 600, 40), at(FL, 0, 40)], tint(EMBER, 0.32))
    ]
    marks = [Pt(at(FL, 600, 40), INK, 0.09)]
    side = [Read(1.55, "buyers", "18000", AZURE), Read(0.6, "sellers", "9000", EMBER)]
    play Fade(0.6)

slide "With the tax: 500 helmets. Buyers pay 50, sellers keep 35, and the government takes the band between."
    fills = []
    marks = []
    side = []
    play Fade(0.4)
    fills = TaxFills(FL, 15)
    marks = [
        Seg(at(FL, 500, 35), at(FL, 500, 50), INK, 5),
        Pt(at(FL, 500, 50), AZURE, 0.09),
        Pt(at(FL, 500, 35), EMBER, 0.09)
    ]
    side = [Read(1.55, "buyers", "12500", AZURE), Read(0.6, "sellers", "6250", EMBER), Read(-0.35, "tax revenue", "7500", GOLD), Read(-1.3, "lost to all", "750", ROSE)]
    play Fade(0.6)

Uses the shared definitions for this lesson's figures.

That answers the first puzzle. Of the $8,250 that buyers and sellers lose, $7,500 is transferred to the government, which can spend it, and $750 is the surplus of trades that stopped happening.

Who bears the tax

The second puzzle was about who pays. Compare prices before and after: buyers paid $40 and now pay $50; sellers kept $40 and now keep $35. Of the $15, buyers bear $10 and sellers $5. How the burden is actually divided is called the incidence of the tax. We never said who hands the money to the city, and the example never needed to know.

  1. With no tax the market clears at 40 dollars and 600 helmets.
  2. Collect 15 dollars per helmet from sellers. They need 15 more at every quantity, so supply shifts up. The posted price is 50 and sellers keep 35.
  3. Collect it from buyers instead. They will offer sellers 15 less at every quantity, so demand shifts down. The posted price is 35 and buyers pay 50 in all.
Two ways to collect the same $15 tax. Collected from sellers, the supply curve shifts up by $15. Collected from buyers, the demand curve shifts down by $15. Either way 500 helmets are sold, buyers pay $50 in all and sellers keep $35.
Monocurl source
let Law = |ks, kd| {
    let q = Qt(ks + kd)
    var out = []
    if (ks > 0.2) {
        out .= stroke{EMBER, 3.5} dashed{[0.14, 0.08]} Line(at(FL, 0, 10 + ks), at(FL, 1000, 60 + ks))
    }
    if (kd > 0.2) {
        out .= stroke{AZURE, 3.5} dashed{[0.14, 0.08]} Line(at(FL, 0, 100 - kd), at(FL, 1000 - 10 * kd, 0))
    }
    if (ks + kd > 0.2) {
        out .= Seg(at(FL, q, Ps(q)), at(FL, q, Pd(q)), INK, 5)
    }
    out .= Pt(at(FL, q, Pd(q)), AZURE, 0.09)
    out .= Pt(at(FL, q, Ps(q)), EMBER, 0.09)
    return out
}
mesh plot = HelmetPlot(FL)
mesh lines = Lines(FL)
mesh law = Law(ks: 0, kd: 0)
mesh side = [Read(1.55, "posted price", "40"), Read(-0.35, "helmets", "600")]

slide "With no tax the market clears at 40 dollars and 600 helmets."
    play Wait(0.5)

slide "Collect 15 dollars per helmet from sellers. They need 15 more at every quantity, so supply shifts up. The posted price is 50 and sellers keep 35."
    side = []
    play Fade(0.3, [&side])
    law.ks = 15
    play Lerp(1.8, [&law])
    side = [Read(1.55, "posted price", "50"), Read(0.6, "buyers pay", "50", AZURE), Read(-0.35, "sellers keep", "35", EMBER), Read(-1.3, "helmets", "500")]
    play Fade(0.4, [&side])

slide "Collect it from buyers instead. They will offer sellers 15 less at every quantity, so demand shifts down. The posted price is 35 and buyers pay 50 in all."
    side = []
    play Fade(0.3, [&side])
    law.ks = 0
    law.kd = 15
    play Lerp(1.8, [&law])
    side = [Read(1.55, "posted price", "35"), Read(0.6, "buyers pay", "50", AZURE), Read(-0.35, "sellers keep", "35", EMBER), Read(-1.3, "helmets", "500")]
    play Fade(0.4, [&side])

Uses the shared definitions for this lesson's figures.

For the helmets $b = \frac{1}{10}$ and $d = \frac{1}{20}$, so the buyers’ share is $\frac{b}{b+d} = \frac{2}{3}$, which is $10 of the $15, and the deadweight loss is $\frac{225}{0.3} = 750$.

Part 2 says the side whose curve is steeper bears more. A steep demand curve means buyers hardly change their quantity when the price moves; in the language of the elasticity lesson, their demand is less elastic at the market point. Buyers who will not walk away can be charged, and the tax lands on them.

The same supply curve and the same $15 tax with two different demand curves through the same starting point. Where buyers respond little (left), they bear $12 of the tax and few trades are lost. Where they respond strongly (right), they bear $5 and many trades are lost. Both panels zoom in on quantities from 300 to 700 and prices from $20 to $60.
The same supply curve and the same $15 tax with two different demand curves through the same starting point. Where buyers respond little (left), they bear $12 of the tax and few trades are lost. Where they respond strongly (right), they bear $5 and many trades are lost. Both panels zoom in on quantities from 300 to 700 and prices from $20 to $60.
Monocurl source
# a window around the old equilibrium, so the wedge and the lost triangle are large enough to read
let Half = |i| Frame(300, 700, 20, 60, [-1.9 + 3.95 * i, 0.12, 0], 2.9, 2.25)
let Case = |i, a, b, x0, title| {
    let f = Half(i)
    let q = (a - 25) / (b + 0.05)
    let pb = a - b * q
    return [
        Region([at(f, q, pb), at(f, q, pb - 15), at(f, 600, 40)], tint(ROSE, 0.65)),
        Plot(f, [300, 400, 500, 600], [20, 30, 40, 50, 60], "helmets per month", "price ($ per helmet)", 0.85, 0.4),
        Seg(at(f, x0, a - b * x0), at(f, 700, a - b * 700), AZURE, 4.5),
        Seg(at(f, 300, 25), at(f, 700, 45), EMBER, 4.5),
        Seg(at(f, q, 40), at(f, q, pb), AZURE, 8),
        Seg(at(f, q, pb - 15), at(f, q, 40), EMBER, 8),
        Pt(at(f, 600, 40), INK, 0.08),
        center{[fx(f, 500), fy(f, 60) + 0.7, 0]} Cap(title, 0.74, INK),
        center{[fx(f, 500), fy(f, 20) - 1.03, 0]} Cap(str_join(["buyers bear $", to_string(pb - 40, 0), " of $15"]), 0.74, AZURE)
    ]
}
mesh cases = [
    Case(0, 160, 0.2, 500, "buyers respond little"),
    Case(1, 55, 0.025, 300, "buyers respond strongly")
]

Uses the shared definitions for this lesson's figures.

In the limit of a vertical demand curve, where buyers take the same quantity at any price, the formulas give $\frac{b}{b+d} \to 1$ and $\frac{t^2}{2(b+d)} \to 0$: buyers bear all of the tax and there is no deadweight loss, because no trade is prevented.

One more consequence of part 3 deserves a prediction.

Pause and try

The city doubles the helmet tax to $30. Before calculating, guess what happens to the revenue and to the deadweight loss. Then compute both.

Show answerHide answer

$Q_{30} = 600 - \frac{30}{0.15} = 400$, so revenue is $30 \times 400 = 12{,}000$ dollars, which is less than double the 7,500. The deadweight loss is $\frac{900}{0.3} = 3000$, four times the 750. Doubling the tax doubles both the height and the base of the lost triangle. The animation at the top of the page shows the red triangle growing much faster than the gold band.

What the model leaves out

These are results about a model, and three limits matter in practice. First, the deadweight loss says nothing about what the revenue buys. A tax can be worth its loss if the spending is valuable enough, and the model is silent on that. Second, if helmets or anything else impose costs or benefits on bystanders, total surplus as defined here leaves something out. A tax on a good that pollutes can raise true total surplus, because some of the trades it prevents were destroying value. Third, the claim that the collecting side does not matter is a prediction, and it has been tested. Laboratory markets have generally supported it. In shops there is evidence of a wrinkle: in a 2009 study by Chetty, Looney and Kroft, shoppers cut back more when the tax was included in the price on the shelf tag than when the same tax was added at the register. People respond to the price they notice, which the model assumes is the full price.

Check yourself

A $1 tax per coffee is introduced, collected from cafés. Customers are far more willing to change how much coffee they buy than cafés are to change how much they sell. Who bears most of the tax?

Looking back, the lesson’s one tool was the gain from a trade, the buyer’s value minus the seller’s cost. Adding gains up gave total surplus, and the price turned out to be only the device that divides each gain. A tax inserts a gap between the two prices. Every trade whose gain is smaller than the gap disappears, and the split of the burden is settled by which side is less able to leave.

Problems

The first three repeat the lesson’s calculations, the next three ask for an explanation or a comparison, and the last two extend the model.

Problem 1

Five buyers would pay up to $12, $10, $9, $7 and $4 for a poster, and five sellers would accept no less than $3, $5, $6, $8 and $11. At a price of $7.50, find who trades, the consumer surplus, the producer surplus and the total. Verify the total without using the price.

Show solutionHide solution

Buyers at 12, 10 and 9 buy; sellers at 3, 5 and 6 sell. Consumer surplus is $4.5 + 2.5 + 1.5 = 8.5$ dollars and producer surplus is $4.5 + 2.5 + 1.5 = 8.5$ dollars, total 17. Without the price: $(12 + 10 + 9) - (3 + 5 + 6) = 31 - 14 = 17$. A fourth trade would pair the $7 buyer with the $8 seller and change the total by $-1$.

Problem 2

In a notebook market the buyer of the $Q$-th notebook would pay $30 - \frac{Q}{20}$ dollars and the $Q$-th notebook costs $3 + \frac{Q}{40}$ dollars to supply. Find the equilibrium, the consumer surplus and the producer surplus.

Show solutionHide solution

Set $30 - \frac{Q}{20} = 3 + \frac{Q}{40}$: then $27 = \frac{3Q}{40}$, so $Q = 360$ and $P = 30 - 18 = 12$. Consumer surplus is the triangle with base 360 and height $30 - 12 = 18$: $\frac12 \times 360 \times 18 = 3240$ dollars. Producer surplus has height $12 - 3 = 9$: $\frac12 \times 360 \times 9 = 1620$ dollars.

Problem 3

A tax of $3 per notebook is imposed in the market of the previous problem. Find the quantity, the two prices, the revenue, the deadweight loss and each side’s share of the tax.

Show solutionHide solution

Here $b = \frac{1}{20}$ and $d = \frac{1}{40}$, so $b + d = \frac{3}{40}$. $Q_t = 360 - 3 \div \frac{3}{40} = 360 - 40 = 320$. Buyers’ share is $\frac{b}{b+d} = \frac23$, so $P_b = 12 + 2 = 14$ and $P_s = 12 - 1 = 11$. Check with the curves: $30 - \frac{320}{20} = 14$ and $3 + \frac{320}{40} = 11$. Revenue is $3 \times 320 = 960$ dollars. Deadweight loss is $\frac12 \times 3 \times 40 = 60$ dollars, which agrees with $\frac{t^2}{2(b+d)} = 9 \div \frac{6}{40} = 60$.

Problem 4

In the eight-student book market, the tax per book is raised from $30 to $50. How many trades survive? Compare the revenue and the deadweight loss with those of the $30 tax.

Show solutionHide solution

The gains from the trades in order are 85, 65, 45, 25 and 5. Only those above 50 survive: two trades. Revenue is $2 \times 50 = 100$ dollars, against 90 before. The lost gains are $45 + 25 + 5 = 75$ dollars, against 30 before. Raising the tax by $20 brought in $10 more and destroyed $45 more. The extra tax is collected on fewer trades, while every trade it newly prevents had a large gain.

Problem 5

A payroll tax is, by law, paid half by the employer and half by the worker. A politician proposes making the employer pay all of it, “so that workers get a raise”. Using the theorem, explain what the model predicts, and state what would have to be true for workers to bear most of the tax under either law.

Show solutionHide solution

Treat labor as the good, workers as sellers and employers as buyers. The theorem says the quantity of labor, what employers pay in total per hour and what workers take home depend only on the size of the tax, not on how the law splits it. If the worker’s half is moved onto the employer, the model predicts that the posted wage falls by that amount, so take-home pay and the employer’s total cost per hour stay where they were. Workers bear most of the tax if their supply curve is much steeper than employers’ demand curve, that is, if the hours people work respond little to the wage while employers’ hiring responds a lot. Whether that is so is an empirical question about labor markets.

Problem 6

For the helmet market, write the tax revenue as a function of the tax $t$. Which tax raises the most revenue, how much is it, and what is the deadweight loss at that tax? Why does revenue fall when the tax is raised further?

Show solutionHide solution

$Q_t = 600 - \frac{t}{0.15} = \frac{90 - t}{0.15}$, so revenue is $R(t) = \frac{t(90 - t)}{0.15}$. The product $t(90 - t)$ is a downward parabola with zeros at 0 and 90, so it peaks halfway, at $t = 45$, where $R = \frac{45 \times 45}{0.15} = 13{,}500$ dollars. The deadweight loss there is $\frac{45^2}{0.3} = 6750$ dollars, half as large as the revenue itself. Beyond $t = 45$ each extra dollar of tax is collected on so few remaining helmets that the loss of taxed trades outweighs the higher rate: at $t = 60$ revenue is back to $\frac{60 \times 30}{0.15} = 12{,}000$, the same as at $t = 30$, with four times the deadweight loss.

Problem 7

A subsidy is a negative tax: the city pays $15 for every helmet sold, so sellers keep $15 more than buyers pay. Find the new quantity and prices in the helmet market, the cost to the city, the changes in consumer and producer surplus, and the deadweight loss. Where does the loss come from?

Show solutionHide solution

Now $P_s - P_b = 15$: $\left(10 + \frac{Q}{20}\right) - \left(100 - \frac{Q}{10}\right) = 15$ gives $\frac{3Q}{20} = 105$, so $Q = 700$, $P_b = 30$ and $P_s = 45$. The city pays $15 \times 700 = 10{,}500$ dollars. Consumer surplus becomes $\frac12 \times 700 \times 70 = 24{,}500$, a rise of 6,500. Producer surplus becomes $\frac12 \times 700 \times 35 = 12{,}250$, a rise of 3,250. Buyers and sellers gain 9,750 between them and the city spends 10,500, so total surplus falls by 750. The loss comes from helmets 600 to 700: each costs more to supply than its buyer would pay, by an amount rising from 0 to 15, a triangle of area $\frac12 \times 15 \times 100 = 750$. A tax prevents trades that create value; a subsidy causes trades that destroy it.

Problem 8

Suppose exactly 500 helmets are demanded at every price up to $100 (a vertical demand curve), and supply is still $P_s(Q) = 10 + \frac{Q}{20}$. Find the price with no tax and the prices with a $15 tax. Who bears the tax, and what is the deadweight loss? Relate the answer to the theorem.

Show solutionHide solution

With no tax, 500 helmets are supplied at $P = 10 + 25 = 35$ dollars. With the tax, buyers still take 500, so sellers must still keep $P_s = 35$ to supply them, and buyers pay $P_b = 35 + 15 = 50$. Buyers bear the entire $15. The quantity is unchanged, so no trade is lost and the deadweight loss is 0, while revenue is $15 \times 500 = 7500$ dollars. The theorem as stated does not cover a vertical demand curve, but this is the limit of its formulas as $b$ grows without bound: the buyers’ share $\frac{b}{b+d}$ tends to 1 and the loss $\frac{t^2}{2(b+d)}$ tends to 0. Goods whose buyers cannot do without them are, for this reason, both the cheapest to tax in lost surplus and the ones where buyers carry the whole burden.

Shared definitions used by this lesson's figures
# house kit: prepended to every essay figure after the std imports

# palette. AZURE and EMBER are the two actors, LEAF marks an answer, ROSE a problem
let PAPER = [1, 1, 1, 1]
let INK = [0.08, 0.09, 0.11, 1]
let SLATE = [0.40, 0.44, 0.50, 1]
let MIST = [0.85, 0.86, 0.88, 1]
let AZURE = [0.13, 0.42, 0.68, 1]
let EMBER = [0.89, 0.42, 0.12, 1]
let LEAF = [0.13, 0.55, 0.36, 1]
let ROSE = [0.78, 0.22, 0.24, 1]
let PLUM = [0.47, 0.30, 0.66, 1]
let GOLD = [0.85, 0.62, 0.08, 1]

background = PAPER

# an opaque pastel of col; use for fills so overlaps do not darken
let tint = |col, amount = 0.18| [
    1 - (1 - col[0]) * amount,
    1 - (1 - col[1]) * amount,
    1 - (1 - col[2]) * amount,
    1
]

# text: Cap for labels, Note for quiet labels, Math for typeset maths
let Cap = |txt, size = 0.75, col = INK| color{col} Text(txt, size, "Charter")
let Note = |txt, size = 0.65| color{SLATE} Text(txt, size, "Charter")
let Math = |tex, size = 0.9, col = INK| color{col} Tex(tex, size)

# a paper rectangle to sit behind text that crosses lines
let Plate = |pos, size| center{pos} fill{PAPER} stroke{alpha{0} PAPER, 0} Rect(size)

# shapes with fill and stroke both set, so no stray black appears
let Pt = |pos, col = INK, r = 0.075| center{pos} fill{col} stroke{col, 1} Circle(r, 48)
let Ring = |pos, col = INK, r = 0.1, w = 3| center{pos} fill{PAPER} stroke{col, w} Circle(r, 48)
let Seg = |a, b, col = INK, w = 3| stroke{col, w} Line(a, b)
let Path = |pts, col = INK, w = 3| stroke{col, w} Polyline(pts)
let Region = |pts, col| fill{col} stroke{alpha{0} col, 0} Polygon(pts)
let Outline = |pts, col = INK, w = 3| fill{alpha{0} PAPER} stroke{col, w} Polygon(pts)
let Shape = |pts, col, amount = 0.18, w = 3| fill{tint(col, amount)} stroke{col, w} Polygon(pts)
let Disc = |pos, r, col, amount = 0.18, w = 3| center{pos} fill{tint(col, amount)} stroke{col, w} Circle(r, 96)
let Box = |pos, size, col, amount = 0.18, w = 3| center{pos} fill{tint(col, amount)} stroke{col, w} Rect(size)
# a line from a to b ending in a small solid arrowhead
let Tip = |a, b, col = INK, w = 3, head = 0.17| {
    let d = normalize([b[0] - a[0], b[1] - a[1], 0])
    let n = [-d[1], d[0], 0]
    let base = [b[0] - d[0] * head, b[1] - d[1] * head, 0]
    return [
        stroke{col, w} Line(a, base),
        fill{col} stroke{col, 1} Polygon([
            b,
            [base[0] + n[0] * head * 0.42, base[1] + n[1] * head * 0.42, 0],
            [base[0] - n[0] * head * 0.42, base[1] - n[1] * head * 0.42, 0]
        ])
    ]
}

# plots. a frame is [x0, x1, y0, y1, centre, width, height]: a data window and the scene box it fills
let Frame = |x0, x1, y0, y1, c = [0, 0, 0], w = 6.4, h = 3.6| [x0, x1, y0, y1, c, w, h]
let fx = |fr, x| fr[4][0] + (x - (fr[0] + fr[1]) / 2) * fr[5] / (fr[1] - fr[0])
let fy = |fr, y| fr[4][1] + (y - (fr[2] + fr[3]) / 2) * fr[6] / (fr[3] - fr[2])
let at = |fr, x, y| [fx(fr, x), fy(fr, y), 0]

# axes through the data origin (or the nearest edge of the window), with optional names
let Axes = |fr, x_name = "", y_name = "", col = SLATE| {
    let ox = clamp(fr[0], 0, fr[1])
    let oy = clamp(fr[2], 0, fr[3])
    var parts = [
        Tip(at(fr, fr[0], oy), [fx(fr, fr[1]) + 0.25, fy(fr, oy), 0], col, 2.5, 0.15),
        Tip(at(fr, ox, fr[2]), [fx(fr, ox), fy(fr, fr[3]) + 0.25, 0], col, 2.5, 0.15)
    ]
    if (x_name != "") {
        parts .= center{[fx(fr, fr[1]) + 0.5, fy(fr, oy), 0]} Math(x_name, 0.8, col)
    }
    if (y_name != "") {
        parts .= center{[fx(fr, ox), fy(fr, fr[3]) + 0.5, 0]} Math(y_name, 0.8, col)
    }
    return parts
}

# tick marks with numbers at the listed data values
let XTicks = |fr, xs, col = SLATE, places = 0| block {
    let oy = fy(fr, clamp(fr[2], 0, fr[3]))
    for (x in xs) {
        . Seg([fx(fr, x), oy - 0.07, 0], [fx(fr, x), oy + 0.07, 0], col, 2)
        . center{[fx(fr, x), oy - 0.33, 0]} Math(to_string(x, places), 0.72, col)
    }
}
let YTicks = |fr, ys, col = SLATE, places = 0| block {
    let ox = fx(fr, clamp(fr[0], 0, fr[1]))
    for (y in ys) {
        . Seg([ox - 0.07, fy(fr, y), 0], [ox + 0.07, fy(fr, y), 0], col, 2)
        . center{[ox - 0.36, fy(fr, y), 0]} Math(to_string(y, places), 0.72, col)
    }
}

# faint grid lines at the listed data values
let GridLines = |fr, xs, ys, col = MIST| block {
    for (x in xs) {
        . Seg(at(fr, x, fr[2]), at(fr, x, fr[3]), col, 1.5)
    }
    for (y in ys) {
        . Seg(at(fr, fr[0], y), at(fr, fr[1], y), col, 1.5)
    }
}

# the graph of f over [a, b], drawn in the frame. values are clamped to the window
let Graph = |fr, f, a, b, col = AZURE, w = 4, n = 160|
    stroke{col, w} Polyline(map(sample(a, b, n), |x| at(fr, x, clamp(fr[2], f(x), fr[3]))))

# the region between the graph of f and the x axis over [a, b]
let AreaUnder = |fr, f, a, b, col = AZURE, amount = 0.2, n = 80| {
    var pts = [at(fr, a, 0)]
    for (x in sample(a, b, n)) {
        pts .= at(fr, x, clamp(fr[2], f(x), fr[3]))
    }
    pts .= at(fr, b, 0)
    return fill{tint(col, amount)} stroke{alpha{0} col, 0} Polygon(pts)
}

# the book market: eight buyers' willingness to pay and eight sellers' costs (dollars), sorted
let SV = [95, 85, 75, 65, 55, 45, 35, 25]
let SC = [10, 20, 30, 40, 50, 60, 70, 80]
# plot furniture: grid, left and bottom edges, numbers along the edges, axis names
let Plot = |f, gx, gy, xname, yname, ynx = 1.0, ydx = 0.36, vx = nil| block {
    var vs = vx
    if (vx == nil) { vs = gx }
    . GridLines(f, vs, gy)
    . Path([at(f, f[0], f[3]), at(f, f[0], f[2]), at(f, f[1], f[2])], SLATE, 2.5)
    for (x in gx) {
        . center{[fx(f, x), fy(f, f[2]) - 0.3, 0]} Math(to_string(x, 0), 0.72, SLATE)
    }
    for (y in gy) {
        . center{[fx(f, f[0]) - ydx, fy(f, y), 0]} Math(to_string(y, 0), 0.72, SLATE)
    }
    . center{[(fx(f, f[0]) + fx(f, f[1])) / 2, fy(f, f[2]) - 0.66, 0]} Note(xname, 0.72)
    . center{[fx(f, f[0]) + ynx, fy(f, f[3]) + 0.32, 0]} Note(yname, 0.72)
}
let DStair = |f, vs, col = AZURE, w = 4| {
    var pts = []
    for (i in range(0, len(vs))) {
        pts .= at(f, i, vs[i])
        pts .= at(f, i + 1, vs[i])
    }
    pts .= at(f, len(vs), 0)
    return stroke{col, w} Polyline(pts)
}
let SStair = |f, cs, col = EMBER, w = 4| {
    var pts = [at(f, 0, 0)]
    for (i in range(0, len(cs))) {
        pts .= at(f, i, cs[i])
        pts .= at(f, i + 1, cs[i])
    }
    pts .= at(f, len(cs), f[3])
    return stroke{col, w} Polyline(pts)
}
let Strip = |f, q0, q1, p0, p1, col| Region([at(f, q0, p0), at(f, q1, p0), at(f, q1, p1), at(f, q0, p1)], col)
# a side panel readout: a label with a value under it
let Read = |y, name, value, col = INK| [
    center{[2.7, y, 0]} Cap(name, 0.72, col),
    center{[2.7, y - 0.38, 0]} Math(value, 0.9, col)
]
let FK = Frame(0, 8, 0, 100, [-0.95, 0.15, 0], 4.3, 2.9)
let BookPlot = |f| Plot(f, [1, 2, 3, 4, 5, 6, 7, 8], [20, 40, 60, 80, 100], "copies of the book", "price (dollars per copy)", 1.25, 0.36, [2, 4, 6, 8])
# the helmet market: the Q-th helmet's buyer would pay Pd(Q), and it costs Ps(Q) to supply
let Pd = |q| 100 - q / 10
let Ps = |q| 10 + q / 20
let Qt = |t| (90 - t) * 20 / 3
let FL = Frame(0, 1000, 0, 100, [-0.95, 0.15, 0], 4.3, 2.9)
let HelmetPlot = |f| Plot(f, [200, 400, 600, 800, 1000], [20, 40, 60, 80, 100], "helmets per month", "price (dollars per helmet)", 1.3, 0.42)
let Lines = |f| [
    Seg(at(f, 0, 100), at(f, 1000, 0), AZURE, 4.5),
    Seg(at(f, 0, 10), at(f, 1000, 60), EMBER, 4.5)
]
# the four areas under a tax of t dollars per helmet: buyers, sellers, government, nobody
let TaxFills = |f, t| {
    let q = Qt(t)
    return [
        Region([at(f, 0, 100), at(f, 0, Pd(q)), at(f, q, Pd(q))], tint(AZURE, 0.32)),
        Region([at(f, 0, 10), at(f, q, Ps(q)), at(f, 0, Ps(q))], tint(EMBER, 0.32)),
        Strip(f, 0, q, Ps(q), Pd(q), tint(GOLD, 0.45)),
        Region([at(f, q, Pd(q)), at(f, q, Ps(q)), at(f, 600, 40)], tint(ROSE, 0.65))
    ]
}