使用R中的嵌套for循环创建矩阵

时间:2017-12-18 10:47:39

标签: r for-loop matrix row nested-loops

我正在尝试做的事情的概述: 我目前正在使用我在R中设法编写的特定函数来模拟股票价格:

for(i in 2:252){
  X[1]<- 83.26
  X[i] <- X[i-1]*(1+mu*dt)+sigma*X[i-1]*sqrt(dt)*rnorm(1)}

我模拟了252天来生成一条轨迹。以上工作完美。

我现在需要使用上面的代码生成100个轨迹,并且已被告知在上面添加额外的for循环以生成100个轨迹并将结果保存在矩阵中。

到目前为止,我有:

Y<- matrix(NA, nrow=100, ncol=252)
for(j in 1:dim(X)[1]){

  for(i in 2:dim(X)[2]){
    X[1]<- 83.26
    X[i] <- X[i-1]*(1+mu*dt)+sigma*X[i-1]*sqrt(dt)*rnorm(1)}
}

哪些不起作用也不起作用。

基本上我想做的是创建一个包含252列(代表不同股票价格天数)的矩阵,其中包含100行(代表100条不同生成的路径)

任何有关如何做到这一点的帮助将不胜感激。

mu=0.0009646
sigma=0.0001471
dt=0.00796813

编辑:

我现在需要能够在图形上绘制作为单独线条创建的矩阵的每一行。即根据时间绘制每条轨迹,t。

2 个答案:

答案 0 :(得分:0)

mu <- 0.0009646
sigma <- 0.0001471
dt <- 0.00796813

X <- matrix(NA, nrow = 100, ncol = 252)

for (j in 1:dim(X)[2]) {
  X[1, j] <- 83.26
  for (i in 2:dim(X)[1]) {
    X[i, j] <-
      X[i - 1, j] * (1 + mu * dt) + sigma * X[i - 1, j] * sqrt(dt) * rnorm(1)
  }
}

i是单独的日期和j单独的轨迹,因此每列都是行数不同日期的轨迹。

绘制数据的方法:

library(ggplot2)
library(reshape2)

X <- data.frame(X)
X$day <- 1:NROW(X)

X_melt <- melt(X, id.vars = "day")

ggplot(data = X_melt, aes(x = day, y = value, group = variable)) +
  geom_line()

每一条线都是不同的轨迹

enter image description here

答案 1 :(得分:0)

Riffing Brett的解决方案,

Y<- matrix(NA, nrow=100, ncol=252)
for(j in 1:dim(Y)[1]){
  for(i in 2:dim(Y)[2]){
  X[1]<- 83.26
  X[i] <- X[i-1]*(1+mu*dt)+sigma*X[i-1]*sqrt(dt)*rnorm(1)}
Y[j, ] <- X
}

你遇到的一个问题就是要求R计算dim(X),看起来似乎是第一个代码块,就像它应该是一个向量,因此有一个length()但不是{{ {1}}。

因此,此解决方案使用矩阵dim()生成用于迭代的维度。

另一个问题是在你迭代每个X 252次后,你没有存储这些值。因此,当您放置Y时,您会获取为Y[j, ] <- X创建的所有值,并将其存储在X的{​​{1}}行中。

我确定其他人会使用更流畅的解决方案,但这个解决方案会使用您已编写过的大部分代码。

干杯。