货币政策对金融市场的影响模拟

货币政策对金融市场的影响模拟:建立一个简单的货币市场模型,货币需求函数为 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()    
### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值