1 votos

restricción de venta al descubierto con matriz no positiva-definida en la optimización de carteras

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?

1voto

wyatt Puntos 126

Por qué no utilizar simplemente PortfolioAnalytics, ya que si su matriz no es positiva definida tendrá problemas al utilizar enfoques que no sean de optimización.

He aquí un ejemplo extraído de mi blog: retmat es una matriz de rendimientos

library(PortfolioAnalytics)
moms_portfolio = portfolio.spec(assets=colnames(retmat))
cartera_de_madres = add.constraint(cartera=cartera_de_madres,type="full_investment")
cartera_de_madres = add.constraint(cartera=cartera_de_madres,type="long_only")
moms_portfolio = add.objective(portfolio=moms_portfolio,name="StdDev",type="risk")

/#Optimize (Puede querer cambiar a DEoptim o a otro optimizador si el ROI falla)

cartera_óptima = optimizar.cartera(retmat,cartera_mamá,método_de_optimización="ROI")

cartera_óptima = optimizar.cartera(retmat,cartera_mamá,método_de_optimización="DEoptim", search_size=5000, trace=TRUE, traceDE=0)

Edición 1: Documentación

ver aquí para la optimización general con Portfolio analytics: Viñeta de optimización de la cartera

Optimización de la cartera Con momentos y objetivos personalizados

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X