метод log выдает NaN, несмотря на na.omit

#r #na #finance #risk-analysis

#r #na #финансы #анализ рисков

Вопрос:

Я хочу рассчитать вклад в риск каждой акции портфеля.

 portfolioComponentReturns <- na.omit(Return.calculate(monthly_return, method = "log"))

covariance_matrix <- cov(portfolioComponentReturns)

# Square root of transpose of the weights cross prod covariance matrix returns 
# cross prod weights gives portfolio standard deviation.
sd_portfolio <- sqrt(t(w) %*% covariance_matrix %*% w)

# Marginal contribution of each asset. 
marginal_contribution <- w %*% covariance_matrix / sd_portfolio[1, 1]

# Component contributions to risk are the weighted marginal contributions
component_contribution <- marginal_contribution * w 

# This should equal total portfolio vol, or the object `sd_portfolio`
components_summed <- rowSums(component_contribution)

# To get the percentage contribution, divide component contribution by total sd.
component_percentages <- component_contribution / sd_portfolio[1, 1]

percentage_tibble_by_hand <- 
  tibble(symbols, w, as.vector(component_percentages)) %>% 
  rename(asset = symbols, 'portfolio weight' = w, 'risk contribution' = `as.vector(component_percentages)`)

percentage_tibble_by_hand
  

Тем не менее, у меня возникает следующая проблема с самых первых строк:

 > portfolioComponentReturns <- na.omit(Return.calculate(monthly_return, method = "log"))
Warning message:
In log(pr) : NaNs produced
> 
> covariance_matrix <- cov(portfolioComponentReturns)
> 
> # Square root of transpose of the weights cross prod covariance matrix returns 
> # cross prod weights gives portfolio standard deviation.
> sd_portfolio <- sqrt(t(w) %*% covariance_matrix %*% w)
Error in t(w) %*% covariance_matrix : non-conformable arguments
  

Данные

Файл данных находится здесь.

Для того, чтобы получить monthly_return :

 library (dplyr)
library (lubridate)
   
df <- read.xlsx ("Data.xlsx", sheet = "Sector-STOXX600", startRow = 2, colNames = TRUE, detectDates = TRUE, skipEmptyRows = FALSE)
df [2:19] <- data.matrix (df [2:19])

# changing nas with the preceding value
nas <- which(apply(df[, -1], 1, FUN=function(x) any(is.na(x))))
ver <- c(nas, nas - 1, nas   1)
ver <- ver[order(ver)]
df[nas, -1] <- (df[nas-1,-1]   df[nas 1,-1])/2
df[ver,]

percent_change2 <- function(x)last(x)/first(x) - 1
monthly_return <- df %>% 
  group_by(gr = floor_date(Date, unit = "month")) %>%
  summarize_at(vars(-Date, -gr), percent_change2) %>%
  ungroup()

# Generamos el xts, indicando la columna con la info de tiempo
monthly_return <- xts(monthly_return[,-1], order.by=monthly_return$gr) 
  

Комментарии:

1. Нет данных. Вычисляется ли логарифм каких-либо нулей или отрицательных значений?

2. @RuiBarradas Извини ! Только что обновлено. Я не думаю, что здесь есть недостающие значения. Я добавил некоторый код, чтобы проверить это и заменить средним значением предыдущего и следующего значений

3. na.omit(Return.calculate(monthly_return, method = "log")) Сначала вы вычисляете логи, затем вы na.omit . Попробуй Return.calculate(na.omit(monthly_return), method = "log") .

4. @RuiBarradas Ошибок больше нет, но ковариационная матрица заполнена nas. monthly_return похоже, что их нет. Интересно, связано ли это с методом log.

5. Смотрите мой первый комментарий. Я считаю, что дело не в NA значениях, а в значениях <= 0.