Python:蒙特卡洛模拟

问题描述

我不确定如何进行操作或哪里出错了,我得到的阵列很大

这是指令

创建一个markdown单元格,该单元格显示一个级别为2的标题,其标题为:“ D部分:Monte Carlo Simulation”。还要在此部分中添加一些简短描述代码用途的文本。 编写一个名为monte_carlo的函数。该函数应接受五个参数:开始,速率,体积,天数和num_runs。该函数应使用循环来生成数量等于num_runs的模拟库存量。运行的特性由参数start,rate,vol和days提供。下面提供了此功能的详细说明。每次循环执行时,应执行以下步骤:

  1. 使用提供的参数模拟运行。将结果数组存储在变量中。
  2. 确定股票的最终模拟价格,并将其附加到名为final_prices的列表中。
  3. 确定模拟运行的年收益,并将其附加到名为Annual_yields的列表中。 执行完循环后,将已构造的两个列表转换为numpy数组,然后 退还他们两个。

创建一个markdown单元格,以说明您将通过运行具有特定种子的Monte Carlo模拟来测试该功能。 设置1的种子,然后对当前价格为200,预期年收益率为10%,波动率为0.4的股票进行10,000次模拟运行的蒙特卡洛模拟。每次运行应超过500天。创建最终价格的直方图。使用bins = np.arange(0,1600,50),并将edgecolor设置为black。设置尺寸 数字为[10,5]。 如果您的代码正确,则直方图的峰值应在200左右,并且尾部应在右侧尾部较长。 这表明,大多数模拟的最终价格都接近200,但存在一些非常大的离群值。

创建一个降价单元格,以说明您将要显示模拟最终价格的第10、25、50、75和90%。 使用np.percentile计算该股票生成的模拟运行中最终价格的第10、25、50、75和90%。通过创建五行输出显示结果,每行使用以下格式:__th 百分位数:_____ 将显示位数四舍五入到小数点后两位。 如果做得正确,您应该获得118.05的10个百分位和505.91的90个百分位。

def monte_carlo(start,rate,vol,days,num_runs):
    final_prices =[]
    annual_yields =[]
    for runs in range(0,num_runs):
        runs = simulate_stock(start,days)
        y = runs[-1]
        final_prices.append(y)
        z = find_yield(runs)
        annual_yields.append(z)
    np.asarray(final_prices)
    np.asarray(annual_yields)
    return final_prices,annual_yields

np.random.seed(1)
final_prices,annual_yields = monte_carlo(200,0.1,0.4,500,10000)
plt.figure(figsize=[10,5])
plt.hist(final_prices,bins=np.arange(0,1600,50),edgecolor='black')

解决方法

np.asarray不会更改该值,但会返回结果。您将两个值转换为numpy数组,然后丢弃结果。所以你想要类似的东西

return np.asarray(final_prices),np.asarray(annual_yields)

作为第二个小问题,您正在同时使用runs作为运行本次的计数以及simulate_stock的返回值。更多的Pythonic将是这样写的:

for _ in range(0,num_runs)

因为您实际上并不关心计算中的运行编号。如果您认为以后需要此值:

for run_number in range(0,num_runs)