Necesito ayuda sobre la optimización de carteras en R. Tengo una matriz invertida y quiero usarla como entrada en la optimización de carteras. Antes de manipularla era no positiva definida. En la teoría de selección de carteras necesitamos la matriz invertida que ya tengo. El problema para mí es imponer una restricción de no negatividad (venta corta prohibida) en los pesos. En los paquetes de optimización tradicionales tenemos que poner la matriz de covarianza y se resuelve. No quiero lidiar con la matriz de covarianza utilizando una técnica diferente. Ya he invertido la matriz. El objetivo para mí para resolver los códigos de selección de cartera con la colocación de la matriz de covarianza invertida (matriz de precisión) bajo la restricción de no negatividad (cada elemento del vector de peso debe ser positivo) Que método debo utilizar no lo sé. Si me ayudan, estaría muy contento..
Este es mi trabajo hasta ahora:
Estoy tratando de construir un vector de pesos de la cartera para minimizar la varianza de los rendimientos.
w =argmin w' w
s. t. w'I = 1 #weights sum up to 1
w'= #target expected return
w0 #non-negativity(short-sale) constraint
donde w es el vector de pesos, matriz de covarianza.
optimization<-function(returns) {
p <- ncol(x) #number of assets
n <- nrow(x) #number of observations
x <- matrix(data$return,n,assets)
mean <- colMeans(na.rm=FALSE,x)
M <- as.integer(10) #nuber of ports on the eff.front.
S <- cov(x) #covariance matrix
Rmax<- 0.01 #max monthly return value
Dmat <- solve(S) #inverse of covariance matrix
u <- rep(1,p) #vector of ones
These codes are for the Lagrange solutions
a<- matrix(rep(0,4), nrow=2)
a[1,1] <- t(u)%*% Dmat %*%u
a[1,2] <- t(mean)%*%Dmat%*%u
a[2,1] <- a[1,2]
a[2,2] <- t(mean)%*%Dmat%*%mean
d <- a[1,1]*a[2,2]-a[1,2]*a[1,2]
f <- (Dmat%*%(a[2,2]*u-a[1,2]*mean))/d
g <- (Dmat%*%(-a[1,2]*u+a[1,1]*mean))/d
r <- seq(0, Rmax, length=M)
w <- matrix((rep(0, p*M)), nrow=p)
Intenté encontrar pesos no negativos utilizando los siguientes códigos:
for(i in 1:M) { w[,i] = f+r[i]*g #portfolio weights
if (w[,i] <0) {w[,i]=0} else {w[,i]=w[,i]}
}
Además, he intentado hacer un bucle utilizando la función 'while' en R.
while (w> 0)
{ for(i in 1:M) { w[,i] = f+r[i]*g }
print(w)
}
Lamentablemente, no pude conseguir los pesos positivos. Hay otra solución para obtener los pesos positivos?