Python蒙特卡洛模拟问题:投资组合期末值无法结转至期初
问题修正方案
原代码核心问题
- 每次循环都用初始
balance计算,未用上一期期末值更新当期期初值 - 循环内重复生成所有步骤的收益数据,逻辑冗余且未正确使用
- 每次循环覆盖整个DataFrame,最终结果仅保留基于初始值的无效计算
修正后的代码
import numpy as np import pandas as pd def mcs(n_years = 10, n_scenarios=10, mu=0.07, sigma=0.15, steps_per_year=12, balance=100, expenses=10, personal_income=5): dt = 1/steps_per_year n_steps = int(n_years*steps_per_year) + 1 # 初始化DataFrame,首行设为初始余额 df = pd.DataFrame(index=range(n_steps), columns=range(n_scenarios)) df.iloc[0] = balance for i in range(1, n_steps): # 生成当期单步的收益数据(每个场景对应一个收益值) rets = np.random.normal(loc=(1+mu)**dt - 1, scale=sigma*np.sqrt(dt), size=n_scenarios) # 获取上一期的期末余额作为当期期初值 prev_balance = df.iloc[i-1] # 计算当期期末余额:期初值*(1+收益) - 费用 + 个人收入 current_balance = prev_balance * (1 + rets) - expenses + personal_income # 将结果写入当前行 df.iloc[i] = current_balance return df
修正逻辑说明
- 提前初始化完整的DataFrame,首行固定为初始投资余额
- 从第2步(索引1)开始循环,每一步都用上一期的期末值作为当期计算基础
- 每次仅生成当期单步的收益数据,避免冗余计算
- 逐行更新DataFrame,确保每个场景的余额随时间递进
内容的提问来源于stack exchange,提问作者Clueless Cobra
相关产品推荐
相关产品推荐

