#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
to1.00
, а не0.01
to100
?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 имеет минимальное значение риска