9 votos

Optimización de una cartera de ETF

Soy consciente de cómo hacer la optimización de la cartera de media o mínima variación con restricciones como

  • los pesos deben sumar a 1.0
  • no se vende a corto plazo
  • peso máximo en cualquier teletipo

utilizando técnicas básicas de programación cuadrática. Sin embargo, estoy perplejo por lo siguiente:

Mi universo de teletipos consiste en ETFs. Digamos que quiero restricciones de la forma:

  • no más del 20% de la cartera en fondos de bonos (hay muchos fondos de bonos posibles)
  • no más del 30% de la cartera en los fondos de una clase de activos (por ejemplo, bienes raíces)

¿Cómo puedo llevar a cabo tal optimización de la cartera?

8voto

naumcho Puntos 2830

Utilizando solve.QP en R, un enfoque directo es añadir un vector de exposición binario como una restricción de desigualdad a su Amat para cada grupo que desee restringir.

La única pega es que los valores de la exposición y b_0 Los vectores deben ser negativos, ya que la función realmente satisface las restricciones: A^T b >= b_0 .

Para un ejemplo simple de media-varianza con dos grupos que queremos restringir:

library(quadprog)
library(MASS)

# Generate some returns
set.seed(100)
n <- 100   # number of assets
m <- 200   # number of states of the world
rho <- 0.7
sigma <- 0.2
mu <- .1
Cov <- matrix(rho*sigma*sigma, ncol=n, nrow=n)
diag(Cov) <- rep(sigma*sigma, n)
S <- 1 + matrix(mvrnorm(m, rep(mu, n), Sigma=Cov), ncol=n)

# Calculate a covariance matrix
Cov <- var(S)

# Setup quadratic problem
mu <- apply(S, 2, mean)
mu.target <- mean(mu)
bLo <- rep(0, n)

# Define group membership (arbitrary example)
group1 <- matrix(0,100)
group2 <- matrix(0,100)
group3 <- matrix(0,100)

group1[mu <= mean(mu) - .005] <- -1    
group2[mu > (mean(mu) - .005) & mu <= (mean(mu) + .005)] <- -1
group3[mu > mean(mu) + .005] <- -1

Amat <- rbind(1, mu)
dim(bLo) <- c(n,1)    
bvec <- t(rbind(1, mu.target, bLo))
zMat <- diag(n)
Amat <- t(rbind(Amat, zMat))
Dmat <- Cov
dvec <- rep(0, nrow(Amat))
meq <- 2  # the first two columns are equality constraints

sol <- solve.QP(Dmat=Dmat, dvec=dvec, Amat=Amat, bvec=bvec, meq)

cat(paste("Without group constraints:\n"))
data.frame(Group1=sum(sol$solution * -group1), Group2=sum(sol$solution * -group2), Group3=sum(sol$solution * -group3))

# Add group constraints:
#   Group1 <= 20%
#   Group2 <= 30%
Amat <- rbind(1, mu, t(group1), t(group2))
dim(bLo) <- c(n,1)    
bvec <- t(rbind(1, mu.target, -.20, -.30, bLo))
zMat <- diag(n)
Amat <- t(rbind(Amat, zMat))
Dmat <- Cov
dvec <- rep(0, nrow(Amat))

sol <- solve.QP(Dmat=Dmat, dvec=dvec, Amat=Amat, bvec=bvec, meq)

cat(paste("With group constraints:\n"))
data.frame(Group1=sum(sol$solution * -group1), Group2=sum(sol$solution * -group2), Group3=sum(sol$solution * -group3))

Pesos de grupo:

                     1      2      3  
Without constraints  26.4%  53.1%  20.4%  
With constraints     20.0%  30.0%  50.0%

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