如何在每个循环中创建一个更改dataname的循环?

时间:2018-05-02 18:31:48

标签: r loops for-loop

这是一个使用类似数据集的示例代码:

library(portfolio)
p <- new("portfolioBasic", instant = as.Date("2004-12-31"), id.var = "symbol",  
         in.var = "price", sides = "long", 
         ret.var = "month.ret", data = dow.jan.2005)
a <- performance(p)@ret
b <- log(1 + a)
sum <- b + sum #the sum variable should accumulate all returns

上面的示例与我正在处理的代码非常相似,不同之处在于它使用了portfolio库中包含的dow.jan.2005。

我想在R中创建一个计算特定函数p <- new(... , data = "data20xx")的循环,函数中使用的data20xx应该从2007年到2017年。

p后面还有另外两个功能。性能函数performance(p)计算一个百分比,然后需要对其进行对数并存储在单独的变量b中。 sum变量跟踪累积日志返回。

以下是performance函数的说明:

   Formal class 'performance' [package "portfolio"] with 6 slots
      ..@ ret           : num -0.366
      ..@ profit        : num 0
      ..@ missing.price : num NA
      ..@ missing.return: int 0

如果我使用performance(p)@ret我会得到一个数字,但我不能使用对数。

如何创建此特定循环?

2 个答案:

答案 0 :(得分:0)

一种方法是将数据框放入列表中,并使用lapply将函数应用于此列表的每个元素。

data <- list(data2005, data2006, data2007)

myfun <- function(x){
  p <- new("portfolioBasic", 
           instant = as.Date("2004-12-31"), 
           id.var = "symbol", in.var = "price",
           sides = "long", ret.var = "month.ret", data = x)
  a <- performance(p)@ret
  b <- log(1 + a)
  b
}

output <- lapply(data, myfun)

sum <- do.call("sum", output)

样本数据

library(portfolio)

set.seed(1)

data(dow.jan.2005)

data2007 <- data2006 <- data2005 <- dow.jan.2005
data2006$price <- runif(nrow(dow.jan.2005), 30, 100)
data2007$price <- runif(nrow(dow.jan.2005), 30, 100)

答案 1 :(得分:0)

这是我在DJack的建议之后得出的答案(感谢DJack!):

mydata <- list(spxdata2007,spxdata2008 etc.)
p <- lapply(mydata, function(x) log(1+performance(new("portfolioBasic", id.var = "symbol", in.var = "inversepe", type = "linear", sides = c("long", "short"), ret.var = "return", data = x))@ret))
exp(Reduce("+",p))-1