运行for循环而不覆盖R中向量中的现有元素

时间:2017-03-26 11:43:18

标签: r vector

我是R的新手,我目前正在努力寻找for循环。

我的代码将从时间0模拟8股票价格,其中股票价格为100,直到时间8.我想这样做10次,并将所有值存储在矢量,价格中。我的矢量最终将包含80个价格。但是,矢量中存储的唯一值是最后一次模拟。我不知道如何存储所有值而不覆盖现有元素。有没有人知道如何做到这一点?

这是我的代码:

S = c(100)
delta = 0.25
sigma = 0.2
rf = 0.01

prices = c()

Ber.reg <- function(S, delta, sigma, rf) {
    for(i in 1:10) {
      for(j in 1:8) {
        S[j+1] <- S[j]*exp((rf - 0.5*sigma^2)*delta + sigma*sqrt(delta)*rnorm(1))
      }
    prices <- S
    }
return(prices)
}

1 个答案:

答案 0 :(得分:0)

一些问题:

1)依赖于在运行之前正确初始化的全局变量的函数是一个脆弱的函数。拥有prices全局的设计很糟糕。它应该是函数的本地。

2)他们只关注S的相关内容是值100。该初始价格应该是参数,将其包裹在c()中是不必要的模糊(虽然无害,因为100 c(100))。从概念上讲,100是标量

3)您的代码是10次模拟运行,其中每个模拟有8个过渡步骤。为什么不a)制作这些数字参数而不是硬接线呢?和b)返回一个矩阵,其中每一行都是一个运行?从逻辑上讲,你有一个矩阵而不是一个平面向量。

4)增长向量(例如price <- c(price,S))是低效的,因为它重复分配更多空间并将旧值复制到新空间中。由于您事先知道输出的大小,因此一劳永逸地分配空间。

5)使代码更具矢量化。从为试验次数重复的初始值向量开始,并在每个阶段,在单行代码中更新整个向量,不需要内部循环:

Ber.reg <- function(initial, delta, sigma, rf,runs,steps){
  n <- runs*(steps+1)
  prices <- vector("numeric",n)
  price <- rep(initial,runs)
  prices[1:runs] <- price
  for(i in seq_len(steps)){
    price <- price*exp((rf - 0.5*sigma^2)*delta + sigma*sqrt(delta)*rnorm(runs))
    prices[(1+ i*runs):((i+1)*runs)] <- price
  }
  dim(prices) <- c(runs,steps+1)
  prices
}

例如,使用delta, sigma, rf的值:

> Ber.reg(100,delta,sigma,rf,3,4)
     [,1]      [,2]      [,3]      [,4]      [,5]
[1,]  100  94.72913  94.35394  92.47475  90.03819
[2,]  100  91.91992  85.05428  83.87200  65.26291
[3,]  100 120.12281 121.45070 131.76266 124.25140

您的代码(几乎)等同于

prices <- Ber.reg(100,delta,sigma,rf,10,8)

如果你真的想要一个平面向量,请对输出执行此操作:

prices <- as.vector(t(prices))