在For循环中向Numpy数组追加元素的蒙特卡洛股票模拟问题
问题分析与解决方法
核心问题
你的代码里np.append()没有生效,是因为**np.append()不会原地修改原数组,而是返回一个新数组**,你没有将返回值重新赋值给stock_price_array,所以原数组始终保持初始的空状态。另外,预分配数组的方式也可以优化,直接通过索引赋值更符合Numpy的高效使用习惯。
修正方案
方案1:直接索引赋值(推荐,高效)
预分配数组后,通过索引直接修改数组元素,避免append的低效问题:
import numpy as np annual_mean = .06 annual_stdev = .15 start_stock_price = 100 numYears = 3 # 单条路径模拟时,年化收益率数量应与年份数匹配 annual_ret = np.random.normal(annual_mean, annual_stdev, numYears) # 预分配数组存储每年股价 stock_price_array = np.zeros(numYears) stock_price_array[0] = start_stock_price # 存入初始股价 # 从第2年开始计算后续股价 for i in range(1, numYears): stock_price_array[i] = stock_price_array[i-1] * (1 + annual_ret[i-1]) print(stock_price_array)
方案2:正确使用np.append(不推荐,低效)
如果一定要用append,必须将返回值重新赋值给原数组,且初始数组应为空:
import numpy as np annual_mean = .06 annual_stdev = .15 start_stock_price = 100 numYears = 3 numSimulations = 4 stock_price_array = np.array([]) # 初始化为空数组 annual_ret = np.random.normal(annual_mean, annual_stdev, numSimulations) current_price = start_stock_price stock_price_array = np.append(stock_price_array, current_price) # 先存入初始股价 for i in range(numYears): current_price = current_price * (1 + annual_ret[i]) stock_price_array = np.append(stock_price_array, current_price) print(stock_price_array)
扩展:多模拟路径的蒙特卡洛(更实用)
如果要做多次独立模拟(比如4次3年股价预测),推荐用二维数组+向量化操作,效率远高于循环:
import numpy as np annual_mean = .06 annual_stdev = .15 start_stock_price = 100 numYears = 3 numSimulations = 4 # 二维数组:行=模拟次数,列=年份 stock_price_array = np.zeros((numSimulations, numYears)) stock_price_array[:, 0] = start_stock_price # 所有模拟的初始股价 # 生成所有模拟的年化收益率(每行对应一次模拟的历年收益率) annual_ret = np.random.normal(annual_mean, annual_stdev, (numSimulations, numYears-1)) # 向量化计算所有年份的股价 for i in range(1, numYears): stock_price_array[:, i] = stock_price_array[:, i-1] * (1 + annual_ret[:, i-1]) print(stock_price_array)
内容的提问来源于stack exchange,提问作者Angelica White
相关产品推荐
相关产品推荐

