将马尔可夫链蒙特卡罗模拟存储到数据帧中并将其可视化

问题描述

我正在尝试模拟股票价格的演变,所以我决定使用 MCMC 模拟(我不知道是否有可以帮助我的库)。 我打算做的是:

  1. 在给定多个参数的情况下,创建一个用于模拟股票价格演变的函数
price.path <- function(p,t,meanr,sdr){
  score <- c(0,rnorm(t))
  retorno <- meanr + sdr*score
  prices <- P*exp(cumsum(retorno))
}

返回价格随机过程的向量。

  1. 多次运行模拟(最多 100,000 次),并存储找到的每条路径。我认为最好将其存储在数据框中。

我没有找到一种方法可以将所有向量存储到数据帧中而不必命名每一列(命名每一列是不必要的,而且是浪费时间),所以我决定使用 purrr。我尝试使用 map 函数获取不需要名称的列表。之后,我将使用 map_dfc 函数将列表转换为具有简单名称(...1、...2、...3 等)的数据框,我使用 rnorm 尝试了此操作,并且效果很好。

map(seq(1,run),price.path,p = 20,t = 10,meanr = 0.00008,sdr = 0.00015)

其中“run”是一个整数。这种方法不起作用,因为 map 函数“认为”我在第一个参数中给它的向量必须在函数中使用。我不想要这个,因为我只是将向量用作占位符,它没有任何用处或真正的意义。它基本上只是计算价格路径的运行情况,这实际上无关紧要。这会导致 map 抛出错误,因为其中一个参数未使用。

  1. 最后,我想使用 ggplot 和另一个地图函数来可视化每个价格路径。我还没有进入这部分,因为我有点卡在第二步。

如果你们能在第 2 步中给我一些帮助,我将不胜感激。到目前为止,对我的程序的一些见解还可以,并且非常欢迎在可视化部分提供一些帮助。提前致谢。

解决方法

这将解决 map 问题:

map(seq(1,run),~price.path(
        p = 20,t = 10,meanr = 0.00008,sdr = 0.00015
    )
)

解决名字问题:

my_runs <- seq(1,run)
names(my_runs) <- paste0('some_great_name_for_each_run',my_runs)
map_dfc(my_runs,sdr = 0.00015
    ))
,

要解决 map 的第一个问题,请使用如下公式表示法:

library(tidyverse)

run <- 1000
all_sims <- map(seq(1,~ price.path(p = 20,sdr = 0.00015))

然后您可以将结果存储在长格式数据帧中。我还创建了列来计算每次迭代和每次模拟运行。

df1 <- tibble(
  simvalues = unlist(all_sims),iteration = rep(seq(1,11),sim_number = unlist(map(1:run,~ rep(.x,11)))
)

然后您可以绘制结果以实现以下目标:

df1 %>% 
  ggplot(aes(x = iteration,y = simvalues,color = sim_number)) +
  geom_path()

MCMC ggplot