Я работаю над оптимизацией портфеля, где стараюсь минимизировать меру расхождения между плотностью портфеля и целевым доходом.Для этого я написал код, который работает, но с двумя основными проблемами.
1) Я хотел бы интегрировать для большего диапазона, но возвращение не является конечным значением.Это происходит главным образом из-за того, что функция для оценки плотности возвращает предельный диапазон значений и затем 0. Как я мог это исправить, потому что, когда я установил более высокую поддержку в Kdensity, я получил ошибку.
2) Может случиться так, что моя мера дивергенции (Кульбака Лейблера) отрицательна, что на практике невозможно, но я не знаю, откуда исходит отрицательное значение.Может ли кто-нибудь помочь мне?
Я покажу ниже, что я уже пробовал.Средняя целевая доходность и дисперсия являются одним из оптимального портфеля коэффициента Шарпа.
S1P <- cp2dp(cp = c(0.11, 0.1625,-0.4, 6.50), family ="ST")
S2P <- cp2dp(cp = c(0.05, 0.035,-0.02, 4), family ="ST")
S3P <- cp2dp(cp = c(0.045, 0.2 , -0.5, 10), family = "ST")
S4P <- cp2dp(cp = c(0.08 , 0.07 , 0 , 5) , family = "ST")
S1 <- as.matrix(rst(n = 250 , xi = S1P[1] , omega = S1P[2], alpha = S1P[3] , nu = S1P[4]), ncol = 1 )
S2 <- as.matrix(rst(n = 250, xi = S2P[1] , omega = S2P[2], alpha = S2P[3] , nu = S2P[4]), ncol = 1 )
S3 <- as.matrix(rst(n = 250 , xi = S3P[1], omega = S3P[2], alpha = S3P[3], nu = S3P[4]) , ncol = 1 )
S4 <- as.matrix(rst(n = 250 , xi = S4P[1], omega = S4P[2] , alpha = S4P[3] , nu =S4P[4] ), ncol = 1 )
namesRET <- c("S1","S2","S3","S4")
RET <- cbind(S1,S2,S3,S4)
d <- as.Date(1:nrow(RET))
RET<- xts(RET, order.by=d)
colnames(RET) <- namesRET
fsharpe <- as.numeric(cp2dp(cp=c(MeanTargetRET,SigmaTargetRET,0.07,0.3),family ="ST"))
ObmSharpe1RET <- function(w){
Portfolio <- RET%*%t(w)
fTarget <- function(x) dst(x,xi = fsharpe[1], omega = fsharpe[2], alpha =fsharpe[3] , nu = fsharpe[4])
fPortf <- kdensity(Portfolio)
KL <- function(x) fPortf(x)*log(fPortf(x)/fTarget(x))
return(integrate(KL , -0.25, 0.25 )$value)
}
rmindRET<- fmincon(x1, ObmSharpe1RET, heq = heq2 , lb = wmin1 , ub = wmax1)
rmindRET$par
rmindRET$value
Я никогда не ожидаю отрицательного значения, которое иногда могу иметь