You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python蒙特卡洛模拟问题:投资组合期末值无法结转至期初

问题修正方案

原代码核心问题

  1. 每次循环都用初始balance计算,未用上一期期末值更新当期期初值
  2. 循环内重复生成所有步骤的收益数据,逻辑冗余且未正确使用
  3. 每次循环覆盖整个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:45:57