这是第二个实验。第 9 讲,我们用手算,和一小段代码,看到了:税,让买家付的,和卖家收的,差出一块"楔子";楔子,让一部分交易,消失,这就是无谓损失;谁承担税,取决于弹性。这个实验,要做的,是把它们,变成一个能反复用的数值工具,然后,用它,去问手算,不太好回答的问题。
怎么用:和实验 70 一样,代码块,是接着往下写的:后面的块,会用到,前面块里定义的东西。把它们依次拼成一个文件(比如,lab71.py),运行;也可以,一段一段,在 Python 里依次运行。只需要 Python 3 和 NumPy;全部,运行,约 2 秒。每个块下面的"输出",是我真实跑出来的。
一、三个问题
先停一下:请先凭直觉,回答下面三个问题。
问题 1: 一个市场,每件征税 1 元,无谓损失,是 5。如果,改成,每件征税 2 元,无谓损失,是多少?
问题 2: 税,越高,税收,是不是,越多?
问题 3: 政府,要筹一笔钱,可以,对两种商品征税:一种,需求缺乏弹性(比如,盐),一种,需求富有弹性(比如,某个品牌的饮料)。该多税哪一种?多税,能省下多少无谓损失?
先写下你的猜测。我们,会,一个一个,回来。
二、实验的设计
2.1 一个"市场",是什么
用两条反需求曲线,来定义一个市场:想让第 Q 件成交,买家,最高,愿付 Pd(Q);卖家,最低,要 Ps(Q)。我们,用两类曲线:
- 直线(第 9 讲):需求 Q = Q0 + b_d (P0 − P);供给 Q = Q0 + b_s (P − P0)。
- 不变弹性:需求 Q = Q0 (P/P0)^(−e_d);供给 Q = Q0 (P/P0)^(e_s)。弹性,在整条曲线上,都是 e_d、e_s(e_s = ∞:成本不变,价格,固定在 P0)。
征税之前,均衡在:价格 P0 = 10,数量 Q0 = 100。
2.2 怎么算
- 征税之后的成交量:解方程"买家付的 = 卖家收的 + 税",用二分法(找一个,让左边减右边,等于 0 的 Q)。
- 谁承担:买家多付的,÷ 税;
- 税收:税 × 成交量;
- 无谓损失:那些,“原来成交、现在不成交"的件(从新的成交量,到 Q0),买家的愿付价,减卖家的成本,加起来。用梯形法,做数值积分。(对直线,一份就精确;对弯的曲线,份数越多,越准。)
三、第一步:一个通用的数值工具
import numpy as np
P0, Q0 = 10.0, 100.0 # 征税之前的均衡:价格 10,数量 100(和第 9 讲一样)
class Market:
"""一个市场,由两条"反需求曲线"定义:想让第 Q 件成交,买家,最高愿付 Pd(Q);卖家,最低要 Ps(Q)。"""
def __init__(self, pd, ps, name=""):
self.pd, self.ps, self.name = pd, ps, name
def linear(b_d, b_s):
"""直线的需求和供给。需求:Q = Q0 + b_d (P0 − P);供给:Q = Q0 + b_s (P − P0)。"""
return Market(lambda q: P0 + (Q0 - q) / b_d, lambda q: P0 + (q - Q0) / b_s, f"直线(b_d={b_d}, b_s={b_s})")
def const_elast(e_d, e_s):
"""不变弹性的需求和供给。需求:Q = Q0 (P/P0)^(−e_d);供给:Q = Q0 (P/P0)^e_s。e_s = ∞:供给,完全有弹性(价格,固定在 P0)。"""
ps = (lambda q: P0 * np.ones_like(q)) if np.isinf(e_s) else (lambda q: P0 * (q / Q0) ** (1 / e_s))
return Market(lambda q: P0 * (q / Q0) ** (-1 / e_d), ps, f"不变弹性(e_d={e_d}, e_s={e_s})")
def solve_tax(m, tax, kind="specific"):
"""二分法,解出,征税之后的成交量。specific:每件征 tax 元;ad valorem:按卖家得到的价格的 tax 比例,加征。
均衡的条件:买家付的 = 卖家收的 + 税。"""
wedge = (lambda q: m.ps(q) + tax) if kind == "specific" else (lambda q: m.ps(q) * (1 + tax))
lo, hi = 1e-9, Q0 * 3
for _ in range(200):
mid = (lo + hi) / 2
if m.pd(mid) > wedge(mid): lo = mid # 买家,还愿意多付:成交量,可以更大
else: hi = mid
return (lo + hi) / 2
def analyse(m, tax, kind="specific", n=20000):
q = solve_tax(m, tax, kind)
p_buy, p_sell = float(m.pd(q)), float(m.ps(q) + tax if kind == "specific" else m.ps(q) * (1 + tax))
# 无谓损失:那些"原来成交、现在不成交"的件(从 q 到 Q0)上,买家愿付价 − 卖家成本,之和(梯形法,数值积分)
qs = np.linspace(q, Q0, n + 1)
gap = m.pd(qs) - m.ps(qs)
dwl = float(np.sum((gap[:-1] + gap[1:]) / 2 * np.diff(qs)))
return dict(q=q, buyer_pays=p_buy, seller_gets=m.ps(q), revenue=(p_buy - m.ps(q)) * q,
buyer_share=(p_buy - P0) / (p_buy - m.ps(q)), dwl=dwl)
# 一、核对:用第 9 讲的四种直线市场(每件征税 1 元),和手算的结果比较
print("一、核对第 9 讲的四种情形(直线的需求和供给,每件征税 1 元)")
print(f" {'':<28}{'买家承担':>8}{'成交量':>8}{'税收':>7}{'无谓损失':>9}{' 手算:0.5 × 税 × 少成交的量':>24}")
for name, bd, bs in (("A 需求缺乏弹性、供给富有弹性", 5, 20), ("B 需求富有弹性、供给缺乏弹性", 20, 5), ("C 两边都富有弹性", 20, 20), ("D 两边都缺乏弹性", 5, 5)):
r = analyse(linear(bd, bs), 1.0)
print(f" {name:<22}{r['buyer_share']:>8.0%}{r['q']:>8.1f}{r['revenue']:>7.1f}{r['dwl']:>9.3f}{0.5 * 1.0 * (Q0 - r['q']):>18.3f}")
# 二、数值积分,要切多细?用一个有精确答案的例子:直线市场,征税 3 元
m = linear(5, 5); exact = 0.5 * 3.0 * (Q0 - solve_tax(m, 3.0))
print(f"\n二、数值积分的精度(直线市场,每件征税 3 元;精确的无谓损失 = {exact:.6f})")
for n in (2, 10, 100, 10000):
print(f" 切成 {n:>5} 份:{analyse(m, 3.0, n=n)['dwl']:.6f}")
mc = const_elast(1.0, 1.0)
print(" 不变弹性市场(e_d = e_s = 1,每件征税 3 元,没有精确的公式):" + ",".join(f"{n} 份 → {analyse(mc, 3.0, n=n)['dwl']:.6f}" for n in (10, 100, 10000, 200000)))
输出:
一、核对第 9 讲的四种情形(直线的需求和供给,每件征税 1 元)
买家承担 成交量 税收 无谓损失 手算:0.5 × 税 × 少成交的量
A 需求缺乏弹性、供给富有弹性 80% 96.0 96.0 2.000 2.000
B 需求富有弹性、供给缺乏弹性 20% 96.0 96.0 2.000 2.000
C 两边都富有弹性 50% 90.0 90.0 5.000 5.000
D 两边都缺乏弹性 50% 97.5 97.5 1.250 1.250
二、数值积分的精度(直线市场,每件征税 3 元;精确的无谓损失 = 11.250000)
切成 2 份:11.250000
切成 10 份:11.250000
切成 100 份:11.250000
切成 10000 份:11.250000
不变弹性市场(e_d = e_s = 1,每件征税 3 元,没有精确的公式):10 份 → 20.270601,100 份 → 20.265063,10000 份 → 20.265007,200000 份 → 20.265007
逐段看:
- 核对:第 9 讲的四种直线市场,每件征税 1 元:买家承担,80%、20%、50%、50%;成交量,96.0、96.0、90.0、97.5;无谓损失,2.000、2.000、5.000、1.250:和手算(“0.5 × 税 × 少成交的量”),完全一致。
- 数值积分的精度:对直线,梯形法,几份,都是,精确的(11.25);对弯的曲线(不变弹性),10 份,得 20.2706,100 份,20.2651,10000 份,20.2650,200000 份,20.2650:切到几千份,已经,稳定到小数点后第 4 位。(这是数值方法的常规检验:加密,看,数字,还动不动。)
四、第二步:税额翻一倍,无谓损失,翻几倍;税收,会不会先升后降
# 一、税,越高,无谓损失,增长得越快:不变弹性的市场(需求弹性 2,供给弹性 2),每件征税 t 元
m = const_elast(2.0, 2.0)
print("一、税额翻一倍,无谓损失,变成几倍?(需求弹性 = 供给弹性 = 2;P0 = 10)")
print(f" {'每件税 t':>9}{'t / P0':>8}{'成交量':>8}{'税收':>8}{'无谓损失':>9}{'无谓损失 ÷ 税收':>14}{'比上一行,变成几倍':>18}")
prev = None
for t in (0.1, 0.2, 0.4, 0.8, 1.6, 3.2, 6.4):
r = analyse(m, t)
ratio = f"{r['dwl'] / prev:>18.2f}" if prev else f"{'—':>18}"
print(f" {t:>9.1f}{t / P0:>8.1%}{r['q']:>8.1f}{r['revenue']:>8.1f}{r['dwl']:>9.3f}{r['dwl'] / r['revenue']:>14.1%}{ratio}")
prev = r["dwl"]
print(" 小税的时候,翻一倍,无谓损失,约变成 4 倍(和 t² 成正比);税越高,增长的倍数,越小(税基,被越缩越小)。")
# 二、税收,会不会,先升后降?(拉弗曲线):供给完全有弹性(成本不变)的情形,可以手算:税收峰值,在 t = P0 / (e_d − 1)
print("\n二、税收,随税额的变化:峰值,在哪里?(在 0 到 60 之间,每 0.05 一格,找最大值)")
print(f" {'市场':<28}{'税收的峰值':>10}{'峰值在 t =':>11}{'手算:P0/(e_d−1)':>18}")
grid = np.arange(0.05, 60.001, 0.05)
for name, ed, es in (("需求富有弹性 2,供给完全有弹性", 2.0, np.inf), ("需求弹性 3,供给完全有弹性", 3.0, np.inf), ("需求缺乏弹性 0.5,供给完全有弹性", 0.5, np.inf), ("需求弹性 2,供给弹性 2", 2.0, 2.0)):
mk = const_elast(ed, es)
revs = [analyse(mk, t, n=2)["revenue"] for t in grid]
k = int(np.argmax(revs))
hand = f"{P0 / (ed - 1):>18.2f}" if ed > 1 and np.isinf(es) else f"{'—':>18}"
peak_note = "(还在上升:没有峰值)" if k == len(grid) - 1 else ""
print(f" {name:<24}{revs[k]:>10.1f}{grid[k]:>11.2f}{hand} {peak_note}")
print(" 需求缺乏弹性(e_d = 0.5):税,加到 60(价格的 6 倍),税收,还在上升,买家,几乎,没有地方,可以逃;需求有弹性(e_d > 1):税,加到一定程度,税基,缩得太快,税收,反而,下降(供给完全有弹性时,峰值,在 t = P0 ÷ (e_d − 1))。")
输出:
一、税额翻一倍,无谓损失,变成几倍?(需求弹性 = 供给弹性 = 2;P0 = 10)
每件税 t t / P0 成交量 税收 无谓损失 无谓损失 ÷ 税收 比上一行,变成几倍
0.1 1.0% 99.0 9.9 0.050 0.5% —
0.2 2.0% 98.0 19.6 0.197 1.0% 3.97
0.4 4.0% 96.1 38.4 0.779 2.0% 3.95
0.8 8.0% 92.3 73.9 3.033 4.1% 3.89
1.6 16.0% 85.2 136.4 11.496 8.4% 3.79
3.2 32.0% 72.7 232.7 41.253 17.7% 3.59
6.4 64.0% 53.3 341.0 132.722 38.9% 3.22
小税的时候,翻一倍,无谓损失,约变成 4 倍(和 t² 成正比);税越高,增长的倍数,越小(税基,被越缩越小)。
二、税收,随税额的变化:峰值,在哪里?(在 0 到 60 之间,每 0.05 一格,找最大值)
市场 税收的峰值 峰值在 t = 手算:P0/(e_d−1)
需求富有弹性 2,供给完全有弹性 250.0 10.00 10.00
需求弹性 3,供给完全有弹性 148.1 5.00 5.00
需求缺乏弹性 0.5,供给完全有弹性 2267.8 60.00 — (还在上升:没有峰值)
需求弹性 2,供给弹性 2 384.9 11.55 —
需求缺乏弹性(e_d = 0.5):税,加到 60(价格的 6 倍),税收,还在上升,买家,几乎,没有地方,可以逃;需求有弹性(e_d > 1):税,加到一定程度,税基,缩得太快,税收,反而,下降(供给完全有弹性时,峰值,在 t = P0 ÷ (e_d − 1))。
逐段看:
- 回答问题 1:约 4 倍。(需求弹性 = 供给弹性 = 2)税额,从 0.1,到 0.2,到 0.4,到 0.8:无谓损失,0.050、0.197、0.779、3.033:每翻一倍,变成 3.97、3.95、3.89 倍。无谓损失,和税额的平方,成正比(这就是 Harberger 三角形的面积:底,是少成交的量,和税成正比;高,是税;面积,和税的平方,成正比)。所以,问题 1 的答案:5 × 4 = 20(只对小税,大致成立)。
- 税越高,增长的倍数,越小:税额,从 3.2,到 6.4,倍数,只有 3.22:因为,税基,被越缩越小;成交量,已经,从 100,降到 53.3;无谓损失,已经,占,税收的 38.9%。
- 回答问题 2:不一定。税收,随税额,先升后降(拉弗曲线):需求,富有弹性的市场(e_d = 2,供给,完全有弹性),税收的峰值,在 t = 10.00(税收 250.0);手算:峰值,在 t = P0 ÷ (e_d − 1) = 10 ÷ 1 = 10,吻合。e_d = 3,峰值,在 t = 5.00(手算:10 ÷ 2 = 5,吻合);需求弹性 2、供给弹性 2:峰值,在 11.55。
- 需求缺乏弹性(e_d = 0.5):税,加到 60(价格的 6 倍),税收,还在上升:买家,没有地方,可以逃。
- 这和第 42 讲的"漏桶”,是同一个想法:税,越高,税基,缩得越快;那里,峰值,在 1 ÷ (1 + e);这里,是,需求一侧的、类似的结论。
五、第三步:按件征税,和按价格的比例征税;归宿的公式,什么时候,准
# 按件征税,和按价格的比例征税,有区别吗?在竞争的市场里:楔子(买家付的 − 卖家收的),一样,结果就一样。
m = const_elast(2.0, 2.0)
r1 = analyse(m, 2.0, "specific")
tau = 2.0 / r1["seller_gets"] # 对应的"按卖家收到的价格,加征"的比例
r2 = analyse(m, tau, "ad valorem")
print(f"每件征税 2 元:成交 {r1['q']:.3f},买家付 {r1['buyer_pays']:.3f},卖家收 {r1['seller_gets']:.3f},税收 {r1['revenue']:.2f}")
print(f"按卖家价格的 {tau:.4%} 征税:成交 {r2['q']:.3f},买家付 {r2['buyer_pays']:.3f},卖家收 {r2['seller_gets']:.3f},税收 {r2['revenue']:.2f}(两种税,完全一样)")
# 但是:同样"名义"的税率,意思,不一样。把"按件"的 2 元,换成"10 元的 20%":
r3 = analyse(m, 0.20, "ad valorem")
print(f"\n如果,直接,按 20% 征税(不是 2 元):买家付 {r3['buyer_pays']:.3f},卖家收 {r3['seller_gets']:.3f},楔子 = {r3['buyer_pays'] - r3['seller_gets']:.3f}(不是 2 元,因为,卖家的价格,降了,20% 的基数,也跟着,降了)")
# 谁承担:比较"小税的公式"和"数值解"。公式:买家承担 = e_s / (e_s + e_d)
print("\n买家承担的比例:公式(小税)vs 数值解(每件征税 t 元)")
print(f" {'e_d':>5}{'e_s':>6}{'公式':>7}" + "".join(f"{'t = ' + str(t):>10}" for t in (0.1, 1.0, 3.0, 6.0)))
for ed, es in ((0.5, 2.0), (2.0, 0.5), (1.0, 1.0), (0.5, 0.5), (2.0, 2.0), (1.0, 3.0)):
row = f" {ed:>5.1f}{es:>6.1f}{es / (es + ed):>7.0%}"
for t in (0.1, 1.0, 3.0, 6.0):
row += f"{analyse(const_elast(ed, es), t, n=2)['buyer_share']:>10.1%}"
print(row)
print(" 税很小的时候,公式很准;税,变大,买家承担的比例,会,偏离公式(需求和供给,是弯的,不是直线,弹性,沿着曲线,在变)。")
输出:
每件征税 2 元:成交 81.900,买家付 11.050,卖家收 9.050,税收 163.80
按卖家价格的 22.0998% 征税:成交 81.900,买家付 11.050,卖家收 9.050,税收 163.80(两种税,完全一样)
如果,直接,按 20% 征税(不是 2 元):买家付 10.954,卖家收 9.129,楔子 = 1.826(不是 2 元,因为,卖家的价格,降了,20% 的基数,也跟着,降了)
买家承担的比例:公式(小税)vs 数值解(每件征税 t 元)
e_d e_s 公式 t = 0.1 t = 1.0 t = 3.0 t = 6.0
0.5 2.0 80% 80.1% 80.8% 82.1% 83.9%
2.0 0.5 20% 20.1% 20.8% 22.7% 26.2%
1.0 1.0 50% 50.1% 51.2% 53.7% 57.3%
0.5 0.5 50% 50.1% 51.2% 53.7% 57.3%
2.0 2.0 50% 50.1% 51.2% 53.7% 57.3%
1.0 3.0 75% 75.1% 75.9% 77.6% 79.7%
税很小的时候,公式很准;税,变大,买家承担的比例,会,偏离公式(需求和供给,是弯的,不是直线,弹性,沿着曲线,在变)。
逐段看:
- 按件 vs 按比例:每件征税 2 元:成交 81.900,买家付 11.050,卖家收 9.050,税收 163.80。如果,按卖家收到的价格的 22.0998% 征税:完全一样。这就是第 9 讲的结论:决定结果的,是"楔子",不是,税是按什么形式,规定的。
- 名义的税率,要小心:直接,按 20% 征税,楔子,只有 1.826(不是 2 元),因为,卖家的价格,降了,20% 的基数,也跟着降了。
- 归宿的公式:买家承担 = e_s ÷ (e_s + e_d)。税很小(t = 0.1,价格的 1%)时,公式,很准:e_d = 0.5、e_s = 2:公式 80%,数值 80.1%。税,变大,偏离,越来越大:t = 6(价格的 60%):80% 变成 83.9%;e_d = e_s = 1:公式 50%,数值,57.3%。弯的需求和供给,弹性,沿着曲线,会变(需求,在价格,升高之后,变得,更有弹性),公式,只对小税,成立。
六、第四步:再多收 1 元的税,要付出多少
筹钱的成本,不只是"税收本身":每多收 1 元,社会,还要,多付出,一点额外的无谓损失。这个额外的部分,叫边际超额负担(MEB);1 + MEB,叫公共资金的边际成本。(Edgar Browning 1976 年,Journal of Political Economy,84 卷 2 期,283–298 页,是较早,估计它的研究:据摘要,对美国劳动收入税,估出了,约 1.09 到 1.16 的结果,取决于税制变化的累进程度。)
# 边际超额负担:再多筹 1 元的税收,要多损失多少效率?MEB = d(无谓损失) / d(税收)。(需求弹性 2,供给完全有弹性,P0 = 10)
m = const_elast(2.0, np.inf)
print("再多收 1 元的税,要多损失多少?(数值微分:把税额,加一点点,看,无谓损失,和税收,各增加多少)")
print(f" {'每件税 t':>9}{'t / P0':>8}{'税收':>8}{'无谓损失':>9}{'MEB':>7}{'1 + MEB':>9}{'手算 2τ/(1−τ)':>16}")
for t in (0.1, 0.5, 1.0, 2.0, 4.0, 6.0, 8.0):
h = 1e-4
a, b = analyse(m, t - h), analyse(m, t + h)
meb = (b["dwl"] - a["dwl"]) / (b["revenue"] - a["revenue"])
r = analyse(m, t)
tau = t / P0
hand = 2.0 * tau / (1 - tau) # 需求弹性 = 2、成本不变时,可以手算:DWL = P0·Q0·τ²/(1+τ)²,税收 = P0·Q0·τ/(1+τ)²,两者对 τ 求导,相除
print(f" {t:>9.1f}{tau:>8.0%}{r['revenue']:>8.1f}{r['dwl']:>9.2f}{meb:>7.2f}{1 + meb:>9.2f}{hand:>16.2f}")
print(" 1 + MEB(这里,也叫'公共资金的边际成本'):每多收 1 元的税,社会,要付出,1 元之外的、额外的代价。税越高,这个代价,越大;到了税收的峰值(τ = 100%,也就是 t = 10),再多收 1 元,要付出的,是无穷大。")
输出:
再多收 1 元的税,要多损失多少?(数值微分:把税额,加一点点,看,无谓损失,和税收,各增加多少)
每件税 t t / P0 税收 无谓损失 MEB 1 + MEB 手算 2τ/(1−τ)
0.1 1% 9.8 0.10 0.02 1.02 0.02
0.5 5% 45.4 2.27 0.11 1.11 0.11
1.0 10% 82.6 8.26 0.22 1.22 0.22
2.0 20% 138.9 27.78 0.50 1.50 0.50
4.0 40% 204.1 81.63 1.33 2.33 1.33
6.0 60% 234.4 140.63 3.00 4.00 3.00
8.0 80% 246.9 197.53 8.00 9.00 8.00
1 + MEB(这里,也叫'公共资金的边际成本'):每多收 1 元的税,社会,要付出,1 元之外的、额外的代价。税越高,这个代价,越大;到了税收的峰值(τ = 100%,也就是 t = 10),再多收 1 元,要付出的,是无穷大。
逐段看:
- 数值微分:把税额,加一点点(±0.0001),看,无谓损失,和税收,各变多少,相除。
- 手算(需求弹性 2,成本不变):无谓损失 = P0·Q0·τ²/(1+τ)²,税收 = P0·Q0·τ/(1+τ)²;两者,对 τ 求导,相除:MEB = 2τ/(1−τ)。数值解,和手算,在每一行,都吻合到小数点后两位:t = 1(τ = 10%):MEB = 0.22;t = 2(20%):0.50;t = 4(40%):1.33;t = 8(80%):8.00。
- 读法:税,很小的时候,MEB,很小(τ = 1%:0.02),每多收 1 元,只多损失 2 分;税,到了 40%,每多收 1 元,要多损失 1.33 元;到了税收的峰值(τ = 100%),无穷大。所以,筹钱,要把税,分散到很多的税基上,而不是,把一个税,加得很高。
- 一个,常被提到的数字:1 + MEB,大于 1:政府,花 1 元的"税收",社会,付出的,要多于 1 元。所以,公共支出,要有,大于 1 的、被收益,补偿的回报(第 34 讲:财政政策)。
七、第五步:要筹一笔钱,该多税谁(Ramsey 的问题)
Frank Ramsey 1927 年(《税收理论的一个贡献》,Economic Journal),问了这个问题:要筹一笔,给定的钱,对不同的商品,征税,怎么分摊,社会损失最小?一个,常被引用的特例,叫逆弹性法则:如果,各个需求之间,互不影响,供给完全有弹性,最优的税率,应该,和需求的弹性,成反比:需求,越缺乏弹性,越应该多税。(据一位作者的考证,Ramsey 的原文,用的是,“供给弹性和需求弹性,倒数之和”,这个,更一般的形式;逆弹性法则,是它的特例。)
我们,用数值方法,验证:商品 1,需求缺乏弹性(0.5);商品 2,需求富有弹性(2.0);供给,都完全有弹性;总共,要筹 100。
# 要筹一笔钱(总税收 = 100),对两种商品征税:商品 1,需求缺乏弹性(0.5);商品 2,需求富有弹性(2.0)。供给都完全有弹性(成本不变,P0 = 10)。
# 怎么分摊,总的无谓损失,最小?(Ramsey 1927 的问题)
m1, m2 = const_elast(0.5, np.inf), const_elast(2.0, np.inf)
R_TARGET = 100.0
def tax_for_revenue(m, R):
"""二分法:找到,让某个商品的税收,等于 R 的税额(在税收,还在上升的那一段)。"""
lo, hi = 0.0, 8.0
for _ in range(100):
t = (lo + hi) / 2
if analyse(m, t, n=2)["revenue"] < R: lo = t
else: hi = t
return (lo + hi) / 2
print(f"要筹 {R_TARGET:.0f} 的税收。方案:商品 1 筹 R1,商品 2 筹 R2 = {R_TARGET:.0f} − R1")
print(f" {'R1(商品 1)':>12}{'R2':>7}{'t1':>7}{'t2':>7}{'无谓损失(1)':>13}{'(2)':>8}{'合计':>8}")
best = None
rows = []
for R1 in np.arange(0, R_TARGET + 0.1, 5.0):
R2 = R_TARGET - R1
t1 = tax_for_revenue(m1, R1) if R1 > 0 else 0.0
t2 = tax_for_revenue(m2, R2) if R2 > 0 else 0.0
d1 = analyse(m1, t1)["dwl"] if t1 > 0 else 0.0
d2 = analyse(m2, t2)["dwl"] if t2 > 0 else 0.0
rows.append((R1, R2, t1, t2, d1, d2, d1 + d2))
if best is None or d1 + d2 < best[6]: best = rows[-1]
for r in rows:
if r[0] in (0.0, 25.0, 50.0, 75.0, 100.0) or r is best:
tag = " ← 最小" if r is best else ""
print(f" {r[0]:>12.0f}{r[1]:>7.0f}{r[2]:>7.2f}{r[3]:>7.2f}{r[4]:>13.2f}{r[5]:>8.2f}{r[6]:>8.2f}{tag}")
# 对照:两种商品,同样的税率(t1/P0 = t2/P0),筹同样的钱
lo, hi = 0.0, 8.0
for _ in range(100):
t = (lo + hi) / 2
if analyse(m1, t, n=2)["revenue"] + analyse(m2, t, n=2)["revenue"] < R_TARGET: lo = t
else: hi = t
t_u = (lo + hi) / 2
du = analyse(m1, t_u)["dwl"] + analyse(m2, t_u)["dwl"]
print(f"\n同样的税额(两种商品,每件都是 {t_u:.3f}):合计,无谓损失 {du:.2f};最优分摊:{best[6]:.2f},省了 {1 - best[6] / du:.1%}")
print(f"最优分摊:商品 1(缺乏弹性):税 {best[2]:.2f}({best[2] / P0:.1%} 的价格),商品 2(富有弹性):税 {best[3]:.2f}({best[3] / P0:.1%})")
tau1, tau2 = best[2] / P0, best[3] / P0
print(f"逆弹性法则(小税时):τ/(1+τ) 应该,和 1/e 成正比:τ1/(1+τ1) ÷ τ2/(1+τ2) = {tau1 / (1 + tau1) / (tau2 / (1 + tau2)):.2f};e2 ÷ e1 = {2.0 / 0.5:.2f}")
输出:
要筹 100 的税收。方案:商品 1 筹 R1,商品 2 筹 R2 = 100 − R1
R1(商品 1) R2 t1 t2 无谓损失(1) (2) 合计
0 100 0.00 1.27 0.00 12.70 12.70
25 75 0.25 0.89 0.16 6.67 6.83
50 50 0.51 0.56 0.62 2.79 3.41
75 25 0.78 0.26 1.41 0.66 2.06
80 20 0.83 0.21 1.60 0.42 2.02 ← 最小
100 0 1.05 0.00 2.50 0.00 2.50
同样的税额(两种商品,每件都是 0.533):合计,无谓损失 3.24;最优分摊:2.02,省了 37.7%
最优分摊:商品 1(缺乏弹性):税 0.83(8.3% 的价格),商品 2(富有弹性):税 0.21(2.1%)
逆弹性法则(小税时):τ/(1+τ) 应该,和 1/e 成正比:τ1/(1+τ1) ÷ τ2/(1+τ2) = 3.76;e2 ÷ e1 = 4.00
逐段看:
- 回答问题 3:多税需求缺乏弹性的商品。全部,由商品 2(富有弹性)来筹:无谓损失,12.70;商品 1,筹 80、商品 2,筹 20:无谓损失,2.02;全部,由商品 1 筹:2.50。
- 和"同样的税额"相比:两种商品,每件,都征 0.533,筹同样的 100:无谓损失,3.24;最优的分摊,省了 37.7%。
- 最优的税率:商品 1(缺乏弹性):8.3% 的价格;商品 2(富有弹性):2.1%。
- 逆弹性法则:τ/(1+τ) 的比值:3.76;弹性的反比:4.00。(接近,但不相等:法则,只对"税很小",才精确;这里,要筹 100,占了,总税基的 5%,已经不算很小。)
- 要小心:Ramsey 的结论,只考虑效率。盐、粮食这类,需求,缺乏弹性的商品,常常,是,穷人,花销的更大一部分:多税它们,可能,让税,更不公平。这是,第 9 讲,第 7 节,“效率,还是公平"的问题:经济学,能算出,效率的代价;你,要不要,为了公平,付这个代价,是价值判断。
八、第六步:弹性,估不准,归宿,会有多不准
真实的政策里,弹性,不是,已知的,是估计的,有误差。把它,当成不确定的,看,结论,有多散。
# 弹性,估不准,归宿,也就不准。把弹性,当作"不确定的":抽 3000 组,看,买家承担的比例,有多散。
rng = np.random.default_rng(71)
e_d = np.exp(rng.normal(np.log(0.8), 0.5, 3000)) # 需求弹性:中位数 0.8,对数的标准差 0.5
e_s = np.exp(rng.normal(np.log(1.0), 0.5, 3000)) # 供给弹性:中位数 1.0
share_formula = e_s / (e_s + e_d)
share_numeric = np.array([analyse(const_elast(a, b), 1.0, n=2)["buyer_share"] for a, b in zip(e_d, e_s)]) # 每件征税 1 元(10%)
q10, q50, q90 = np.percentile(share_numeric, [10, 50, 90])
print(f"需求弹性:中位数 0.8(10%–90% 分位 {np.percentile(e_d, 10):.2f}–{np.percentile(e_d, 90):.2f});供给弹性:中位数 1.0({np.percentile(e_s, 10):.2f}–{np.percentile(e_s, 90):.2f})")
print(f"买家承担的比例(每件征税 1 元):中位数 {q50:.0%},10%–90% 分位 {q10:.0%}–{q90:.0%}")
print(f" 买家承担,超过一半的概率:{np.mean(share_numeric > 0.5):.0%};超过 70% 的概率:{np.mean(share_numeric > 0.7):.0%};低于 30% 的概率:{np.mean(share_numeric < 0.3):.0%}")
print(f" 公式(e_s/(e_s+e_d))和数值解,平均相差:{np.mean(np.abs(share_formula - share_numeric)) * 100:.1f} 个百分点")
print(" 只知道'弹性,大概在这个范围',能得出的,不是'买家承担 X%',而是,一个,很宽的范围;这是,在,真实的政策里,'谁在付税',很难,有,一个精确答案的原因。")
输出:
需求弹性:中位数 0.8(10%–90% 分位 0.43–1.49);供给弹性:中位数 1.0(0.53–1.92)
买家承担的比例(每件征税 1 元):中位数 57%,10%–90% 分位 35%–77%
买家承担,超过一半的概率:66%;超过 70% 的概率:22%;低于 30% 的概率:5%
公式(e_s/(e_s+e_d))和数值解,平均相差:1.1 个百分点
只知道'弹性,大概在这个范围',能得出的,不是'买家承担 X%',而是,一个,很宽的范围;这是,在,真实的政策里,'谁在付税',很难,有,一个精确答案的原因。
逐段看:
- 设定:需求弹性,中位数,0.8(10%–90% 分位,0.43 到 1.49);供给弹性,中位数,1.0(0.53 到 1.92);抽 3000 组。
- 结果:买家承担的比例,中位数 57%,10%–90% 分位,35% 到 77%。超过一半的概率,66%;超过 70% 的,22%;低于 30% 的,5%。
- 读法:只知道"弹性,大概,在这个范围”,能得出的,不是“买家承担 X%",而是,一个,很宽的范围。所以,真实的政策讨论里,“谁在付税”,常常,没有,一个精确的答案;估计的区间,要和,点估计,一起,报告。
- 公式,和数值解,平均,相差,1.1 个百分点:弹性的不确定,比,“公式不精确”,重要得多。
九、这个实验,说明了什么,没说明什么
说明了:
- 一个,通用的数值工具(二分法,加梯形积分),就能,复现,第 9 讲,手算的结论,并回答,手算,不方便回答的问题;
- 无谓损失,随税额的平方,增长(税,翻一倍,损失,约 4 倍);所以,多个,低税率的税,比一个,高税率的税,更好;
- 税收,有峰值(需求有弹性时);峰值,在 P0 ÷ (e_d − 1);
- 每多收 1 元的税,代价,越来越大(MEB = 2τ/(1−τ));
- 效率的角度,该多税,需求缺乏弹性的商品(Ramsey),能省下,三分之一以上的无谓损失;
- 弹性的不确定,直接,变成,归宿的不确定。
没有说明:
- 公平:Ramsey 的结论,可能,让税,更不公平(第 9 讲,第 7 节);哪个更重要,是价值判断;
- 外部性:如果,一种商品,有负的外部性(第 23 讲),对它征税,可能,提高总剩余(庇古税),“无谓损失”,不再是,纯粹的损失;
- 其他市场:我们,只看了,一个、两个,互相独立的市场;真实的税,会,影响,别的市场(劳动、储蓄):据转述,Goulder 和 Williams 的研究,认为,忽略,这些,会,低估,商品税的超额负担;
- 收入效应:我们,用的是,直接给定的需求曲线;
- 税收,怎么花:我们,假设,税收,等值地,被花掉。
和后面的联系:第 13 讲,社保缴费,由雇主和雇员,分担,归宿,取决于,劳动,供给和需求的弹性;第 23 讲,庇古税;第 34 讲,财政政策;第 42 讲,再分配的"漏桶”。
十、练习
1. 把需求弹性,改成 4(供给,完全有弹性),税收的峰值,在哪里?峰值的税收,是多少?
提示:手算:峰值,在 t = P0 ÷ (e_d − 1) = 10 ÷ 3 ≈ 3.33(τ = 1/3);税收 = P0·Q0·τ(1+τ)^(−4) = 1000 × (1/3) × (4/3)^(−4) ≈ 105.47。数值:峰值,在 3.35(网格,0.05),税收,105.47。(需求,越有弹性,峰值,越低。)
2. 直线的市场,b_d = b_s = 10,每件征税 2 元。先手算:成交量、买家付的、卖家收的、税收、无谓损失;再用 analyse(linear(10, 10), 2.0) 核对。
提示:少成交的量 = 税 ÷ (1/b_d + 1/b_s) = 2 ÷ 0.2 = 10,成交 90;买家,多付 1,付 11;卖家,少收 1,收 9;税收 2 × 90 = 180;无谓损失 = 0.5 × 2 × 10 = 10;买家承担 50%。
3. 不变弹性市场(e_d = e_s = 2),每件征税 1 元。找出,等价的"按卖家收到的价格的 τ",并验证,两者,结果一样。
提示:每件征税 1 元:卖家,收 9.5125,成交 90.49;τ = 1 ÷ 9.5125 ≈ 10.51%;
analyse(m, 0.1051, "ad valorem"),得,同样的成交量,同样的买家价和卖家价。(注意:不是,10%:基数,变了。)
4. 需求弹性 2、成本不变:税率 τ 是多少的时候,MEB = 1(每多收 1 元的税,要多损失 1 元的效率)?
提示:2τ/(1−τ) = 1,τ = 1/3,即 t = 3.33;数值核对:t = 3.33 处,MEB = 0.9985,约等于 1。(也就是,在,大约,三分之一的税率之上,多收 1 元,社会,要付出 2 元。)
5. 把第七节的商品 1 的需求弹性,从 0.5,改成 1.0(商品 2,仍是 2.0)。最优的分摊,会怎么变?比同样的税额,省多少?
提示:(运行结果)最优:商品 1 筹 65,商品 2 筹 35;税率,7.0% 和 3.8%;无谓损失,3.53,同样的税额,4.00,省 11.7%(原来,是 37.7%)。两种商品,弹性,越接近,“分摊”,省得越少。逆弹性的比值:1.79(弹性之比 2.00)。
6. (开放题)一个国家,要提高税收,可以,提高,盐、烟、酒的税(需求,缺乏弹性),也可以,提高,所得税。请用这个实验的结果,说明:(a)效率的角度,该怎么选;(b)哪些,是事实,哪些,是价值判断。
提示:(a)效率:盐、烟、酒,需求缺乏弹性,同样的税收,无谓损失,更小(Ramsey);而且,税基,不容易,逃;(b)事实:弹性有多大、无谓损失有多少,可以,用数据和这样的模型,估计;价值判断:这些税,对穷人,是不是更重(公平);烟酒,有负的外部性(第 23 讲),税,也许,本身,就是,好事;“该不该,用税,改变,人们的选择”(第 39 讲:家长主义)。
十一、局限
- 局部均衡:一个、或两个,互相独立的市场;
- 需求和供给,是直接给定的(没有,从偏好和技术,推出来),没有,收入效应;
- 弹性,是假设的,不是,估计的;真实的弹性,要靠,实证研究(第 4 讲);
- 税,是,对"每件",或"按价格",征的;没有,免税额、累进税率等;
- 数值精度:二分法 200 次,梯形法,2 万份(有的,是 2 份,对直线,精确);对非常陡的曲线,要,加密;
- 没有动态:长期的弹性,比短期,大(第 9 讲);这里,没有区分。
参考
- Harberger, A. C. (1964). The Measurement of Waste. American Economic Review(卷期页,没有核对)。
- Ramsey, F. P. (1927). A Contribution to the Theory of Taxation. Economic Journal(卷期页,没有核对)。
- Browning, E. K. (1976). The Marginal Cost of Public Funds. Journal of Political Economy, 84(2), 283–298.
- Goulder 和 Williams 关于,忽略一般均衡效应,会,低估超额负担的研究(据转述;题目、年份、卷期页,都没有核对)。