Возврат скользящего периода: количество результатов за 1 год, 3 года и 5 лет - PullRequest
0 голосов
/ 07 апреля 2020

В последние несколько часов я пытался выяснить, как я могу измерить количество лет, в течение которых портфель акций не соответствовал контрольным показателям. У меня есть 240-месячная доходность как для моего портфеля, так и для теста:

Доходность портфеля: -1,5%, 3,00%, -0,75%, ...

Эталонная доходность: -2,54%, 2,62%, -1,39%, ...

Прямо сейчас я хочу подсчитать, сколько 1 год, 3- годовой и 5-летний периоды показали, что тест показал лучшие результаты, чем мой портфель.

Может ли кто-нибудь помочь мне с этим?

Заранее спасибо.

1 Ответ

0 голосов
/ 07 апреля 2020

В следующий раз, пожалуйста, приведите воспроизводимый пример с примерами данных и кода, которые у вас уже есть. Иначе без этого сложно точно знать, чего ты хочешь. Для этого мне пришлось загрузить некоторые собственные данные.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...