Tengo un conjunto de datos con 5 activos.
Aplico la cartera de media-varianza:
In<-rep(1,5) #identity vector
delta <- 5 #risk aversion parameter
covariance<-cov(sample.data) #covariance matrix
mu <- colMeans(sample.data) #mean returns
mu <- t(t(mu))
#I calculate the standard mean-variance weights:
xt <- 1/delta* solve(covariance) %*% mu
m.w <- as.vector(xt) / In %*% xt %*% t(In)
Mi problema es que a veces puede ocurrir que el denominador: In %*% xt #%*% t(In)
es un número negativo.
Tomemos el siguiente ejemplo con 5 activos:
Mean returns: 6, 6, 1, 1, 1
Standard deviation of returns: 1, 1, 1, 1, 1
Las carteras con una media de 6 son claramente superiores, pero el cálculo de la media-varianza a veces acaba poniendo grandes pesos negativos en los mejores activos.
Esto sucede por la siguiente razón:
Calculando xt
resultados en:
5.264789 6.134487 -5.267289 -3.337918 -2.79493
El denominador ( In %*% xt #%*% t(In)
) es:
-0.0008615427 -0.0008615427 -0.0008615427 -0.0008615427 -0.0008615427
Como este denominador es negativo y un número realmente pequeño, los pesos finales acaban siendo:
-6110.886 -7120.352 6113.787 3874.351 3244.1
Está claro que debería ser al revés.
¿Qué me falta?
EDIT: noob2 sugirió que el problema podría ser que la matriz de covarianza es ligeramente definida negativa, pero no lo es:
> eigen(covariance)
$values
[1] 4.90387493 0.12627889 0.11649928 0.09035977 0.07858112
$vectors
[,1] [,2] [,3] [,4] [,5]
[1,] -0.4529396 0.7235119 -0.1188464 -0.01716486 -0.50690946
[2,] -0.4664390 -0.2146771 -0.1914489 -0.81623850 0.18289445
[3,] -0.4511018 -0.6111482 -0.3089085 0.39903609 -0.41030564
[4,] -0.4289843 0.2157315 -0.2459586 0.41078039 0.73498045
[5,] -0.4356145 -0.1019909 0.8906754 0.07409282 0.03233327
Aquí hay algunos datos de ejemplo con las propiedades descritas anteriormente:
https://www.dropbox.com/s/t3212c5sq7w1uug/example.Rdata?dl=0