很多人第一次碰 LM 曲线公式推导,都是在纸上抄一遍M/P = kY - hi,然后改成i = (kY - M/P)/h,抄完就觉得自己会了。真到做题、跑模拟、给数据做政策敏感性分析的时候,才发现问题全在细节里:利率到底该用 5 还是 0.05、货币供给要不要除价格、斜率的 k 和 h 谁是分子、曲线往左移还是往右移、为什么同一个政府购买乘数在不同参数下能差三倍。这篇就把 LM 曲线公式推导从头到尾拆一遍——它的假设、货币需求三动机怎么变成数学、均衡条件怎么解、斜率 k/h 的经济学含义、三大特殊区域怎么用参数复现,再配一套可以直接跑的代码做敏感性测试。适合正在啃宏观经济学 IS-LM 那几章的学生、需要给课件做动态图示的讲师,以及要给政策情景做粗算的分析岗朋友。看完你手里应该有一份能复现、能改参数、能自证对错的完整方案,而不是一张抄来的公式。
1. 先把 LM 曲线的研究边界划清楚
1.1 它描述的是货币市场,不是商品市场
LM 曲线最容易讲混的地方,是很多人把它和 IS 混成一锅粥。说清楚一句话:IS 曲线管商品市场均衡(产出等于总需求),LM 曲线管货币市场均衡(货币需求等于货币供给)。两者都是在一个"利率 i 为纵轴、产出 Y 为横轴"的坐标系里画的,所以才能联立求交点。LM 曲线上的每一个点,都代表一个使货币市场出清的 (Y, i) 组合,注意是"组合",不是某个确定值。这一点是后面所有推导的地基。
为什么坐标轴要这么设?因为货币需求同时取决于收入 Y 和利率 i。收入越高,人们做交易需要的货币越多;利率越高,持有货币的机会成本越大,人们越愿意把钱拿去买生息资产。所以给定一个货币供给量,要让市场出清,Y 和 i 必须配合着变:Y 上去了,货币需求被推高,得靠 i 上升来压制一部分需求,市场才重新平衡。这条"配合关系"的轨迹就是 LM 曲线,它天然是右上倾斜的。
我见过不少人把 LM 曲线理解成"利率决定产出"或者"产出决定利率",这两种说法都偏了。它是均衡条件的几何表达,本身不构成因果关系。因果关系要放到 IS-LM 联立、或者更完整的模型中才有意义。你先把这个心态摆正,后面推导的时候就不容易把内生的 i 和外生的 M 搞反。
再补一句实操层面的提醒:教科书里的 LM 曲线,货币供给 M 和价格水平 P 都是给定的外生变量。所以严格说,你画出来的是一条"特定 (M, P) 下的 LM 曲线"。M 或 P 一变,整条曲线平移,而不是沿着曲线滑动。沿着曲线滑动只由 Y 和 i 引起。这个区分在画图和写代码的时候必须精确,否则图像会画错。
1.2 标题里"微观理论"这个标签其实是个分类误会
原始标题把一个 LM 曲线公式推导的内容挂在了"经典微观理论"的分类下,这事儿在各类经管学习社区里相当常见,属于标签误挂的典型。LM 曲线是标准的宏观经济学内容,属于凯恩斯主义框架下的 IS-LM 模型,研究的是总量层面的货币市场均衡,跟微观经济学里消费者效用最大化、厂商成本最小化那套个体决策逻辑不是一回事。
为什么这种误挂会反复出现?因为学习社区的分类体系往往是按"学科—课程—章节"三层建的,管理员建目录时容易把"经济学基础""理论经济学"这类宽泛标签往下乱分配;再加上流动性偏好理论里确实借用了微观的资产选择思路(在货币和债券之间做取舍),所以看着有那么点像。但从分析对象看,LM 讨论的是价格水平给定条件下的总货币需求与总货币供给,这是宏观的、总量的、短期分析的范畴。
这个误标对学习的实际影响不小。你要是按微观的框架去理解 LM,很容易卡在"为什么货币需求是收入的函数"这个问题上——微观里个体的货币持有是个资产配置问题,跟总收入没关系;而宏观里的货币需求是加总后的交易性需求,跟整个经济的交易规模正相关。两种逻辑不能直接套。我的建议是:看到这类社区内容,先别管标签,直接去核对它所在的章节体系,确认它讲的是 IS-LM,再决定用哪套前置知识去对接。标签只是检索入口,不是内容判据。
顺带说一句,这类社区词条的一个通病是"公式给了、推导跳步、参数不说单位"。你在上面看到的i = (kY - M/P)/h,十个里有八个不告诉你 h 的量纲怎么定、i 该代百分数还是小数。后面第 4 节我会专门讲这个坑,它是初学者出错率最高的一处。
2. 公式推导的完整链条:从三条动机到一个方程
2.1 三个前提假设和符号约定,先把地基打平
推导之前必须把假设摆明,不然推出来的东西适用范围说不清。标准 LM 推导依赖这么几条:
- 价格水平 P 短期给定,不随产出变动。这是短期分析的核心假设,也是 LM 曲线能画出来的前提。P 一旦内生化,你就得进 AD-AS 框架了。
- 货币供给 M 由货币当局外生给定,不随利率变动。也就是说供给曲线是垂直的。
- 只存在货币和债券两种资产,债券是货币的唯一替代品。这条假设让"利率"成为唯一的机会成本变量,简化得很粗暴但很有效。
- 货币需求稳定,即函数形式 L(·) 在分析期内不变。
符号约定这块我建议你一开始就固定下来,别中途换:
| 符号 | 含义 | 常用单位 |
|---|---|---|
| Y | 实际产出(实际收入) | 元(或亿元) |
| i | 名义利率 | 百分数(如 5 表示 5%) |
| M | 名义货币供给 | 元 |
| P | 价格水平 | 指数,基准期=1 或 100 |
| M/P 或 m | 实际货币供给(实际货币余额) | 元 |
| k | 货币需求的收入敏感系数 | 无量纲 |
| h | 货币需求的利率敏感系数 | 元 / 百分点 |
| L | 实际货币需求 | 元 |
这张表看着啰嗦,但它能挡掉后面一半的错误。特别是 k 和 h 的单位——k 是"收入每增加 1 元,货币需求增加多少元",所以是无量纲的比例;h 是"利率每上升 1 个百分点,货币需求减少多少元",单位是元/百分点。很多人推的时候没管单位,代数字的时候就乱套,最后算出来的利率是 0.055 却当成 5.5% 用,整个结果差 100 倍。这种错我在帮人看作业时见过不止一次。
还有一条隐含假设值得单独提:货币需求用的是实际余额,不是名义余额。这一点在 2.3 节会展开,因为它是整个推导里被跳步跳过最多的地方。教材上经常一句话"由货币市场均衡可得",中间那步"为什么要除 P"就没了,学生照着抄,抄完也不知道为什么。
2.2 货币需求函数:凯恩斯三动机是怎么变成数学的
凯恩斯的流动性偏好理论说,人们持有货币有三个动机:交易动机、预防动机、投机动机。要把这三条变成式子,得分别处理。
交易动机和预防动机都跟收入正相关。你收入越高,日常买卖的量越大,需要备着的现金越多;同时应对意外的备用金也跟着水涨船高。所以这两部分合并写成L1 = kY,k 大于 0。这里 k 的倒数 1/k 有个直观解释:它是"货币流通速度"的一种简化表达——k 越小,同样的收入只需要越少的货币来支撑交易,钱转得越快。这个联系值得记住,后面做政策分析时能帮你判断参数取得合不合理。
投机动机跟利率负相关。逻辑是:利率是持有货币的机会成本。利率越高,你把钱放成债券能拿的收益越多,就越不愿意揣着现金;反过来利率低到一定程度,债券价格已经很高,大家预期未来利率只会往上走、债券价格只会跌,这时候谁都不愿意买债券,宁可持有现金。写成L2 = -hi,h 大于 0。
两部分加起来:
L = kY - hi, k > 0, h > 0这个式子是线性的,是个极大的简化。真实世界的货币需求对利率的反应是非线性的,尤其在利率接近零的时候会出现明显的平坦化(这就是流动性陷阱的微观基础)。但线性形式好在能解出闭式解,教学和分析起步阶段用它完全够用。如果你要做更贴近现实的模拟,可以把-hi换成-h·ln(i)或者其他凸函数,思路是一样的,只是没有漂亮的解析解,只能数值求解。
这里有个细节很多人推错:h 前面的负号不能丢,也不能把 h 定义为负数再写加号。两种写法数学上等价,但混用会出事。我建议统一成"h 为正、式子里带负号",因为后面解斜率的时候 k/h 的正负号判断会直观很多。你要是习惯把 h 写成负值,那斜率就是 k/h 为负,虽然数学没错,但跟教材上的图形对不上,容易自己把自己绕晕。
2.3 货币供给为什么一定要除以价格水平
这一步是跳步重灾区。货币市场均衡的条件,严格写是"名义货币供给 = 名义货币需求"。但需求函数 L = kY - hi 里的 Y 是实际产出,不是名义产出。如果左边用名义货币 M,右边用实际产出推出来的需求,两边量纲不一致,等式不成立。
所以必须统一到同一口径。做法是把两边都换成实际口径:名义货币供给 M 除以价格水平 P,得到实际货币供给m = M/P;货币需求 L 本来就是按实际余额定义的。均衡条件变成:
M/P = kY - hi为什么除 P 而不是乘 P?你可以这么理解:价格水平翻倍,同样的名义货币能买到的东西只有原来一半,实际购买力减半。所以名义货币的实际价值跟 P 成反比,除。而货币需求是人们为了交易需要持有的"实际购买力",价格涨了,完成同样一笔实际交易需要的名义货币翻倍,但如果需求函数已经用实际口径表达,就不需要再调整。
这一步的实际意义在于:它告诉你价格水平变动会平移 LM 曲线,而不是让它旋转。P 上升,M/P 下降,同样的 Y 下需要更高的 i 才能让市场出清,曲线左移。移动的距离可以精确算:给定 i 不变,由M/P = kY - hi可得Y = (M/P + hi)/k,所以 ΔY = Δ(M/P)/k。这个公式在分析通货膨胀的宏观效应时直接能用。
还有个常见的混淆:把 M 当成实际货币供给直接代入。如果题目给的是"名义货币供给 1000 亿,价格水平 2",你必须先算 m = 500 再进公式。我见过把 1000 直接代进去、最后算出的利率是正确值两倍的案例,检查了半天以为是斜率公式记错了,其实是漏了除 P。
2.4 联立求解:从均衡条件到标准形式
有了M/P = kY - hi,剩下的就是代数变形,把 i 解出来:
M/P = kY - hi hi = kY - M/P i = (kY - M/P) / h i = (k/h)·Y - (M/P)/h标准形式是i = (k/h)Y - m/h,其中 m = M/P。这个形式直接告诉你两件事:斜率是 k/h,纵轴截距是 -m/h。截距是负的,意味着曲线在 Y 轴上的交点在Y = m/k处(令 i = 0 解出来),这也是为什么 LM 曲线画出来通常从纵轴右侧某个位置起,而不是从原点起。
推导到这一步还没完,因为实际做题时经常给你的是 IS 曲线的形式,需要联立。我把它写完整,你自己验算一遍会踏实很多。设:
消费函数: C = a + b(Y - T) 投资函数: I = e - di 商品市场均衡: Y = C + I + G代入展开:
Y = a + b(Y - T) + e - di + G Y - bY = a - bT + e + G - di (1-b)Y = a - bT + e + G - di i = (a - bT + e + G - (1-b)Y) / d这就是 IS 曲线的 i 表达式。跟 LM 的i = (kY - m)/h联立:
(a - bT + e + G - (1-b)Y) / d = (kY - m) / h h(a - bT + e + G - (1-b)Y) = d(kY - m) h(a - bT + e + G) + dm = dkY + h(1-b)Y Y = [h(a - bT + e + G) + dm] / [dk + h(1-b)]这个式子值得抄下来。它把均衡产出直接写成了参数的函数,后面做政策乘数、做敏感性分析全靠它。分母dk + h(1-b)是整个体系的核心结构,它决定了财政政策和货币政策的相对效力。我在第 3 节会拿具体数字把这套东西跑一遍,那样比纯看公式清楚得多。
2.5 斜率 k/h 到底在说什么,以及三大区域怎么来的
斜率di/dY = k/h这个量,经济学含义是"产出每增加一单位,为了让货币市场重新出清,利率得上升多少"。三个参数各自的作用方向很好记:
| 参数变化 | 斜率 k/h 变化 | 曲线形态 | 直觉解释 |
|---|---|---|---|
| k 上升 | 变陡 | 更靠近垂直 | 收入敏感度高,Y 一动货币需求猛增,利率得大幅上调才能压回去 |
| h 上升 | 变平 | 更靠近水平 | 利率敏感度高,利率稍微一动就能调节货币需求,不需要大动 |
| h → ∞ | → 0 | 水平 | 流动性陷阱,利率对货币需求无弹性,任何 Y 都能在同一个 i 下出清 |
| h → 0 | → ∞ | 垂直 | 古典情形,货币需求只看收入,Y 决定一切,利率纯粹由货币供给决定 |
三大区域的划分就是这么来的,不是背出来的。凯恩斯区域是 h 趋于无穷的极端,LM 水平,此时货币政策完全失效(增加货币供给无法再压低利率),财政政策效果最大(没有挤出效应)。古典区域是 h 趋于零的极端,LM 垂直,此时财政政策完全挤出(政府支出增加只会推高利率,产出不变),货币政策效果最大。中间区域就是正常参数下的右上倾斜段。
这个链条往下还能接出一整套政策结论。LM 越陡,财政政策的挤出效应越大、效果越弱,货币政策效果越强;LM 越平,反过来。我在实际给非经济学背景的同事讲这套东西时,会用一个类比:LM 曲线就像一根弹簧,h 是弹簧的软硬程度。h 大(弹簧很软),你从收入端推一下,利率几乎不动,政府花钱的扩张效果能完整传导到产出上;h 小(弹簧很硬),收入刚一动利率就弹起来,把投资挤掉一大截,扩张效果被吃掉。
要注意的是,这三个区域是极限情形的划分,现实中你观察到的几乎总是中间区域,只是"更陡"或"更平"的区别。所以做题时看见"接近流动性陷阱"这类表述,不要真去取无穷大,取一个相对于 k 很大的 h 值就可以了,比如 k = 0.5、h = 5000,斜率 0.0001,画出来基本就是水平的。这种参数化处理比在数学上取极限更适合数值模拟,第 3.3 节会演示。
3. 动手实操:参数设定、Python 求解与敏感性测试
3.1 参数怎么定:一组能自洽、能复现的基准值
纸面推导完了,得让它跑起来。参数不能乱拍,得满足几个约束:一是 b 在 0 到 1 之间(边际消费倾向小于 1);二是 k 和 h 都为正;三是算出来的均衡 Y 和 i 要落在合理区间,不能出现负利率或者荒谬的产出。我先给一组基准值,后面所有实验都在这上面改:
# 基准参数 a = 100 # 自发消费 b = 0.8 # 边际消费倾向 T = 100 # 税收 e = 200 # 自发投资 d = 20 # 投资对利率的敏感度(元/百分点) G = 200 # 政府购买 k = 0.5 # 货币需求的收入敏感系数 h = 50 # 货币需求的利率敏感系数(元/百分点) M = 1000 # 名义货币供给 P = 2 # 价格水平这组数的来源不是随便拍。b = 0.8 对应边际储蓄倾向 0.2,是教材里最常用的量级;d = 20 意味着利率每降 1 个百分点,投资增加 20,相对于自发投资 200 来说是 10% 的弹性,属于中等敏感度;k = 0.5 对应货币流通速度约为 2(1/k),接近不少经济体的经验值;h = 50 和 k = 0.5 组合起来,斜率 k/h = 0.01,也就是产出增加 100 单位,利率上升 1 个百分点,这个量级在图上画出来是一条倾斜度适中、不贴边不竖直的线,便于后续观察变化。
实际货币供给 m = M/P = 500。代入均衡产出公式:
Y = [h(a - bT + e + G) + dm] / [dk + h(1-b)] = [50 × (100 - 80 + 200 + 200) + 20 × 500] / [20 × 0.5 + 50 × 0.2] = [50 × 420 + 10000] / [10 + 10] = [21000 + 10000] / 20 = 1550 i = (0.5 × 1550 - 500) / 50 = (775 - 500) / 50 = 5.5均衡解是 Y = 1550、i = 5.5%。这个结果必须验算一遍,不能直接信。验算方式是把 Y 和 i 代回商品市场看是否闭合:C = 100 + 0.8 × (1550 - 100) = 1260,I = 200 - 20 × 5.5 = 90,Y = C + I + G = 1260 + 90 + 200 = 1550,对上了。货币市场这边,L = 0.5 × 1550 - 50 × 5.5 = 775 - 275 = 500 = m,也对上了。两边同时成立,说明这组解是自洽的。
注意:这里 i 用的是百分数口径(5.5,不是 0.055),h 的单位是"元/百分点"。这个口径必须全程统一。如果你的数据源给的利率是小数值,那 h 要相应放大 100 倍,否则斜率会差两个数量级。这条在第 4 节还会再强调一次,因为它是最高频的错误。
3.2 代码实现:画曲线、求交点、看形态
光有数字不够,得把图形画出来,才知道曲线到底是陡是平。下面这段用 numpy 加 matplotlib,只依赖这两个库,可以直接跑:
import numpy as np import matplotlib.pyplot as plt def lm_output(i, m, k, h): """给定利率,求 LM 曲线上的产出 Y = (m + hi)/k""" return (m + h * i) / k def is_rate(Y, a, b, T, e, G, d): """给定产出,求 IS 曲线上的利率""" return (a - b * T + e + G - (1 - b) * Y) / d def solve_equilibrium(a, b, T, e, G, d, k, h, m): """解析解,返回均衡 Y 和 i""" Y = (h * (a - b*T + e + G) + d * m) / (d*k + h*(1-b)) i = (k * Y - m) / h return Y, i # 基准参数 a, b, T, e, d, G = 100, 0.8, 100, 200, 20, 200 k, h, M, P = 0.5, 50, 1000, 2 m = M / P Y_eq, i_eq = solve_equilibrium(a, b, T, e, G, d, k, h, m) print(f"均衡: Y = {Y_eq:.2f}, i = {i_eq:.2f}%") # 画图 Y_grid = np.linspace(0, 2500, 500) i_lm = (k * Y_grid - m) / h i_is = is_rate(Y_grid, a, b, T, e, G, d) plt.figure(figsize=(7, 5)) plt.plot(Y_grid, i_lm, label='LM: i=(kY-m)/h') plt.plot(Y_grid, i_is, label='IS') plt.scatter([Y_eq], [i_eq], color='black', zorder=5) plt.annotate(f'({Y_eq:.0f}, {i_eq:.2f})', (Y_eq, i_eq), textcoords='offset points', xytext=(10, 8)) plt.xlim(0, 2500); plt.ylim(0, 15) plt.xlabel('Y (实际产出)'); plt.ylabel('i (%)') plt.legend(); plt.grid(alpha=0.3); plt.tight_layout() plt.show()跑出来的图里,LM 是一条从左下往右上走的直线,在 Y = 1000 处穿过横轴(因为 i = 0 时 Y = m/k = 500/0.5 = 1000)。这个"横轴截距"的位置不是随手来的,它等于实际货币供给除以收入敏感系数,直观含义是"当利率被压到零,光靠交易需求能吃下多少货币供给对应的产出水平"。做流动性陷阱分析时这个点很关键。
IS 曲线在这组参数下斜率是-(1-b)/d = -0.2/20 = -0.01,跟 LM 的 +0.01 正好对称,交点落在中间偏右的位置。这个"对称"纯属参数凑巧,不是规律,你别把它当成标准结论。
画图这一步有个实用技巧:不要只画一条 LM,画一簇。把 M 分别取 800、1000、1200,同一张图上画三条 LM,你能一眼看到"货币供给增加,曲线右移"到底是什么样子,以及移动距离是不是均匀的。按公式 ΔY = Δm/k = ΔM/(P·k),M 每增加 200,m 增加 100,Y 右移 200。等距平移,很规整。这种视觉确认比背结论管用得多。
3.3 三个特殊区域的参数化处理
前面说三大区域是极限情形,实际画图时不能真取无穷,得用"相对大小"来逼近。做法是固定 k = 0.5 不变,只调 h,观察形态变化:
| 情形 | h 取值 | 斜率 k/h | 曲线形态 | 对应区域 |
|---|---|---|---|---|
| 流动性陷阱 | 5000 | 0.0001 | 近似水平 | 凯恩斯区域 |
| 正常情形 | 50 | 0.01 | 右上倾斜约 45 度视觉 | 中间区域 |
| 接近古典 | 0.5 | 1.0 | 陡峭,接近垂直 | 古典区域 |
代码上就是改一个数,然后重跑画图。以 h = 5000 为例,均衡产出会变成:
Y = [5000 × 420 + 20 × 500] / [20 × 0.5 + 5000 × 0.2] = [2100000 + 10000] / [10 + 1000] ≈ 2089 i = (0.5 × 2089 - 500) / 5000 ≈ 0.109%利率被压到接近零,产出比基准情形高了 500 多。这个结果的含义是:在流动性陷阱里,货币供给的扩张几乎全被"闲置的货币余额"吸收,利率降不下去,也就刺激不了投资,货币政策失效。你把 h 改成 5000、M 从 1000 加到 2000 试一下,会发现 Y 只从 2089 变到 2189 左右——整整 100 的增量来自 m 增加 500 除以 k = 0.5 的直接效应,利率那一环几乎没有贡献。这就是"货币政策在流动性陷阱中失灵"的数值表达。
反过来把 h 压到 0.5,斜率变成 1.0,产出对利率的敏感度极低,利率稍微一动就能吸收巨大的货币需求变化。这时候 M 增加 100,Y 只右移 200(因为 ΔY = Δm/k = 50/0.5 = 100,等等,这里要算清楚:M 从 1000 加到 1100,m 从 500 到 550,Δm = 50,ΔY = 50/0.5 = 100)。而利率会明显下降。这就接近古典情形:货币供给的变化几乎全部传导到利率上,产出效应主要靠投资利率弹性 d 来实现。
心得:做这类参数实验,一次只动一个参数,其余全部固定,然后把新旧结果并排放在一起看。同时动两三个参数,你根本分不清哪个变化是哪个参数引起的,很容易得出错误结论还以为自己发现了规律。
3.4 政策冲击实验:G 和 M 各动一下会怎样
有了可复现的基准,就可以做真正的政策分析了。先算两个乘数:
∂Y/∂G = h / [dk + h(1-b)] = 50 / 20 = 2.5 ∂Y/∂m = d / [dk + h(1-b)] = 20 / 20 = 1.0政府购买乘数是 2.5,货币供给乘数(对实际余额)是 1.0。对比一下:如果没有货币市场约束(也就是简单乘数模型),政府购买乘数是1/(1-b) = 5。现在只有 2.5,差的那 2.5 就是挤出效应——政府多花钱推高产出,产出推高货币需求,利率上升,投资被挤掉一部分,抵消了一半的扩张效果。
我把 G 从 200 加到 210 完整算一遍,你可以对着验:
Y = [50 × (100 - 80 + 200 + 210) + 20 × 500] / 20 = [50 × 430 + 10000] / 20 = [21500 + 10000] / 20 = 1575 i = (0.5 × 1575 - 500) / 50 = (787.5 - 500) / 50 = 5.75产出增加 25(正好是 10 × 2.5),利率从 5.5 升到 5.75。投资变化是-20 × 0.25 = -5,被挤掉了 5。剩余净效应 25 里,政府支出直接贡献 10,消费的连锁反应贡献一部分,投资减少扣掉 5。这道账能对上,说明模型内部逻辑一致。
再试货币政策:M 从 1000 加到 1100,m 从 500 到 550:
Y = [50 × 420 + 20 × 550] / 20 = [21000 + 11000] / 20 = 1600 i = (0.5 × 1600 - 550) / 50 = (800 - 550) / 50 = 5.0产出增加 50(Δm = 50 乘上乘数 1.0),利率降 0.5 个百分点。效果比财政政策明显(50 对 25),原因是这组参数下 LM 的斜率 0.01 比较平缓,货币扩张对利率的压制效果容易传导到投资。这个结论是参数依赖的,你换成 h = 0.5(陡峭 LM),同样的货币扩张效果就会大打折扣。所以千万别把"货币政策比财政政策有效"当成普适结论背下来,它成立与否完全取决于 k/h 和 d 的相对大小。
3.5 敏感性分析:写个小循环,把结论的稳健性测出来
单点比较不够,得看整个参数空间。下面这段代码把 h 从 1 扫到 500,记录每个 h 下财政乘数和货币乘数,一次性把"LM 陡峭程度如何影响政策效力"看清楚:
import numpy as np a, b, T, e, d, G, k = 100, 0.8, 100, 200, 20, 200, 0.5 m = 500 rows = [] for h in [1, 5, 10, 20, 50, 100, 200, 500]: denom = d*k + h*(1-b) mult_G = h / denom mult_m = d / denom mult_simple = 1 / (1 - b) # 无货币市场约束的简单乘数 crowd_out = mult_simple - mult_G # 挤出比例 rows.append((h, k/h, mult_G, mult_m, crowd_out)) print(f"{'h':>5} {'k/h':>8} {'财政乘数':>10} {'货币乘数':>10} {'挤出量':>10}") for r in rows: print(f"{r[0]:>5} {r[1]:>8.3f} {r[2]:>10.3f} {r[3]:>10.3f} {r[4]:>10.3f}")跑出来大致是这个格局:h = 1 时财政乘数只有 0.05 左右,挤出量接近 5(几乎完全挤出),货币乘数接近 1;h = 500 时财政乘数接近 5(几乎无挤出),货币乘数降到 0.2 附近。中间是一条平滑的过渡带。这张表把"LM 越陡财政政策越无效、货币政策越有效"这个定性结论直接量化了,比纯文字描述有力得多。
做这种扫描有个细节:别只打印结果,把参数和结果绑定在一起输出。我曾经因为表格里没写清哪个是 h、哪个是 k,回头分析的时候对着两份结果看了二十分钟才确认哪份是哪个。现在我的习惯是每行带上参数值,宁可表格丑一点。
4. 高频踩坑与排查实录
4.1 推导环节的五类典型错误
第一个坑是符号丢失。L = kY - hi里的负号在变形过程中很容易被吃成加号,一旦变成m = kY + hi,解出来的 i 就是负的,斜率也变负,整条曲线变成左上倾斜,图形全废。排查方法很简单:随便取一个 Y 代入,看算出的 i 是否随 Y 递增。如果递减,回去查符号。
第二个坑是漏除价格水平。前面讲过,M 是名义的,需求函数是实际的。我建议你养成一个机械动作:看到 M,先问一句"这是名义还是实际",然后立刻在旁边写m = M/P。
第三个坑是斜率公式记反。正确的是k/h,不是h/k。混淆的原因通常是记口诀时把"收入系数 k 在分子"这件事记反了。判断方式:k 增大应该让曲线更陡(因为收入对货币需求的推力更大,同样 Y 的增量需要更大的利率补偿),如果按 h/k 算,k 增大会让曲线变平,逻辑上说不通。
第四个坑是平移和滑动的混淆。M、P 变化导致整条线平移,Y、i 变化是沿曲线滑动。做题时看见"货币供给增加,利率下降",必须问清楚这是"给定 Y 下曲线左移导致 i 下降"还是"沿曲线移动"。两种描述在文字上很像,但含义完全不同。
第五个坑是把 IS-LM 交点当成经济会自动趋向的位置。交点只是均衡条件,实际经济能不能自动到那儿,涉及调整速度、预期、价格粘性等一堆问题,不是 IS-LM 两个方程能回答的。这一点在做政策解读时要特别小心,别把比较静态分析的结果说成"经济一定会怎样怎样"。
4.2 数值实现里的坑,以及怎么快速定位
代码这边的问题和纸面推导不太一样。第一个高频问题是利率口径不统一。数据里有的地方用 5.5,有的用 0.055,混在一起算,结果能差 100 倍。我的做法是全程统一用百分数,写代码时在函数文档里明确标注i 单位为百分数,输入前如果拿到的是小数就先乘 100。
第二个问题是除零和极端值。h 取很小的值时,k/h会爆掉,画图时纵轴范围设小了就看不见曲线。处理办法是把 ylim 设在 0 到 20 之间,超出部分自然裁掉,或者改用对数坐标。
第三个问题是浮点比较。判断"市场是否出清"时不要用L == m,要用abs(L - m) < 1e-6。我见过有人写了个验证函数,因为浮点误差永远返回 False,白白排查半天。
第四个问题比较隐蔽:参数改了但没重新计算派生量。比如你改了 P,但代码里 m 还是写死的 500,那所有结果都是错的。我的做法是把 m 定义成M / P这个表达式,而不是一个常数,每次运行时重新求值。这个习惯能省掉大量莫名其妙的 bug。
4.3 常见问题速查表
把上面这些整理成一张表,出问题的时候对着查:
| 现象 | 最可能原因 | 排查动作 |
|---|---|---|
| 算出的利率是负数或极大值 | 符号错误 / 单位不统一 / 漏除 P | 检查-hi的负号,检查 i 用百分数还是小数,检查 m 是否等于 M/P |
| LM 曲线左上倾斜 | 斜率符号搞反 | 确认 h > 0 且公式是- hi,不是+ hi |
| 曲线斜率跟预期差很多 | k 和 h 记反 | 用 k = 0.5、h = 50 手算斜率 0.01 对照 |
| 货币供给翻倍但产出几乎不动 | h 太小(LM 太陡) | 增大 h 再看,或检查是否误把 h 设成了小数值 |
| 财政乘数算出大于 1/(1-b) | 符号或分母算错 | 检查分母dk + h(1-b)是否漏项 |
| IS 和 LM 找不到交点 | 参数范围画得太窄 | 扩大 Y 轴的取值区间,或直接解析求解 |
| 交点算出来但代回不闭合 | 商品市场或货币市场有一边参数用错 | 分别验证 C + I + G 是否等于 Y、L 是否等于 m |
提示:这张表的使用顺序是"先验口径,再验符号,最后验参数"。绝大多数问题出在前两步,参数取错的反而少。别一上来就怀疑自己参数选得不好。
5. 这套推导还能怎么用,以及它的边界在哪
5.1 从封闭经济往外扩,需要改哪些方程
LM 推导的框架一旦立住,扩展起来就是加方程。比如要分析开放经济,得在货币市场里区分本币和外币资产,货币需求函数要拆成本币余额和外汇资产两部分,利率平价条件要补进来。这时候 LM 曲线的位置会同时受国内货币供给和汇率预期影响,曲线本身可能变成一条"带折点"的线。
再比如引入价格水平内生变动,LM 就不该单独看了,得进 AD-AS 框架。这时 LM 的平移(由 P 引起)会跟总供给曲线互动,决定最终的均衡价格和产出。操作上的区别是:封闭短期分析里 P 是参数,可以直接写死;价格内生后,P 变成待求解的变量,你得再加一条方程(通常是菲利普斯曲线或者总供给关系)。
还有一种常见扩展是把货币需求函数换成非线性的。比如用L = kY / i^α这种形式(α > 0),它的好处是天然能产生流动性陷阱的"渐近水平"形态,而不需要人为把 h 设成 5000。缺点是没有闭式解,得靠数值方法。真要这么改,前面那套解析求解的代码就不能用了,得换成scipy.optimize之类的数值求根。思路不变,工具换一下而已。
5.2 什么时候它够用,什么时候它是自欺欺人
这套东西的适用边界得说清楚,不然容易用出问题。它成立的场景是:短期、价格粘性、封闭经济、货币供给外生。在这几个条件下,它是一个内部一致、逻辑清晰、能给出定性判断和粗略定量结果的工具。教学、作业、初步的政策方向判断,用它完全没问题。
但它撑不住的地方也很明显。货币供给外生这个假设在现实中就站不住——现代金融体系里货币创造是内生的,很大程度上跟着信贷需求走,不是货币当局想给多少就给多少。我见过有人拿 IS-LM 去套现实中的降准效果,算出来说"货币供给增加 2%,产出应该增加多少多少",这种推演听听就行,别当真拿来用。真实经济的传导链条里有信贷渠道、预期渠道、资产负债表渠道,任何一条都能把 IS-LM 的结论扭得面目全非。
我的态度是:把 LM 当成一个思维工具,而不是预测工具。它的价值在于逼你把"货币需求取决于什么""政策效果取决于哪些参数"这些结构性问题想清楚,而不是在于它给出的那个具体的 Y 和 i 的数值。你手算一遍看出乘数是 2.5、知道它跟简单乘数 5 差在挤出效应上,这个理解过程本身就是目的。至于真实政策环境下产出到底涨多少,那得靠宏观计量的活儿,不是两支笔一张纸能解决的。
说到底,这套推导最实用的产出不是那个公式本身,而是你养成的几个习惯:看到任何货币量先分清名义实际、看到参数先想清单位量纲、看到结论先问它在什么参数下成立。这几个习惯迁移到别的模型上也一样能用。
我自己的体会是,LM 曲线这东西真正的难点不在数学,它就是个一元一次方程。难在把每一步的经济含义和数学形式对上号——负号对应机会成本、除 P 对应实际购买力、k/h 对应敏感的对比。这套对应关系一旦建立起来,你再看任何一本教材上的 LM 章节,会发现其实所有版本说的都是同一件事,只是符号和缩写不一样。反过来,如果一开始就跳步抄公式,那不管做多少道题,脑子里都是一团浆糊,换个符号体系就认不出来了。