У меня есть взвешенный портфель акций и история их ежедневной доходности. Я пытаюсь вычислить доходность портфеля в каждый исторический день, предполагая, что веса не меняются, и заменяя отсутствующие данные нулями (я пытаюсь вычислить историческую VaR или < em>Ценность под угрозой).
Вот упрощенная версия:
# portfolio
pfolio = data.frame(ticker = c("stock_a", "stock_b", "stock_noob"), weight = c(0.25, 0.6, 0.15))
# Daily stock returns (with some NA values for one stock):
m = matrix(c(0.0016, 0.0037, -0.0042, -0.0096, -0.0006, -0.0043, -0.0292, -0.0158, 0.0128, 0.0113, 0.0016, 0.0042, NA, NA, 0.0168, -0.0293, 0.0037, -0.0083),
nrow = 6,
ncol = 3,
dimnames = list(c("2017-03-01", "2017-03-02", "2017-03-03", "2017-03-06", "2017-03-07", "2017-03-08"), c("stock_a", "stock_b", "stock_noob"))
)
Я пытаюсь использовать умный метод apply
или mapply
, но лучшее, что я могу придумать, это сначала очистить данные, а затем применить цикл for (фух):
m_clean = apply(m, c(1, 2), function(x) if (is.na(x)) 0 else x)
answer = numeric(0)
for (i in 1:nrow(m_clean)) {
answer = c(answer, sum(m_clean[i, pfolio$ticker] * pfolio$weight))
}
Итак, главный вопрос: что такое чистый однострочный способ сделать это?