Это пример кода, который использует аналогичный набор данных:
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, я получаю число, но не могу использовать его логарифм.
Как я могу создать этот конкретный цикл?
о чувак! Я хочу помочь тебе, но не могу. Вам следует предоставить дополнительную информацию.
Я обновил свой первоначальный пост примером
Вы знаете о простом математическом факте, что нет определенного значения для журнала отрицательного числа ????
Для первой проблемы вы можете использовать список как data <- list(data2007, ..., data2017) и либо использовать lapply, либо цикл с data = data[[i]].
@ 42 Извините, я пропустил эту часть. Теперь я добавил правильную формулу возврата журнала.
@DJack, не могли бы вы привести полный пример?





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