У меня есть фрейм данных 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")