Как создать цикл, который меняет имя данных во время каждого цикла? - PullRequest
0 голосов
/ 02 мая 2018

Это пример кода, который использует подобный набор данных:

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

Приведенный выше пример очень похож на код, над которым я работаю, за исключением того, что он использует dow.jan.2005, который включен в библиотеку portfolio.

Я хочу создать цикл в 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 голосов
/ 03 мая 2018

Вот мой собственный ответ, который я придумал после предложений 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
0 голосов
/ 03 мая 2018

Подход состоит в том, чтобы поместить ваши фреймы данных в список и применить вашу функцию к каждому элементу этого списка, используя 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...