将马尔可夫链蒙特卡洛模拟存储到数据框中并将其可视化
Store Markov Chain Montecarlo simulations into dataframe and visualize it
我正在尝试模拟股票价格的演变,所以我决定使用 MCMC 模拟(我不知道是否有可以帮助我的库)。
我打算做的是:
- 给定多个参数,创建一个模拟股票价格演变的函数:
price.path <- function(p, t, meanr, sdr){
score <- c(0,rnorm(t))
retorno <- meanr + sdr*score
prices <- p*exp(cumsum(retorno))
}
其中 returns 价格随机过程的向量。
- 运行 多次模拟(最多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)
其中“运行”是一个整数。这种方法没有用,因为 map 函数“认为”我在第一个参数中给它的向量必须在函数中使用。我不想要这个,因为我只是将向量用作占位符,它没有任何用处或实际意义。它基本上只是计算价格路径的 运行,这真的无关紧要。这会导致 map 抛出错误,因为其中一个参数未被使用。
- 最后,我想使用 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, ~price.path(
p = 20,
t = 10,
meanr = 0.00008,
sdr = 0.00015
))
要解决 map
的第一个问题,请使用公式表示法,如下所示:
library(tidyverse)
run <- 1000
all_sims <- map(seq(1,run), ~ price.path(p = 20, t = 10, meanr = 0.00008, sdr = 0.00015))
然后您可以将结果存储在长格式数据框中。我还创建了列来计算每次迭代和每次模拟 运行.
df1 <- tibble(
simvalues = unlist(all_sims),
iteration = rep(seq(1,11), run),
sim_number = unlist(map(1:run, ~ rep(.x, 11)))
)
然后您可以绘制结果以实现如下目的:
df1 %>%
ggplot(aes(x = iteration, y = simvalues, color = sim_number)) +
geom_path()
我正在尝试模拟股票价格的演变,所以我决定使用 MCMC 模拟(我不知道是否有可以帮助我的库)。 我打算做的是:
- 给定多个参数,创建一个模拟股票价格演变的函数:
price.path <- function(p, t, meanr, sdr){
score <- c(0,rnorm(t))
retorno <- meanr + sdr*score
prices <- p*exp(cumsum(retorno))
}
其中 returns 价格随机过程的向量。
- 运行 多次模拟(最多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)
其中“运行”是一个整数。这种方法没有用,因为 map 函数“认为”我在第一个参数中给它的向量必须在函数中使用。我不想要这个,因为我只是将向量用作占位符,它没有任何用处或实际意义。它基本上只是计算价格路径的 运行,这真的无关紧要。这会导致 map 抛出错误,因为其中一个参数未被使用。
- 最后,我想使用 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, ~price.path(
p = 20,
t = 10,
meanr = 0.00008,
sdr = 0.00015
))
要解决 map
的第一个问题,请使用公式表示法,如下所示:
library(tidyverse)
run <- 1000
all_sims <- map(seq(1,run), ~ price.path(p = 20, t = 10, meanr = 0.00008, sdr = 0.00015))
然后您可以将结果存储在长格式数据框中。我还创建了列来计算每次迭代和每次模拟 运行.
df1 <- tibble(
simvalues = unlist(all_sims),
iteration = rep(seq(1,11), run),
sim_number = unlist(map(1:run, ~ rep(.x, 11)))
)
然后您可以绘制结果以实现如下目的:
df1 %>%
ggplot(aes(x = iteration, y = simvalues, color = sim_number)) +
geom_path()