В следующий раз, пожалуйста, приведите воспроизводимый пример с примерами данных и кода, которые у вас уже есть. Иначе без этого сложно точно знать, чего ты хочешь. Для этого мне пришлось загрузить некоторые собственные данные.
library(quantmod)
library(PerformanceAnalytics)
stocks <- c("AAPL", "JNJ", "BA", "MSFT", "C")
for (ticker in stocks) {
if(ticker == stocks[1]){
portfolio <- getSymbols(ticker, auto.assign = FALSE, from = "2000-01-01", to = "2019-12-31")[,6]
}else{
portfolio <- cbind(portfolio, getSymbols(ticker, auto.assign = FALSE, from = "2000-01-01", to = "2019-12-31")[,6])
}
}
colnames(portfolio) <- stocks
portfolio_returns <- rowSums(Return.calculate(portfolio, method = "discrete")[-1]) / ncol(portfolio)
portfolio_returns <- xts(portfolio_returns, order.by = index(portfolio)[-1])
getSymbols('SPY', from = "2000-01-01", to = "2019-12-31")
benchmark <- Return.calculate(SPY[,6], method = "discrete")[-1]
Это дает нам портфель из пяти акций с доходностью этого портфеля в течение 20 лет. Далее мы посчитаем, сколько один, три и пять лет периоды в 20 лет. Для трехлетнего периода, так как 20 лет дадут шесть трехлетних периодов с остатком, мы используем floor
, чтобы получить целое число
period_one <- nyears(portfolio_returns)
period_three <- floor(nyears(portfolio_returns) / 3)
period_five <- nyears(portfolio_returns) / 5
oneYear <- threeYear <- fiveYear <- 0
В последней строке инициализируются три переменные, которые сохранят число годы тестирование превзошло портфель.
Return.performance <- function(x, n, nperiods){
periodYear <- 0
periods <- seq(from = 1, by = 252*n, length.out = nperiods+1)
num <- 1
for (i in periods[-1]){
pre_year <- periods[num]
if(i==periods[length(periods)]) i <- nrow(x)
temp <- Return.cumulative(x[pre_year:i])[,1] < Return.cumulative(x[pre_year:i])[,2]
if(temp==TRUE) periodYear <- periodYear + 1
num <- num + 1
}
return(periodYear)
}
Код прост, поскольку в году примерно 252 торговых дня, я использую его для создания и индексации для извлечения каждый год, три года и пять лет. период в петлях. В качестве альтернативы вы можете использовать «2000/2001», «2000/2003», «2000/2005», так как это объекты XTS. Однако вам придется преобразовать в число c, чтобы увеличить как начальный, так и конечный годы, а затем преобразовать в символьные.
assets <- cbind(portfolio_returns, benchmark)
Return.performance(assets, 1, period_one)
[1] 4
Return.performance(assets, 3, period_three)
[1] 1
Return.performance(assets, 5, period_five)
[1] 0
Портфель, который у меня не получился менее пятилетнего периода из 4, только хуже одного раза в шесть 3-летних периодов, и хуже всего лишь 4 раза за 20 однолетних периодов. Похоже, я довольно фондовый сборщик! Увы, в качестве управляющего хедж-фондом нет такой вещи:)