这一讲要回答五个问题:

  1. 什么叫价格歧视?卖家要满足什么条件才做得到?
  2. 卖家能分辨顾客时,怎么定价?谁得益、谁受损、总剩余变大还是变小?
  3. 卖家分辨不出谁是谁,怎么办?
  4. 两部制收费和打包订阅为什么这么常见,尤其是在数字产品里?
  5. 为什么机票临近起飞反而更贵(有时又更便宜)?

上一讲,我们让垄断者只能定一个价格。那一讲的最后,我留了一个问题:如果山顶的店主能分辨出哪些游客渴得厉害、哪些不太渴,会怎样?这一讲回答它。你会发现,现实里的企业,几乎没有一家只定一个价格:电影票有学生票,软件有免费版和专业版,外卖有红包,机票价格天天变。它们背后,是同一个逻辑。

一、山顶的水,又来了

山顶的水店,每瓶成本 2 元,游客来自三种人:

  • 登山客:爬了四个小时,渴得厉害,一瓶水最多愿意付 12 元。
  • 普通游客:坐缆车上来的,最多愿意付 8 元。
  • 学生:带着零花钱,最多愿意付 4 元。

上一讲,我们让店主只定一个价格,它定了 6 元。你可以想一想:6 元时,登山客"赚"了很多(愿付 12,只付 6),学生却一瓶也买不起(最多愿付 4)。

先停一下:如果你是店主,一眼就能看出谁是登山客、谁是学生,你还会对大家一视同仁收 6 元吗?

多半不会。你会想:对登山客多收一点,对学生少收一点,大家都买,你赚得更多。这就是价格歧视(price discrimination):

同一种商品,卖给不同的顾客时,价格的差别超过了成本的差别。

几点说明:

  • “歧视"在经济学里是个中性词,只是描述价格有差别,不含道德评价。
  • 价格不同不等于价格歧视。快递寄得越远越贵,是因为成本更高;这不算。要看的是:成本一样,价格不一样。
  • 做得成价格歧视,要满足三个条件:(1)卖家有定价能力(第 14 讲)。在第 12 讲的完全竞争里,价格就是成本,谁都没法收不同的价。(2)卖家能区分顾客,或者能让顾客自己区分自己。(3)能阻止转售。否则,学生用 3 元买了水,转手卖给登山客,价格差就被"套利"抹掉了。(理发、看病、实名的机票,不好转售;一瓶水很好转售,所以现实里山顶的店很难做到。)

经济学家 Pigou 在 1920 年把价格歧视分成三种。我们一种一种来看,第三种放在第二种前面,因为它最容易。

二、一级价格歧视:对每个人收他的最高价

最极端的情形:店主知道每一个游客愿付多少,对每个人收他的最高愿付价。这叫一级(完全)价格歧视。

用上一讲的需求(P = 10 − 0.01 Q,边际成本 2 元):

  • 店主会一直卖到愿付价降到 2 元,也就是卖 800 瓶,和竞争的市场卖得一样多。
  • 每个游客付的,刚好是他的最高愿付价,游客剩余是 0。
  • 总剩余的全部,½ × (10 − 2) × 800 = 3200,都进了店主的口袋。

两件事值得注意:

  1. 没有无谓损失。每一笔双方都愿意的交易,都发生了(上一讲那 800 元的灰色三角形没了)。从效率说,一级价格歧视和完全竞争一样好。
  2. 但所有好处都归了卖家,买家一点剩余也没有。效率和公平,再一次是两个问题(第 9 讲、第 14 讲)。

现实里,没有哪个卖家能知道每个人的最高愿付价,所以一级是个理论的极限,不是常态。集市上的讨价还价、拍卖,有点像它;第八节讲的"个性化定价”,是在往这个方向走。

三、三级价格歧视:按群体定价

更常见的是:卖家看不出每个人的愿付价,但能看出他属于哪一类:学生还是成人,本地人还是游客,老用户还是新用户。对每一类定一个价,叫三级价格歧视。

3.1 怎么定

规则很熟悉:把每一类人当作一个单独的市场,对每个市场用第 14 讲的办法:在这一类人的边际收益等于边际成本处定量,沿这一类人的需求线读价格。

设每一类游客的需求是直线:每降 1 元,多买 50 瓶(最高愿付价分别是 12、8、4)。手算:

  • 登山客:Q = 50 × (12 − P),边际收益 MR = 12 − 0.04 Q,令它等于 2,Q = 250,价格 7。
  • 普通游客:Q = 50 × (8 − P),MR = 8 − 0.04 Q = 2,Q = 150,价格 5。
  • 学生:Q = 50 × (4 − P),MR = 4 − 0.04 Q = 2,Q = 50,价格 3。

价格是 7、5、3,愿付价越高的一类,价格越高。这就是第 14 讲的勒纳指数:加价率 = 1 ÷ 弹性,需求越缺乏弹性的一类,加价越高。

画出来:

三类游客,三个价格

3.2 谁赢谁输

比较两种办法:统一价格(上一讲:6 元),和三级价格歧视(7、5、3)。

先注意:统一价格 6 元时,学生买不起(最高愿付 4 元),卖出的是 登山客 300 瓶 + 普通游客 100 瓶 = 400 瓶。

我们用代码把每一方的得失算出来,并加上"一级"做对照:

# 山顶水店(成本 2 元/瓶)。三类游客,每类的需求都是直线:Q = 50 × (最高愿付价 - P)
MC, B = 2, 50
tops = {"登山客": 12, "普通游客": 8, "学生": 4}        # 每类人愿意付的最高价;每类每降 1 元多买 50 瓶
buy = lambda top, p: max(0.0, B * (top - p))
grid = [p / 100 for p in range(200, 1300)]             # 价格从 2 元试到 13 元,步长 0.01

def evaluate(groups, prices):
    """prices:每类人各自面对的价格。返回 (卖出, 店主利润, 各类游客剩余, 总剩余)"""
    q = {g: buy(tops[g], prices[g]) for g in groups}
    profit = sum((prices[g] - MC) * q[g] for g in groups)
    cs = {g: 0.5 * q[g] * (tops[g] - prices[g]) + 0.0 for g in groups}
    return sum(q.values()), profit, cs, profit + sum(cs.values())

def uniform(groups):                                    # 统一价格:试遍每个价格
    p = max(grid, key=lambda p: evaluate(groups, {g: p for g in groups})[1])
    return {g: p for g in groups}

def discriminate(groups):                               # 三级歧视:每类人各自 MR = MC
    return {g: max(grid, key=lambda p: (p - MC) * buy(tops[g], p)) for g in groups}

everyone = list(tops)
print("办法 | 各类人的价格 | 卖出 | 店主的利润(收入减成本) | 游客剩余合计 | 总剩余")
for name, prices in [("统一价格", uniform(everyone)), ("三级歧视", discriminate(everyone))]:
    q, pr, cs, tot = evaluate(everyone, prices)
    print(f"{name} | {', '.join(f'{g} {prices[g]:g}' for g in everyone)} | {q:.0f} | {pr:.0f} | {sum(cs.values()):.0f} | {tot:.0f}")
q1 = {g: buy(tops[g], MC) for g in everyone}             # 一级:每人付自己的最高愿付价,卖到愿付价降到 2 元
profit1 = sum(0.5 * q1[g] * (tops[g] - MC) for g in everyone)
print(f"一级歧视 | 各付各的最高愿付价 | {sum(q1.values()):.0f} | {profit1:.0f} | 0 | {profit1:.0f}")

print("\n三级歧视相对统一价格,每一方的变化:")
_, pr_u, cs_u, tot_u = evaluate(everyone, uniform(everyone))
_, pr_d, cs_d, tot_d = evaluate(everyone, discriminate(everyone))
for g in everyone:
    print(f"  {g}:游客剩余 {cs_u[g]:.0f} -> {cs_d[g]:.0f}({cs_d[g] - cs_u[g]:+.0f})")
print(f"  店主:{pr_u:.0f} -> {pr_d:.0f}({pr_d - pr_u:+.0f});总剩余 {tot_u:.0f} -> {tot_d:.0f}({tot_d - tot_u:+.0f})")

# 如果没有学生这一类,只有前两类:
two = ["登山客", "普通游客"]
q_u, _, _, t_u = evaluate(two, uniform(two))
q_d, _, _, t_d = evaluate(two, discriminate(two))
print(f"\n只有登山客和普通游客:统一价格卖 {q_u:.0f} 瓶,总剩余 {t_u:.0f};三级歧视卖 {q_d:.0f} 瓶,总剩余 {t_d:.0f}({t_d - t_u:+.0f})")

输出:

办法 | 各类人的价格 | 卖出 | 店主的利润(收入减成本) | 游客剩余合计 | 总剩余
统一价格 | 登山客 6, 普通游客 6, 学生 6 | 400 | 1600 | 1000 | 2600
三级歧视 | 登山客 7, 普通游客 5, 学生 3 | 450 | 1750 | 875 | 2625
一级歧视 | 各付各的最高愿付价 | 900 | 3500 | 0 | 3500

三级歧视相对统一价格,每一方的变化:
  登山客:游客剩余 900 -> 625(-275)
  普通游客:游客剩余 100 -> 225(+125)
  学生:游客剩余 0 -> 25(+25)
  店主:1600 -> 1750(+150);总剩余 2600 -> 2625(+25)

只有登山客和普通游客:统一价格卖 400 瓶,总剩余 2600;三级歧视卖 400 瓶,总剩余 2550(-50)

逐项看:

  • 登山客吃亏:游客剩余从 900 降到 625。他们本来就愿意付很多,现在真的被收了更多(7 元,比 6 元多)。
  • 普通游客得益:从 100 升到 225,价格从 6 元降到 5 元。
  • 学生得益:从 0 升到 25。以前买不起,现在 3 元买得到了。
  • 店主赚得更多:从 1600 升到 1750。
  • 总剩余从 2600 升到 2625,只多了 25。

对照一级:卖 900 瓶,店主拿走全部 3500,游客一点也没有。

这里要纠正我上一讲结尾的一句话。我说灰色的无谓损失三角形,“一部分会变成利润,另一部分会变成买家的好处”。更准确地说:能收回多少三角形,取决于歧视做得多细;三级歧视只收回了其中很小的一块(这个市场里,统一价格相对最理想的总剩余少了 900,三级只补回 25);而更大的变化是:剩余在不同人群之间重新分配了。

3.3 总剩余是变多还是变少

最后一行答案很重要:如果没有学生,只有两类游客,三级歧视卖出的总瓶数不变(400 瓶),总剩余反而从 2600 降到 2550。

为什么?因为瓶数没变,但谁买到变了:统一价格 6 元时,登山客买 300 瓶、普通游客买 100 瓶;差别定价后,登山客只买 250 瓶、普通游客买 150 瓶。可是登山客多喝一瓶的价值(边际愿付价 7 元)高于普通游客(5 元)。同样的 400 瓶水,本该多给愿付价更高的人,价格歧视把一部分水"配"给了愿付价更低的人,配置变差了,所以总剩余降低。

有了学生这一类,情况就变了:学生从"买不起"变成"买得起",总卖出量增加了(400 → 450),这部分新增的交易,带来了新的剩余。两种力量加在一起,总剩余净增加 25。

经济学里有一个一般的结论(Schmalensee 1981,Varian 1985):对三级价格歧视,总产出增加,是总福利增加的必要条件(但不是充分条件)。 如果价格歧视没有让更多的人买到东西,总福利就一定下降。它让原本被排除在外的人也买到,才可能让总福利上升。

这给了我们一个判断的角度:学生票、老人票、国际药价,之所以经常被看作是"好事",是因为它们常常让愿付价低的人买得到。反过来,对愿付价高的人加价,而没有让更多人买到,效果更值得怀疑。

3.4 证据:现实里价格歧视的福利效应有多大

证据怎么说:Phillip Leslie 2004 年(RAND Journal of Economics,35 卷 3 期)研究了 1996 年百老汇一部戏剧(《Seven Guitars》)的所有场次,估计这部戏实际用的价格歧视(多档票价、半价票等),使制作方的利润比最优的统一价格高约 5%,而对消费者总福利的影响很小。

局限:这是一部戏的结果,不能直接推广到别的行业。证据还告诉我们:价格歧视对总福利的影响,常常不是"惊天动地"的,而是要看具体的需求形状、群体划分的方式,不同行业差别很大。

小结: 价格歧视:同一种商品,价格差别超过成本差别。条件:有定价能力、能区分顾客、能阻止转售。一级(对每人收最高价)没有无谓损失,但剩余都归卖家。三级(按群体定价):愿付价高、需求缺乏弹性的一类价格高。它对总福利的影响不确定:总产出增加是必要条件;让原本买不起的人买到,才可能增加总福利。

四、二级价格歧视:让顾客自己选

4.1 看不出谁是谁

现实里,卖家常常看不出谁是登山客、谁是学生。你不能要求每个乘客出示"我是商务旅客"的证明,航空公司也不知道你是不是出差。这时怎么办?

办法是:设计一份"菜单",让不同的顾客,自己选对自己最好的那份。 这叫二级价格歧视。常见的菜单:经济舱和商务舱;软件的家庭版和专业版;买得越多单价越低;提前预订便宜、不可退改,临时预订贵。

关键的想法:顾客自己的选择,暴露了他是哪一类。 所以,菜单必须满足一个条件:每类顾客,都自愿选给自己设计的那一份(在经济学里叫激励相容,第 21 讲、第 22 讲会再讲)。

4.2 一个航空公司的菜单

航空公司有两类乘客:商务旅客和休闲旅客,各 100 人,每人买一个座位。座位有两种:经济舱(成本 100 元)和商务舱(成本 200 元)。各类人愿意为每种座位付的最高价:

经济舱 商务舱
商务旅客 300 550
休闲旅客 250 300

先想:只有一种座位,怎么卖?

  • 只卖经济舱,价格 300:只有商务旅客买,利润 100 × (300 − 100) = 20000。
  • 只卖经济舱,价格 250:两类都买,利润 200 × (250 − 100) = 30000。
  • 只卖商务舱,价格 550:只有商务旅客买,利润 100 × (550 − 200) = 35000。

最好的一种单品办法,利润 35000。现在,两种座位都卖:经济舱 250 元,商务舱定多少?

如果定 550:商务旅客算一下,买商务舱剩余是 550 − 550 = 0;买经济舱剩余是 300 − 250 = 50。他会去买经济舱! 你的商务舱一个也卖不出去,利润反而只有 30000。

要让商务旅客愿意买商务舱,商务舱的剩余必须不低于 50:550 − 价格 ≥ 50,所以商务舱最多定 500。这时:休闲旅客买经济舱(利润 100 × 150 = 15000),商务旅客买商务舱(利润 100 × 300 = 30000),总利润 45000,比最好的单品办法多 10000。

# 航空公司卖两种座位:经济舱(成本 100)、商务舱(成本 200)。商务旅客和休闲旅客各 100 人。
# 每人买一个座位。数字是各人愿意为这个座位付的最高价。
cost = {"经济": 100, "商务": 200}
wtp = {"商务旅客": {"经济": 300, "商务": 550}, "休闲旅客": {"经济": 250, "商务": 300}}
N = 100

def outcome(menu):
    """menu:{座位: 价格}。每个人选自己剩余最大的(剩余相同时选更贵的;剩余为负就不买)。"""
    profit, choices = 0, {}
    for person, v in wtp.items():
        options = [(v[s] - p, p, s) for s, p in menu.items() if v[s] - p >= 0]
        if options:
            surplus, p, s = max(options)
            choices[person] = s
            profit += N * (p - cost[s])
        else:
            choices[person] = "不买"
    return profit, choices

print("几种定价办法 -> 航空公司的利润;谁买了什么")
for name, menu in [
    ("只卖经济舱,价格 300", {"经济": 300}),
    ("只卖经济舱,价格 250", {"经济": 250}),
    ("只卖商务舱,价格 550", {"商务": 550}),
    ("两种都卖,经济 250、商务 550(定得太高)", {"经济": 250, "商务": 550}),
    ("两种都卖,经济 250、商务 500", {"经济": 250, "商务": 500}),
]:
    profit, choices = outcome(menu)
    print(f"  {name}:利润 {profit};{choices}")

# 在两个价格上都试一遍,看有没有更好的菜单
best = max(((pe, pb) for pe in range(100, 400, 10) for pb in range(200, 700, 10)),
           key=lambda m: outcome({"经济": m[0], "商务": m[1]})[0])
print(f"\n试遍所有价格组合:最好的是 经济 {best[0]}、商务 {best[1]},利润 {outcome({'经济': best[0], '商务': best[1]})[0]}")
print(f"如果能认出谁是谁、对商务旅客直接收 550,对休闲旅客收 250:利润 {N * (550 - 200) + N * (250 - 100)}")

输出:

几种定价办法 -> 航空公司的利润;谁买了什么
  只卖经济舱,价格 300:利润 20000;{'商务旅客': '经济', '休闲旅客': '不买'}
  只卖经济舱,价格 250:利润 30000;{'商务旅客': '经济', '休闲旅客': '经济'}
  只卖商务舱,价格 550:利润 35000;{'商务旅客': '商务', '休闲旅客': '不买'}
  两种都卖,经济 250、商务 550(定得太高):利润 30000;{'商务旅客': '经济', '休闲旅客': '经济'}
  两种都卖,经济 250、商务 500:利润 45000;{'商务旅客': '商务', '休闲旅客': '经济'}

试遍所有价格组合:最好的是 经济 250、商务 500,利润 45000
如果能认出谁是谁、对商务旅客直接收 550,对休闲旅客收 250:利润 50000

几点体会:

  1. 菜单(45000)比任何单品办法都好,但不如"认得出谁是谁"(50000)。 差的 5000,是为了让顾客自己选而付出的代价:商务舱少收的 50 元 × 100 人。这 50 元,叫信息租金:因为卖家不知道谁是商务旅客,它必须让出一点,才能让商务旅客愿意"自报家门"。
  2. 经济舱有得有失:它带来了休闲旅客的生意(+15000),也逼得商务舱从 550 降到 500(−5000)。净增 10000,所以值得做。
  3. 现实里,很多限制就是这样的"栅栏"(fence):把便宜的版本,设计得让愿付价高的人不想用。经典的例子是:便宜机票要求"周六晚上必须在目的地过夜",要求"不可退改"。商务旅客很少愿意在外面多住一个周末,也不愿意没法改行程,所以他们不会去买便宜票。网络上"领券"“砍一刀"“限时秒杀"也有同样的逻辑:愿意花时间折腾的人,往往对价格更敏感。(这是逻辑上的解释,不是每个促销的真实动机。)

小结: 看不出谁是谁时,设计一份菜单,让不同的顾客自己选。关键约束是激励相容:每类顾客都愿意选给自己设计的那一份。代价是信息租金:为了防止愿付价高的人"降级”,要把高档版本的价格定低一点。

五、两部制收费:兑现第 14 讲

第 14 讲讲自然垄断时,提到过一种办法:先收一笔入场费,再按边际成本收每次的使用费。 这叫两部制收费(two-part tariff):游乐园的门票 + 每个项目的票价;健身房的会员费 + 单次课程费;打车的起步价 + 每公里的价格;手机的月租 + 超出的流量费。

5.1 一个游乐园

游乐园每次游玩的成本是 2 元,游客有两类:爱玩的每天想玩的次数 q = 20 − 2p(p 是每次的价格),100 人;一般的 q = 12 − 2p,300 人。

先看如果游客都一样(都是爱玩的):

  • 只定每次的价格:这就是第 14 讲的垄断者,MR = MC,定价 6 元,每人玩 8 次,每人利润 (6 − 2) × 8 = 32。
  • 两部制:每次的价格定成边际成本 2 元,每人玩 16 次;再收一笔入场费,刚好等于他的全部消费者剩余 ½ × 16 × 8 = 64。每人利润 64,比只定价高一倍,而且玩的次数最多,总剩余最大。

这很像一级价格歧视:每个人都付了他全部的剩余。

5.2 两类游客呢

爱玩的人的消费者剩余更大,一般的人更小。入场费不能比一般的人的剩余高,否则一般的人就不进场了。 这时怎么定?我们让代码试遍所有(价格,入场费)的组合:

# 游乐园:每次游玩的成本 2 元。游客分两类,各自每天想玩的次数:
#   爱玩的人:q = 20 - 2p;一般的人:q = 12 - 2p(p 是每次的价格)。爱玩的 100 人,一般的 300 人。
MC = 2
types = {"爱玩的": (20, 100), "一般的": (12, 300)}
rides = lambda a, p: max(0.0, a - 2 * p)
cs = lambda a, p: 0.5 * rides(a, p) * (a / 2 - p)         # 每个人的消费者剩余

def profit(price, fee):
    """每个人只要入场的剩余 >= 入场费就进场(相同时进场)"""
    total = 0.0
    for a, n in types.values():
        if cs(a, price) >= fee:
            total += n * (fee + (price - MC) * rides(a, price))
    return total

# 办法一:不收入场费,只收每次的价格
best_p = max((p / 10 for p in range(20, 100)), key=lambda p: profit(p, 0))
print(f"只定单价(不收入场费):每次 {best_p:g} 元,利润 {profit(best_p, 0):.0f}")

# 办法二:两部制(每次的价格 + 入场费)。入场费只有两种有意义:让所有人都进场、或只让爱玩的人进场
def best_fee(p):
    fee_all = min(cs(a, p) for a, _ in types.values())      # 所有人都进:不能超过最低那一类的剩余
    fee_h = cs(types["爱玩的"][0], p)                         # 只收爱玩的人
    return max([(profit(p, fee_all), fee_all, "所有人进场"), (profit(p, fee_h), fee_h, "只有爱玩的人进场")])
print("\n两部制:每次的价格 -> 最好的入场费、利润")
for p in (2, 2.5, 3, 3.5, 4):
    pr, fee, who = best_fee(p)
    print(f"  每次 {p:g} 元 -> 入场费 {fee:g},利润 {pr:.0f}({who})")
best = max(((best_fee(p / 10)[0], p / 10) for p in range(20, 100)))
p_star = best[1]
print(f"\n试遍所有价格:最好的是 每次 {p_star:g} 元 + 入场费 {best_fee(p_star)[1]:g},利润 {best[0]:.0f}(边际成本是 {MC} 元)")

输出:

只定单价(不收入场费):每次 4.5 元,利润 5000

两部制:每次的价格 -> 最好的入场费、利润
  每次 2 元 -> 入场费 64,利润 6400(只有爱玩的人进场)
  每次 2.5 元 -> 入场费 12.25,利润 6700(所有人进场)
  每次 3 元 -> 入场费 9,利润 6800(所有人进场)
  每次 3.5 元 -> 入场费 6.25,利润 6700(所有人进场)
  每次 4 元 -> 入场费 4,利润 6400(所有人进场)

试遍所有价格:最好的是 每次 3 元 + 入场费 9,利润 6800(边际成本是 2 元)

两部制收费:入场费 + 每次的价格

  • 只定单价:最好每次 4.5 元,利润 5000。
  • 两部制,每次的价格定成边际成本 2 元:入场费只能定到 64(只有爱玩的人愿意进场),利润 6400。
  • 最好的两部制:每次 3 元,入场费 9,所有人进场,利润 6800。每次的价格(3 元)比边际成本(2 元)还高。

为什么单价要高于边际成本?因为入场费受限于一般的人的剩余。如果单价降到边际成本,入场费只能跟着一般的人走(或者放弃一般的人)。把每次的价格抬高一点,就能从爱玩的人那里,多收一点(他们玩得多);同时降低入场费,把一般的人留下来。这是经济学家 Walter Oi 1971 年那篇有名的"迪士尼乐园难题"论文(Quarterly Journal of Economics,85 卷 1 期)的核心想法:顾客不同的时候,最优的两部制,单价不一定等于边际成本。

要说明:这是一个玩具模型。现实里,企业不知道有几类顾客、各自的需求,最优的收费要靠试验。

小结: 两部制收费 = 入场费 + 按使用收费。顾客都一样时,单价 = 边际成本,入场费 = 全部消费者剩余,效率最高、卖家拿走全部剩余。顾客不同时,最优单价可能高于边际成本。

六、为什么临近起飞的机票更贵

第 2 讲里,我们说过:“临近起飞的机票有时反而更贵,这涉及怎么对不同的人收不同的钱。” 现在有了工具,可以说清楚。

6.1 第一个原因:购票的时间,就是一道栅栏

商务旅客,常常临时才知道要出差,行程不能改,需求缺乏弹性;休闲旅客,常常提前很久就订,可以换日子,需求更有弹性。什么时候买票,成了区分两类人的"栅栏”。这是三级价格歧视:对需求缺乏弹性的一类(晚买的),收更高的价格。

6.2 第二个原因:一个座位留给谁

还有一个原因。一架飞机的座位数是固定的(比如 180 个)。一个座位,早上以 300 元卖给一个早订的人,就不能再卖给后来可能出现的、愿意付 800 元的人。每个座位的机会成本(第 1 讲):不是它的 100 元边际成本,而是"这个座位如果留着,最好的另一种用途能赚多少"。

问题是:晚到的高价乘客有多少,是不确定的。留多了,座位空着起飞,一分钱赚不到;留少了,错过 800 元的生意。该留多少?

设:早订的人愿意付 300 元,需求很多,卖不完;晚到的人愿意付 800 元,人数在 20 到 60 之间,每种可能一样大(各 1/41)。

# 一趟航班 180 个座位。早订的人愿意付 300 元(需求很多,卖不完);
# 临近起飞才订的人愿意付 800 元,但这部分人数不确定:20 到 60 人,每种可能一样大。
# 问:早期最多卖几个 300 元的座位,才能给晚到的 800 元乘客留出座位?
CAP, LOW, HIGH = 180, 300, 800
late = range(20, 61)                                   # 晚到的 800 元乘客人数:20..60,各 1/41 的可能

def expected_revenue(protect):
    """留 protect 个座位给晚到的人,其余 CAP - protect 个按 300 元早卖掉"""
    early = (CAP - protect) * LOW
    return early + sum(HIGH * min(d, protect) for d in late) / len(late)

best = max(range(0, CAP + 1), key=expected_revenue)
print("留给晚到乘客的座位数 -> 期望收入")
for y in (0, 20, 30, 40, 45, 50, 60, 80):
    print(f"  留 {y:>2} 个 -> {expected_revenue(y):>8.1f}")
print(f"\n试遍所有留法:最好是留 {best} 个,期望收入 {expected_revenue(best):.1f}")
prob = lambda y: sum(1 for d in late if d > y) / len(late)
print(f"留 {best} 个时,晚到乘客人数超过 {best} 的概率是 {prob(best):.3f};留 {best - 1} 个时是 {prob(best - 1):.3f};{LOW} ÷ {HIGH} = {LOW / HIGH:.3f}")

输出:

留给晚到乘客的座位数 -> 期望收入
  留  0 个 ->  54000.0
  留 20 个 ->  64000.0
  留 30 个 ->  67926.8
  留 40 个 ->  69902.4
  留 45 个 ->  70158.5
  留 50 个 ->  69926.8
  留 60 个 ->  68000.0
  留 80 个 ->  62000.0

试遍所有留法:最好是留 45 个,期望收入 70158.5
留 45 个时,晚到乘客人数超过 45 的概率是 0.366;留 44 个时是 0.390;300 ÷ 800 = 0.375

留多少座位给晚到的高价乘客

  • 一个都不留,全按 300 元卖:54000。
  • 留 45 个:期望收入最高,70158.5。留得更多或更少,都更差。
  • 规则:多留一个座位,是值得的,只要"晚到的人多于这个座位"的概率 × 800 元,大于现在卖掉能得到的 300 元。最后一行验证了:留 45 个时这个概率是 0.366,略小于 300 ÷ 800 = 0.375;留 44 个时是 0.390,略大于 0.375。到了 45 个,再多留一个就不划算了。 这是航空业收益管理里的经典规则,叫 Littlewood 规则(Littlewood 1972):保留座位,直到"晚到高价乘客超出保留数的概率",等于低价与高价的比值。

注意这里用的是 02 讲的老思路:多留一个座位,边际收益是 800 × 它被用上的概率,边际成本是现在就卖掉的 300 元。

6.3 反过来:为什么有时也更便宜

第 2 讲里,我们让旅行团用 300 元买下 10 个空座位,因为这些座位如果空着,就一分钱也赚不到,而多载一个人只多花 100 元。如果距离起飞很近,飞机还有大量空座,卖掉一个座位,不会挤掉任何更高价的乘客,这时降价促销,就是对的。所以,“临近起飞,机票是涨还是降”,取决于还剩多少空座,以及预计还会有多少愿意出高价的人。两种现象都真实存在。

6.4 证据与争议

证据怎么说:Borenstein 和 Rose 1994 年(Journal of Political Economy,102 卷 4 期)用 1986 年美国航空的数据发现:同一条航线上,两个乘客的票价,预期相差约为该航空公司平均票价的 36%;这样大的差别,不能简单地用成本差别来解释。他们还发现一个出人意料的结果:竞争更激烈的航线,价格差别反而更大,他们的解读是,当竞争出现,航空公司更多地根据"顾客愿意换航班的程度"来区分顾客。

分歧在哪:Gerardi 和 Shapiro 2009 年(Journal of Political Economy,117 卷 1 期)用 1993 到 2006 年的面板数据,得到了相反的结果:竞争降低价格差别,符合教科书的预期,尤其是在顾客需求弹性差别更大的航线上。他们认为,之前的结论,是因为没有控制住各条航线、各家航空公司不随时间变的特点(遗漏变量)。这又是第 4 讲的教训:同一个问题,换一种数据结构、换一种估计办法,结论会变。

七、数字产品:边际成本为零的世界

7.1 成本结构

软件、音乐、视频、游戏、文章、App:做第一份,成本很高(研发、拍摄、写作);多一个人用,几乎不花钱,边际成本约等于 0。

这就是第 11 讲的"固定成本大、边际成本小",和第 14 讲缆车的自然垄断,是同一种成本结构:平均成本一路下降。如果按边际成本定价(= 0),连固定成本都收不回来。所以几乎所有的数字产品,都会想办法差别化:做版本,做免费版,做订阅。

7.2 版本化与免费增值

  • 版本化:同一个软件,做个人版和企业版,做基础版和专业版。和航空公司的经济舱、商务舱是一个逻辑:愿付价高的人,用更多功能,付更多钱;设计的关键,是别让愿付价高的人"降级"。
  • 免费增值(freemium):基础功能免费,高级功能付费。因为边际成本约等于 0,多一个免费用户几乎不亏钱,而免费用户可能转为付费用户,也可能带来更多的用户(对别的用户更有价值,这是第 17 讲会讲的网络效应)。这在实物商品上,很难做到:每多一个免费用户,都要多花一份成本。

7.3 打包和订阅

为什么视频网站是按月订阅,而不是每部剧单独卖?

先看一个手算的例子。两样内容(剧集 A、体育直播 B),两个用户,边际成本是 0:

对 A 的愿付价 对 B 的愿付价 打包的愿付价
小王 8 3 11
小李 3 8 11
  • 分开卖:A 定 8(只有小王买,收入 8),或定 3(两人都买,收入 6),所以定 8;B 同理定 8。总收入 16。
  • 打包卖:两人对整包的愿付价都是 11,打包价定 11,两人都买,总收入 22。

打包赢了。原因:小王和小李"口味相反",对单样内容的愿付价差很大;加在一起,两人对整包的愿付价一样。愿付价差别被"抹平"了,卖家就不需要在"高价少卖"和"低价多卖"之间做取舍。(如果两人的口味一致,比如小王对 A 和 B 都愿付 8、小李都愿付 3,打包就没有优势。)

内容越多,这个效应越强。Bakos 和 Brynjolfsson 1999 年(Management Science,45 卷 12 期)用大数定律论证:打包的内容越多,用户对整包的愿付价越集中(不容易特别高也不容易特别低),卖家越容易找到一个让几乎所有人都买的价格。我们用一个玩具模拟来看:10000 个用户,每人对每样内容的愿付价在 0 到 1 之间随机,彼此互不相关,边际成本为 0。

import numpy as np

# 数字内容:复制的成本是 0。10000 个用户,每人对每一样内容的愿付价在 0 到 1 之间随机(各人各样互不相关)。
# 比较:每样内容分开卖,和 N 样内容打包成一个订阅卖。
rng = np.random.default_rng(15)
USERS = 10000

def best_price(values):
    """试遍每个可能的价格(取每个用户的愿付价),选收入最大的"""
    v = np.sort(values)[::-1]
    revenue = v * np.arange(1, len(v) + 1)            # 价格定在第 k 高的愿付价,就有 k 个人买
    k = int(np.argmax(revenue))
    return v[k], k + 1, revenue[k]

print("包里有 N 样内容 -> 每样内容的平均收入 | 买的人占比 | 内容的价值被用掉的比例")
for n in (1, 2, 5, 20, 100):
    wtp = rng.random((USERS, n))
    bundle = wtp.sum(axis=1)                          # 愿付价可以相加:每样内容的价值独立
    price, buyers, revenue = best_price(bundle)
    realized = bundle[bundle >= price].sum() / bundle.sum()     # 买的人拿到的价值 ÷ 全部可能的价值
    print(f"  N = {n:>3} -> {revenue / USERS / n:.3f} | {buyers / USERS:.0%} | {realized:.0%}")

输出:

包里有 N 样内容 -> 每样内容的平均收入 | 买的人占比 | 内容的价值被用掉的比例
  N =   1 -> 0.257 | 48% | 73%
  N =   2 -> 0.274 | 69% | 83%
  N =   5 -> 0.311 | 82% | 89%
  N =  20 -> 0.377 | 92% | 94%
  N = 100 -> 0.432 | 97% | 98%

打包越多,收入越高,价值也被用得越充分

  • N = 1 就是"分开卖":每样内容的平均收入 0.257(理论值是 0.25:价格定在 0.5 元,一半的人买),买的人约一半,价值被用掉约 73%(理论值 75%)。模拟和理论基本吻合。
  • N 越大:每样内容的平均收入越高(到 N = 100 时是 0.432),买的人越来越多(97%),内容的价值被用上的比例也越高(98%)。

注意这里有一个有意思的地方:打包让卖家赚得更多,同时让"价值被用掉"的比例更高(更多的人买得起)。这是数字产品里价格策略可能"既提高利润又提高效率"的例子。(总剩余里,多出来的部分最后归谁,另当别论。)

局限:这个结果依赖强假设:边际成本约等于 0(所以"没用的内容"也不花成本);用户对不同内容的愿付价互不相关、可以相加;愿付价大小差不多。有研究者指出,这个结论对假设相当敏感。对实物商品,打包里每多一样东西都有成本,这个好处就消失了。

小结: 数字产品的边际成本约为 0、固定成本大,所以几乎都在做差别化:版本化(和舱位菜单同理),免费增值(免费给愿付价低的人几乎不亏钱),订阅打包(让愿付价的差别被抹平)。

八、个性化定价与"大数据杀熟"

8.1 一个正在发生的争议

如果卖家掌握了你的位置、历史购买、设备、浏览记录,它就能越来越接近一级价格歧视:猜出你个人的最高愿付价,对你单独定价。这叫个性化定价。

在中国,一个常被提起的现象叫"大数据杀熟":同一件商品,老用户看到的价格,比新用户高。它之所以引起争议,是因为很多人觉得"忠诚的老顾客,反而被收更高的价"。

理论预测什么:数据越多、算法越准,企业越能把价格定在每个人愿付价附近,企业利润上升,消费者剩余下降。但不是每个人都吃亏:愿付价低的人,可能反而价格更低。

证据怎么说:Dubé 和 Misra 2023 年(Journal of Political Economy,131 卷 1 期)研究了招聘平台 ZipRecruiter 的一项随机定价实验。他们估计:把统一价格调到最优,利润可以提高 55%;再做个性化定价,又能在最优统一价格的基础上,多提高 19%。个性化定价下,消费者总剩余比最优统一价格低 23%,但超过 60% 的消费者,价格比统一价格更低;在一些"厌恶不平等"的福利标准下,总福利甚至可能上升。作者也提醒:限制数据的使用,未必能改善消费者福利。

要说明的局限:这是一家公司(对象是企业客户,不是个人消费者)的实验,不能直接推到电商、打车、外卖等领域。至于中国的"杀熟",据我查到的资料,公开的材料多是个案和用户的测试,覆盖面广、方法严谨的系统性证据不多。如果你想深入,请自己多查几份来源。

法律怎么说:《个人信息保护法》(2021 年 11 月 1 日起施行)第 24 条规定,个人信息处理者利用个人信息进行自动化决策,应当保证决策的透明度和结果公平、公正,不得对个人在交易价格等交易条件上实行不合理的差别待遇。《互联网信息服务算法推荐管理规定》(2022 年 3 月 1 日起施行)第 21 条也有类似的规定:不得根据消费者的偏好、交易习惯等特征,利用算法在交易价格等交易条件上实施不合理的差别待遇。(具体条文请以现行法律文本为准。)

分歧在哪:关键的词是"不合理"。学生票、新用户优惠、会员价,也是"对不同的人收不同的价",为什么多数人觉得合理?而老用户加价,为什么觉得不合理?有学者指出,法律对"不合理"没有清楚的界定,个案里很难认定和举证。另一个分歧是:限制数据的使用,保护了隐私,但可能也让一部分原本买得到的人买不到(比如愿付价低的人)。

价值判断:这里有三种价值互相拉扯:公平(同样的东西,同样的价格)、效率(让更多人买得到)、隐私(我的数据不该被拿来给我定价)。该优先哪个,留给你自己判断。

九、局限与常见的误用

9.1 这些模型的局限

  • 我们假设卖家知道需求。 现实里,企业不知道每类顾客的需求曲线,要靠试验和猜测(上一讲也是这样)。
  • 我们假设顾客不会反感。 顾客发现自己比别人付得多,可能不满,甚至放弃购买(第 39 讲会讲人对"公平"的感受)。这是企业为什么常把价格差别包装成"会员价"“优惠券”。
  • 我们假设只有一家卖家。 几家企业互相竞争时,价格歧视会怎样变,第 16 讲会讲。
  • 静态。 现实里,今天的价格会影响明天的顾客预期(等降价再买)。

9.2 常见的误用

误用 正确的想法
“价格不一样,就是价格歧视” 成本不同引起的价差(比如运费)不算;要看价差是否超过成本差
“价格歧视一定是坏事” / “一定是好事” 取决于是否让更多人买到(总产出是否增加),以及谁赢谁输。总产出不增加,总福利一定下降
“一级价格歧视没有损失,所以没问题” 没有无谓损失,但全部剩余归了卖家:效率和公平是两个问题
“便宜的版本,是为了让穷人买得起” 常常是为了开拓市场,也为了让愿付价高的人不降级,不一定是善意
“只有垄断者才能价格歧视” 只要有一点定价能力,加上能区分顾客,就可以。航空公司是竞争加差异化
“数字产品免费,是做慈善” 边际成本约为 0,免费给愿付价低的人几乎不亏,还能带来转化和用户
“两部制的单价就该等于边际成本” 顾客不同时,最优单价可能高于边际成本

十、小结

这一讲有六个想法,请带走:

  1. 价格歧视:同一种商品,价格差别超过成本差别。需要三个条件:有定价能力、能区分顾客、能阻止转售。
  2. 一级(对每人收最高价):没有无谓损失,但全部剩余归卖家。
  3. 三级(按群体定价):愿付价高、需求缺乏弹性的一类,价格高。总产出增加是总福利增加的必要条件;让原来买不起的人买到,才可能提高总福利。
  4. 二级(菜单,让顾客自己选):设计让不同顾客自愿对号入座的版本;代价是信息租金;“栅栏"是常用的手段。
  5. 两部制和打包:入场费 + 使用费;顾客不同时,最优的使用费可能高于边际成本。数字产品边际成本约为 0,所以版本化、免费增值、订阅打包都很常见。
  6. 个性化定价是争议的前沿:它让价格歧视趋近一级。是否"合理”,是事实、效率、公平、隐私之间的权衡。

到这里,我们看了市场势力的一个极端:一家企业,没有对手。但现实里更常见的情形是:几家企业,彼此都看着对方。你降价,我要不要跟?我们要不要悄悄约定价格?这就是下一讲:第 16 讲:寡头。 你会看到,当企业的决定互相影响,我们就需要一种新的工具:博弈论的第一次登场。

思考题

1. 山顶水店的三类游客,如果学生的最高愿付价是 5 元(而不是 4 元),其他不变。统一价格会变吗?三级价格歧视,对学生定多少价?

提示:统一价格仍是 6 元(定 6 元利润 1600;若降到 5 元让学生也买,每类每降 1 元多买 50 瓶,三类合计,利润只有 3 × 500 = 1500,更低)。学生仍买不起。三级歧视:MR = 5 − 0.04 Q = 2,Q = 75,价格 = 5 − 75 ÷ 50 = 3.5 元。

2. 三级歧视的结果里,三类游客的价格分别是 7、5、3 元。验证:每一类的加价率(价格 − 边际成本)÷ 价格,是否等于该类人在这个价格上的弹性的倒数?

提示:弹性 = 50 × 价格 ÷ 买的数量。登山客:50 × 7 ÷ 250 = 1.4,加价率 5 ÷ 7 = 0.714 = 1 ÷ 1.4。普通游客:50 × 5 ÷ 150 = 1.667,加价率 3 ÷ 5 = 0.6 = 1 ÷ 1.667。学生:50 × 3 ÷ 50 = 3,加价率 1 ÷ 3 = 0.333 = 1 ÷ 3。弹性越大(越容易放弃),价格越低。

3. 航空公司的菜单题(4.2 节)。如果商务旅客对商务舱的愿付价,从 550 降到 450(其他数字不变)。商务舱最多能定多少?菜单的利润是多少?和"只卖经济舱 250"、“只卖商务舱"相比呢?

提示:商务旅客买商务舱要保证剩余不低于买经济舱的剩余 300 − 250 = 50,所以商务舱最多定 450 − 50 = 400。利润:休闲旅客买经济舱 100 × 150 = 15000;商务旅客买商务舱 100 × (400 − 200) = 20000;合计 35000。对比:只卖经济舱 250,两类都买,30000;只卖商务舱 450(只有商务旅客买),100 × (450 − 200) = 25000。菜单最好。

4. 游乐园里,如果所有游客都是"爱玩的”(q = 20 − 2p,100 人,边际成本 2 元),最好的两部制是什么?利润是多少?和只定每次价格相比呢?

提示:每次的价格 = 边际成本 2 元,每人玩 16 次,入场费 = 全部剩余 ½ × 16 × 8 = 64,利润 64 × 100 = 6400。只定每次价格:MR = 10 − q = 2,q = 8,价格 6,每人利润 (6 − 2) × 8 = 32,合计 3200。两部制是它的两倍。

5. 判断下面几个是不是价格歧视,是哪一种,有没有合理的理由。(a)电影院的学生票。(b)快递按距离收不同的运费。(c)外卖平台的"满 30 减 5"优惠券。(d)新用户首单免费。

提示:(a)是三级(按群体),学生愿付价更低、也容易验证身份;常被认为合理,因为让更多人看得起。(b)基本不算:成本随距离增加,价差主要反映成本差。(c)是二级(自选择):愿意凑单、花时间找券的人,往往对价格更敏感,满减让他们自己"对号入座"。(d)是区分新旧用户的一种做法,可以看作三级,但也可能是争取新用户的"投资"(动态的考虑);当老用户反而被收更高的价,就进入了第八节的"杀熟"争议。答案不唯一,重点是说出理由。

参考与延伸

  • Pigou, A. C. (1920). The Economics of Welfare. Macmillan.
  • Schmalensee, R. (1981). Output and Welfare Implications of Monopolistic Third-Degree Price Discrimination. American Economic Review.
  • Varian, H. R. (1985). Price Discrimination and Social Welfare. American Economic Review.
  • Leslie, P. (2004). Price Discrimination in Broadway Theater. RAND Journal of Economics, 35(3), 520–541.
  • Oi, W. Y. (1971). A Disneyland Dilemma: Two-Part Tariffs for a Mickey Mouse Monopoly. Quarterly Journal of Economics, 85(1), 77–96.
  • Littlewood, K. (1972). Forecasting and Control of Passenger Bookings. AGIFORS Symposium Proceedings.
  • Borenstein, S., & Rose, N. L. (1994). Competition and Price Dispersion in the U.S. Airline Industry. Journal of Political Economy, 102(4), 653–683.
  • Gerardi, K. S., & Shapiro, A. H. (2009). Does Competition Reduce Price Dispersion? New Evidence from the Airline Industry. Journal of Political Economy, 117(1), 1–37.
  • Bakos, Y., & Brynjolfsson, E. (1999). Bundling Information Goods: Pricing, Profits, and Efficiency. Management Science, 45(12), 1613–1630.
  • Dubé, J.-P., & Misra, S. (2023). Personalized Pricing and Consumer Welfare. Journal of Political Economy, 131(1).
  • 《中华人民共和国个人信息保护法》(2021)第二十四条;《互联网信息服务算法推荐管理规定》(2022)第二十一条。