R: Применение пакета PortfolioAnalytics (Return.portfolio, var.portfolio, SharpeRatio) по группам - PullRequest
0 голосов
/ 30 мая 2019

У меня есть фрейм данных p1, который состоит из временного ряда ежемесячных возвратов акций, примерно 500 акций за каждый месяц.Я пытаюсь рассчитать доходность портфеля, дисперсию портфеля и коэффициент Шарпа для каждого месяца .Для этого я хотел бы использовать пакет PortfolioAnalytics, применяя Return.portfolio (), var.portfolio () и SharpeRatio () соответственно.

Мой желаемый вывод будет новым фреймом данных (p1pofo)который состоит из четырех столбцов ("monthyear", "PofoRet", "PofoVar", "PofoSharpe") и имеет одну строку для каждого значения "monthyear".

. Для этого я попытался разбитьdataframe, а затем примените соответствующую функцию, показанную в качестве примера для Return.portfolio ():

library(PortfolioAnalytics)
library(dplyr)
p1pofo <- p1 %>%
  split(list(p1$monthyear)) %>%
  map_df(~ mutate(., PofoRet=Return.portfolio(p1$MonthlyReturnT1, p1$EWweights)))

Однако я получаю следующую ошибку:

Error in try.xts(x, error = "'x' needs to be timeBased or xtsible") : 
  'x' needs to be timeBased or xtsible

Любая помощь, касающаяся недостатков с моим кодомили альтернативные способы решить мою задачу будет принята с благодарностью.

Воспроизводимый образец данных:

p1 <- structure(list(PERMNO = c(10074, 10085, 10242, 10296, 10304, 
10376, 10074, 10242, 10376, 10446), date = structure(c(9129, 
9129, 9129, 9127, 9129, 9129, 9161, 9161, 9161, 9161), class = "Date"), 
    monthyear = c(199412, 199412, 199412, 199412, 199412, 
    199412, 199501, 199501, 199501, 199501), MonthlyReturnT1 = c(0.0638297872340425, 
    0.00714285714285712, 0.115384615384615, -0.0404040404040404, 
    -0.0379746835443038, 0.0510204081632653, 0.0208333333333333, 
    -0.0333333333333333, -0.00970873786407767, 0.0204081632653061
    ), EWweights = c(0.0040650406504065, 0.0040650406504065, 
    0.0040650406504065, 0.0040650406504065, 0.0040650406504065, 
    0.0040650406504065, 0.00395256916996047, 0.00395256916996047, 
    0.00395256916996047, 0.00395256916996047)), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 247L, 248L, 249L, 250L), class = "data.frame")
...