Как заставить некоторые параметры в функции принимать несколько чисел и возвращать наименьшее значение

#r #function #apply #sapply

#r #функция #применить #sapply

Вопрос:

У меня есть следующая функция:

 Double.Historical.Sim.Var <- function(d1, wa=0.75, wb=0.25, pv=1000, cl=0.95) 
   {
   x <- pv
   w <- c(wa,wb)
   Pw <- -pv*w
   loss <- rowSums(t(Pw * t(d1)))
   result <- quantile(loss,0.95)
   return(result)
  }
  

D1 — это фрейм данных с доходностью 2 акций (Microsoft и Amazon)
Мне нужен способ, чтобы функция принимала значение Wa от 0,01 до 1, при этом значение wb равно (1-wa)
, и чтобы сообщить мне, с какой комбинацией wa и wb значение этой функции является наименьшим.

Заранее спасибо за любую помощь!!

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

1. В чем смысл x функции? Кроме того, если wb это функция wa , зачем использовать ее в качестве параметра?

2. Было бы полезно, если бы вы привели конкретный пример для d1 . Кроме того, вы имели в виду 0.01 to 1.00 , а не 0.01 to 100 ?

3. да, от 0,01 до 1, d1 — это фрейм данных с возвратом 2 акций

4. Формула работает, она дает вам значение риска портфеля из двух активов (с использованием базового метода исторического моделирования). Сейчас мне нужен способ определить, какой вес активов (wa и wb) дает наименьшее значение риска. Спасибо за быстрые ответы 🙂

Ответ №1:

Рассмотрите возможность настройки возвращаемого значения функции. Затем вызывайте свою функцию итеративно по sapply всей последовательности, чтобы построить матрицу результатов и отфильтровать необходимое минимальное значение.

 Double.Historical.Sim.Var <- function(d1, wa=0.75, wb=0.25, pv=1000, cl=0.95) {
   w <- c(wa, wb)
   Pw <- -pv*w
   loss <- rowSums(t(Pw * t(d1)))
   result <- quantile(loss,0.95)
   return(c(wa, wb, result))       # NEW RETURN
}

res_matrix <- sapply(seq(0.01, 1, by=0.01),
                     function(i) Double.Historical.Sim.Var(d1, wa=i, wb=(1-i))

res_matrix[which.min(res_matrix[3,]),]
  

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

1. res_matrix[which.min(res_matrix[,3]),] какова цель 3 там?

2. На самом деле, 3 должно быть строкой, а не столбцом. И, пожалуйста, удалите длинный комментарий с трудночитаемым кодом и не стесняйтесь отвечать на свой собственный пост ниже. Однако, если это решение помогло вдохновить окончательный ответ, не стесняйтесь соглашаться. Вам не должно потребоваться несколько sapply вызовов.

Ответ №2:

Я понял это благодаря parfait, ответ на случай, если кому-нибудь это понадобится, следующий

 bHS.mv <- function(wa, P, rets){
w <- c(wa, 1-wa)
Pw <- -P*w
loss <- rowSums(t(Pw * t(rets)))
result <- quantile(loss, 0.95)
return(c(wa, result))

wts <- seq(0, 1, by = 0.01)
sapply(wts, bHS.mv, 2000, Port.Vol.Ad)
minvar <- sapply(wts, bHS.mv, 2000, Port.Vol.Ad)

minvar[,which.min(minvar[2,])]
  

Это дает вам представление о том, при каких весах портфель из 2 рисков factos имеет минимальное значение риска