货币政策对金融市场的影响模拟:建立一个简单的货币市场模型,货币需求函数为 Md = kY - h(r)(k 为货币需求对收入的敏感度,h 为货币需求对利率的敏感度,Y 为总产出,r 为利率),货币供给 Ms 由中央银行控制。设定初始参数 k = 0.5,h = 100,Y = 500,Ms = 200。模拟中央银行调整货币供给(如增加货币供给到 Ms = 250)对利率的影响,进一步分析利率变化对投资和总产出的影响,绘制利率随时间的变化曲线。
import tkinter as tk from tkinter import ttk import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import numpy as np from matplotlib.figure import Figure # 设置matplotlib支持中文显示 plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"] plt.rcParams["axes.unicode_minus"] = False # 解决负号显示问题 class MonetaryPolicyModel: def __init__(self): # 模型参数 self.k = 0.5 # 货币需求对收入的敏感度 self.h = 100 # 货币需求对利率的敏感度 self.Y = 500 # 总产出 self.Ms = 200 # 货币供给 self.initial_Ms = 200 # 初始货币供给 self.a = 100 # 自发投资 self.b = -200 # 投资对利率的敏感度 self.c = 0.8 # 边际消费倾向 self.G = 100 # 政府支出 self.T = 100 # 税收 # 模拟参数 self.time_steps = 30 self.current_step = 0 self.policy = "baseline" # baseline, increase_money, decrease_money # 存储结果 self.r_history = [] # 利率历史 self.I_history = [] # 投资历史 self.Y_history = [] # 总产出历史 # 初始化模型 self.initialize_model() def initialize_model(self): # 计算初始均衡利率 self.r_history = [self.calculate_equilibrium_interest()] # 计算初始投资 self.I_history = [self.calculate_investment()] # 计算初始总产出 self.Y_history = [self.calculate_output()] def calculate_equilibrium_interest(self): # 货币市场均衡条件: Ms = kY - h*r # 解得: r = (kY - Ms) / h return (self.k * self.Y - self.Ms) / self.h def calculate_investment(self): # 投资函数: I = a + b*r return self.a + self.b * self.r_history[-1] def calculate_output(self): # 总产出 = C + I + G # 消费函数: C = c(Y-T) # 总产出 = c(Y-T) + I + G # 解得: Y = (c(-T) + I + G) / (1-c) return (self.c * (-self.T) + self.I_history[-1] + self.G) / (1 - self.c) def update_policy(self, policy): self.policy = policy self.current_step = 0 # 根据政策调整货币供给 if policy == "baseline": self.Ms = self.initial_Ms elif policy == "increase_money": self.Ms = self.initial_Ms * 1.25 # 增加25% elif policy == "decrease_money": self.Ms = self.initial_Ms * 0.75 # 减少25% self.initialize_model() def step(self): if self.current_step >= self.time_steps: return False # 计算当前步骤的均衡利率 r = self.calculate_equilibrium_interest() self.r_history.append(r) # 计算当前投资 I = self.calculate_investment() self.I_history.append(I) # 计算当前总产出 Y = self.calculate_output() self.Y_history.append(Y) self.current_step += 1 return True class MonetaryPolicySimulationApp: def __init__(self, root): self.root = root self.root.title("货币政策对金融市场的影响模拟") self.root.geometry("1200x600") self.model = MonetaryPolicyModel() # 创建左侧图表区域 self.graph_frame = ttk.Frame(root, width=800, height=600) self.graph_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # 创建右侧信息区域 self.info_frame = ttk.Frame(root, width=400, height=600, padding=10) self.info_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=False) # 创建图表 self.create_charts() # 创建控制面板 self.create_control_panel() # 创建信息面板 self.create_info_panel() # 初始化图表 self.update_charts() def create_charts(self): # 创建三个图表 self.fig = Figure(figsize=(8, 10), dpi=100) # 利率图表 self.ax1 = self.fig.add_subplot(311) self.ax1.set_title('利率变化') self.ax1.set_xlabel('时间') self.ax1.set_ylabel('利率 (%)') self.ax1.grid(True) # 投资图表 self.ax2 = self.fig.add_subplot(312) self.ax2.set_title('投资变化') self.ax2.set_xlabel('时间') self.ax2.set_ylabel('投资') self.ax2.grid(True) # 总产出图表 self.ax3 = self.fig.add_subplot(313) self.ax3.set_title('总产出变化') self.ax3.set_xlabel('时间') self.ax3.set_ylabel('总产出') self.ax3.grid(True) # 将图表放置在Tkinter窗口中 self.canvas = FigureCanvasTkAgg(self.fig, master=self.graph_frame) self.canvas.draw() self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) def create_control_panel(self): control_frame = ttk.LabelFrame(self.info_frame, text="货币政策控制", padding=10) control_frame.pack(fill=tk.X, pady=10) # 政策选择 ttk.Label(control_frame, text="选择政策:").pack(anchor=tk.W) self.policy_var = tk.StringVar(value="baseline") policies = [ ("基准情景", "baseline"), ("增加货币供给", "increase_money"), ("减少货币供给", "decrease_money") ] for text, value in policies: ttk.Radiobutton( control_frame, text=text, variable=self.policy_var, value=value, command=self.change_policy ).pack(anchor=tk.W, padx=10, pady=5) # 模拟控制按钮 button_frame = ttk.Frame(control_frame) button_frame.pack(fill=tk.X, pady=10) ttk.Button(button_frame, text="单步模拟", command=self.step_simulation).pack(side=tk.LEFT, padx=5) ttk.Button(button_frame, text="运行全部", command=self.run_simulation).pack(side=tk.LEFT, padx=5) ttk.Button(button_frame, text="重置", command=self.reset_simulation).pack(side=tk.LEFT, padx=5) def create_info_panel(self): # 当前经济指标 self.stats_frame = ttk.LabelFrame(self.info_frame, text="当前经济指标", padding=10) self.stats_frame.pack(fill=tk.X, pady=10) # 政策效果分析 self.analysis_frame = ttk.LabelFrame(self.info_frame, text="政策效果分析", padding=10) self.analysis_frame.pack(fill=tk.BOTH, expand=True, pady=10) self.update_info_panel() def update_info_panel(self): # 清空现有信息 for widget in self.stats_frame.winfo_children(): widget.destroy() for widget in self.analysis_frame.winfo_children(): widget.destroy() # 显示当前经济指标 if self.model.r_history: current_step = len(self.model.r_history) - 1 ttk.Label(self.stats_frame, text=f"时间: {current_step}").pack(anchor=tk.W) ttk.Label(self.stats_frame, text=f"利率: {self.model.r_history[-1]:.4f}%").pack(anchor=tk.W) ttk.Label(self.stats_frame, text=f"投资: {self.model.I_history[-1]:.2f}").pack(anchor=tk.W) ttk.Label(self.stats_frame, text=f"总产出: {self.model.Y_history[-1]:.2f}").pack(anchor=tk.W) ttk.Label(self.stats_frame, text=f"货币供给: {self.model.Ms}").pack(anchor=tk.W) # 显示政策效果分析 if len(self.model.r_history) > 1 and self.model.policy != "baseline": baseline_r = self.model.r_history[0] current_r = self.model.r_history[-1] r_change = current_r - baseline_r baseline_I = self.model.I_history[0] current_I = self.model.I_history[-1] I_change = current_I - baseline_I baseline_Y = self.model.Y_history[0] current_Y = self.model.Y_history[-1] Y_change = current_Y - baseline_Y ttk.Label(self.analysis_frame, text=f"政策: {self.get_policy_name(self.model.policy)}").pack(anchor=tk.W) ttk.Label(self.analysis_frame, text=f"利率变化: {r_change:.4f}%").pack(anchor=tk.W) ttk.Label(self.analysis_frame, text=f"投资变化: {I_change:.2f}").pack(anchor=tk.W) ttk.Label(self.analysis_frame, text=f"总产出变化: {Y_change:.2f}").pack(anchor=tk.W) # 分析政策影响 ttk.Separator(self.analysis_frame).pack(fill=tk.X, pady=5) ttk.Label(self.analysis_frame, text="政策影响分析:").pack(anchor=tk.W) if self.model.policy == "increase_money": analysis = [ "增加货币供给导致利率下降,", "较低的利率刺激了投资增加,", "投资增加进一步带动总产出增长。", "这体现了扩张性货币政策的效果。" ] elif self.model.policy == "decrease_money": analysis = [ "减少货币供给导致利率上升,", "较高的利率抑制了投资活动,", "投资减少导致总产出下降。", "这体现了紧缩性货币政策的效果。" ] for line in analysis: ttk.Label(self.analysis_frame, text=line).pack(anchor=tk.W) def get_policy_name(self, policy_code): policy_names = { "baseline": "基准情景", "increase_money": "增加货币供给", "decrease_money": "减少货币供给" } return policy_names.get(policy_code, policy_code) def update_charts(self): # 清空图表 self.ax1.clear() self.ax2.clear() self.ax3.clear() # 设置标题和标签 self.ax1.set_title('利率变化') self.ax1.set_xlabel('时间') self.ax1.set_ylabel('利率 (%)') self.ax1.grid(True) self.ax2.set_title('投资变化') self.ax2.set_xlabel('时间') self.ax2.set_ylabel('投资') self.ax2.grid(True) self.ax3.set_title('总产出变化') self.ax3.set_xlabel('时间') self.ax3.set_ylabel('总产出') self.ax3.grid(True) # 绘制数据 if self.model.r_history: time_steps = list(range(len(self.model.r_history))) # 利率图表 self.ax1.plot(time_steps, self.model.r_history, 'b-', linewidth=2) # 投资图表 self.ax2.plot(time_steps, self.model.I_history, 'g-', linewidth=2) # 总产出图表 self.ax3.plot(time_steps, self.model.Y_history, 'r-', linewidth=2) # 调整布局 self.fig.tight_layout() # 刷新画布 self.canvas.draw() def change_policy(self): policy = self.policy_var.get() self.model.update_policy(policy) self.update_charts() self.update_info_panel() def step_simulation(self): if self.model.step(): self.update_charts() self.update_info_panel() else: print("已完成所有模拟步骤") def run_simulation(self): while self.model.step(): self.update_charts() self.update_info_panel() self.root.update_idletasks() # 更新UI self.root.after(100) # 暂停100毫秒,使动画可见 def reset_simulation(self): policy = self.policy_var.get() self.model.update_policy(policy) self.update_charts() self.update_info_panel() if __name__ == "__main__": root = tk.Tk() # 设置中文字体 default_font = tk.font.nametofont("TkDefaultFont") default_font.configure(family="SimHei", size=10) root.option_add("*Font", default_font) app = MonetaryPolicySimulationApp(root) root.mainloop()