Price Controls#

The Concept#

Price controls are government-imposed constraints on market prices:

  • Price Ceiling: A legal maximum price (e.g., rent control)

  • Price Floor: A legal minimum price (e.g., minimum wage)

When binding, price controls create market distortions: - Binding ceilings (below equilibrium) create shortages - Binding floors (above equilibrium) create surpluses - Both generate deadweight loss by preventing mutually beneficial trades

Modeling with FreeRide#

Let’s explore how price controls affect market outcomes:

from freeride.curves import Demand, Supply
from freeride.equilibrium import Market

# Create a market
demand = Demand.from_formula("P = 20 - Q")
supply = Supply.from_formula("P = 5 + 0.5*Q")

# Find free market equilibrium
free_market = Market(demand, supply)
print(f"Free Market Equilibrium: P = ${free_market.p:.2f}, Q = {free_market.q:.0f}")
print(f"Total Surplus: ${free_market.total_surplus:.2f}")

Expected Output:

Free Market Equilibrium: P = $10.00, Q = 10
Total Surplus: $125.00

Price Ceilings#

A binding price ceiling creates a shortage because quantity demanded exceeds quantity supplied:

# Apply a binding price ceiling at $8
ceiling_market = Market(demand, supply, ceiling=8)

# Calculate shortage
q_demanded = demand.q(8)
q_supplied = supply.q(8)
shortage = q_demanded - q_supplied

print(f"With Price Ceiling at $8:")
print(f"  Quantity Supplied: {q_supplied:.0f}")
print(f"  Quantity Demanded: {q_demanded:.0f}")
print(f"  Shortage: {shortage:.0f} units")
print(f"  Deadweight Loss: ${ceiling_market.dwl:.2f}")

# Visualize the market with ceiling
ceiling_market.plot(surplus=True)

Expected Output:

With Price Ceiling at $8:
  Quantity Supplied: 6
  Quantity Demanded: 12
  Shortage: 6 units
  Deadweight Loss: $8.00

The plot shows the binding ceiling creating a wedge between quantity supplied and demanded, with the red area representing deadweight loss.

Price Floors#

A binding price floor creates a surplus because quantity supplied exceeds quantity demanded:

# Apply a binding price floor at $12
floor_market = Market(demand, supply, floor=12)

# Calculate surplus
q_demanded = demand.q(12)
q_supplied = supply.q(12)
surplus = q_supplied - q_demanded

print(f"With Price Floor at $12:")
print(f"  Quantity Demanded: {q_demanded:.0f}")
print(f"  Quantity Supplied: {q_supplied:.0f}")
print(f"  Surplus: {surplus:.0f} units")
print(f"  Deadweight Loss: ${floor_market.dwl:.2f}")

# Visualize the market with floor
floor_market.plot(surplus=True)

Expected Output:

With Price Floor at $12:
  Quantity Demanded: 8
  Quantity Supplied: 14
  Surplus: 6 units
  Deadweight Loss: $8.00

The plot shows the binding floor creating excess supply, with producers unable to sell all they wish at the floor price.

Non-Binding Controls#

Price controls only affect the market when they’re binding:

# Non-binding ceiling (above equilibrium)
high_ceiling = Market(demand, supply, ceiling=15)
print(f"Non-binding ceiling at $15: P = ${high_ceiling.p:.2f}, Q = {high_ceiling.q:.0f}")

# Non-binding floor (below equilibrium)
low_floor = Market(demand, supply, floor=7)
print(f"Non-binding floor at $7: P = ${low_floor.p:.2f}, Q = {low_floor.q:.0f}")

# Both should equal free market equilibrium
print(f"Free market: P = ${free_market.p:.2f}, Q = {free_market.q:.0f}")

Expected Output:

Non-binding ceiling at $15: P = $10.00, Q = 10
Non-binding floor at $7: P = $10.00, Q = 10
Free market: P = $10.00, Q = 10