这是一个使用类似数据集的示例代码:
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
我会得到一个数字,但我不能使用对数。
如何创建此特定循环?
答案 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