用Python/R手把手复现IS-LM模型:从理论公式到动态模拟(附完整代码)
当宏观经济学教材上的IS-LM曲线从静态图表变成屏幕上跳动的动态轨迹时,那些抽象的经济学原理突然有了生命力。本文将为数据科学爱好者打开一扇新窗口——如何用编程语言让经典宏观经济模型"活"起来。不同于教科书上的理论推导,我们将聚焦代码实现,用Python和R两种语言构建可交互的经济系统模拟器。
1. 模型核心与编程框架设计
IS-LM模型本质上是一个两方程联立系统:产品市场均衡由消费函数和投资函数构成,货币市场均衡则由货币需求和供给决定。在代码实现时,我们需要建立四个核心组件:
# Python模型框架示例 class ISLM_Model: def __init__(self, alpha=500, beta=0.5, e=1250, d=250, k=0.5, h=250, A=1000, M=1250, P=1): # 消费函数参数 self.alpha = alpha # 自主消费 self.beta = beta # 边际消费倾向 # 投资函数参数 self.e = e # 自发投资 self.d = d # 投资利率敏感系数 # 货币需求参数 self.k = k # 交易性货币需求系数 self.h = h # 投机性货币需求系数 self.A = A # 货币需求常数项 # 货币供给参数 self.M = M # 名义货币供给 self.P = P # 价格水平对应的R语言实现采用类似的参数结构:
# R模型参数初始化 params <- list( alpha = 500, beta = 0.5, e = 1250, d = 250, k = 0.5, h = 250, A = 1000, M = 1250, P = 1 )关键计算逻辑对比:
| 组件 | Python实现 | R实现 |
|---|---|---|
| 消费函数 | C = alpha + beta * Y | C <- alpha + beta * Y |
| 投资函数 | I = e - d * r | I <- e - d * r |
| 货币市场均衡 | r = (k*Y + A - M/P)/h | r <- (k*Y + A - M/P)/h |
| 产品市场均衡 | Y_next = C + I + G | Y_next <- C + I + G |
2. 基础模型实现与可视化
让我们从最简单的封闭经济模型开始。以下Python代码实现了100期的动态调整过程:
import numpy as np import matplotlib.pyplot as plt def basic_simulation(T=100, Y0=5000, r0=10, G=0): # 初始化数组 Y = np.zeros(T+1) r = np.zeros(T+1) Y[0], r[0] = Y0, r0 for t in range(T): C = alpha + beta * Y[t] I = e - d * r[t] Y[t+1] = C + I + G r[t+1] = (k * Y[t] + A - M/P) / h # 可视化 plt.figure(figsize=(15,5)) plt.subplot(121) plt.plot(Y, label='国民收入') plt.title('国民收入动态路径') plt.subplot(122) plt.plot(r, color='orange', label='利率') plt.title('利率动态路径') plt.show() return Y, rR语言用户可以使用以下等效实现:
basic_simulation <- function(T=100, Y0=5000, r0=10, G=0) { Y <- numeric(T+1) r <- numeric(T+1) Y[1] <- Y0; r[1] <- r0 for(t in 1:T) { C <- alpha + beta * Y[t] I <- e - d * r[t] Y[t+1] <- C + I + G r[t+1] <- (k * Y[t] + A - M/P) / h } par(mfrow=c(1,2)) plot(Y, type='l', main='国民收入动态路径') plot(r, type='l', col='orange', main='利率动态路径') return(list(Y=Y, r=r)) }运行后会观察到系统如何从初始非均衡状态(Y0=5000, r0=10)收敛到均衡点(Y*=2000, r*=3)。这种动态轨迹完美展示了经济学中"失衡-调整-均衡"的过程。
3. 政策模拟实验
3.1 财政政策冲击
政府支出增加是经典的财政政策工具。我们在第20期引入500单位的政府支出冲击:
def fiscal_policy_shock(): Y, r = np.zeros(101), np.zeros(101) Y[0], r[0] = 2000, 3 # 从均衡开始 for t in range(100): G = 500 if t >= 20 else 0 # 第20期政策冲击 C = alpha + beta * Y[t] I = e - d * r[t] Y[t+1] = C + I + G r[t+1] = (k * Y[t] + A - M/P) / h plt.plot(Y, label='国民收入') plt.plot(r, label='利率') plt.axvline(20, color='red', linestyle='--') plt.legend()关键观察结果:
- 政府支出乘数效应明显,国民收入增长幅度大于政府支出增加额
- 利率上升产生"挤出效应",部分抵消了财政政策效果
- 系统最终会达到新的均衡点
3.2 货币政策调整
中央银行通过调节货币供给影响经济。以下代码模拟货币供给量增加20%的效果:
monetary_policy <- function() { Y <- numeric(101); r <- numeric(101) Y[1] <- 2000; r[1] <- 3 for(t in 1:100) { current_M <- ifelse(t < 30, M, M * 1.2) # 第30期货币政策 C <- alpha + beta * Y[t] I <- e - d * r[t] Y[t+1] <- C + I r[t+1] <- (k * Y[t] + A - current_M/P) / h } plot(Y, type='l', ylim=range(c(Y,r)), col='blue') lines(r, col='red') abline(v=30, lty=2) }实验发现:
- 货币供给增加导致利率下降
- 低利率刺激投资增长,进而提升国民收入
- 长期中价格水平可能调整,削弱货币政策效果(需扩展模型)
4. 高级扩展与随机模拟
现实经济充满不确定性。我们在基础模型中添加随机扰动项:
def stochastic_simulation(): np.random.seed(42) Y, r = np.zeros(101), np.zeros(101) Y[0], r[0] = 2000, 3 for t in range(100): # 添加随机扰动 C = alpha + beta * Y[t] + np.random.normal(0, 50) I = e - d * r[t] + np.random.normal(0, 30) Y[t+1] = C + I r[t+1] = (k * Y[t] + A - M/P + np.random.normal(0, 20)) / h plt.figure(figsize=(10,6)) plt.plot(Y, label='国民收入') plt.plot(r, label='利率') plt.title('存在随机扰动的动态路径') plt.legend()关键观察:
- 系统不再平滑收敛,而是呈现波动收敛特征
- 大的随机冲击可能导致系统暂时偏离均衡
- 模型更接近现实经济的不确定性特征
对于希望进一步探索的读者,可以考虑以下扩展方向:
- 加入预期形成机制(适应性预期vs理性预期)
- 引入开放经济条件下的BP曲线
- 实现价格水平内生调整的AD-AS扩展
- 构建交互式仪表盘实时调整参数
调试提示:当模拟结果不收敛时,检查参数组合是否满足模型稳定性条件,特别是边际消费倾向β和投资利率敏感系数d的关系。