He aquí un acertijo interesante.optimización quadprog
A continuación se muestra un R snippet que identifica el punto de tangencia de una función cuadrática con respecto a una línea dibujada desde el punto (0, rf) en el eje y.
Para aquellos que están familiarizados con la teoría de la cartera, este punto es a cambio y el espacio de riesgo y la solución es un conjunto de pesos que definen la cartera de tangencia (relación máxima de afilado). El fragmento permite pesos negativos (es decir, shorts) y hay una restricción de peso igualdad que requiere la suma de los pesos = 1.
require(quadprog)
# create artifical data
nO <- 100 # number of observations
nA <- 10 # number of assets
mData <- array(rnorm(nO * nA, mean = 0.001, sd = 0.01), dim = c(nO, nA))
rf <- 0.0001 # riskfree rate (2.5% pa)
mu <- apply(mData, 2, mean) # means
mu2 <- mu - rf # excess means
# qp
aMat <- as.matrix(mu2)
bVec <- 1 # set expectation of portfolio excess return to 1
zeros <- array(0, dim = c(nA,1))
solQP <- solve.QP(cov(mData), zeros, aMat, bVec, meq = 1)
# rescale variables to obtain weights
w <- as.matrix(solQP$solution/sum(solQP$solution))
# compute sharpe ratio
SR <- t(w) %*% mu2/sqrt(t(w) %*% cov(mData) %*% w)
Mi pregunta - cómo adaptar el código para resolver el conjunto óptimo de ponderaciones tales que la suma de ponderaciones se sume a un número arbitrario (incluido el caso de esquina de una cartera autofinanciada donde la suma de ponderaciones = 0) en oposición a la unidad?
Alternativamente, podría considerar agregar un elemento 'efectivo' a la matriz de covarianza con varianza-covarianza de 0, y agregar una restricción de igualdad que requiera el peso en efectivo = 1. Sin embargo, esta matriz no sería positiva semi-definida . También sospecho que los pesos no monetarios podrían ser trivialmente cero.
Dentro de su llamada 'solveQP', no veo una restricción que obligue a los pesos a sumar uno. En cambio, 'aMat, bVec, meq = 1' requiere que el exceso de su cartera sea uno, que puede verificar con' sum (aMat * solQP $ solution) '. Dentro de tu llamada 'solve.QP', ¿no deberías estar usando un vector de unos en lugar de' aMat'? – flodel
@flodel - estás en lo correcto. Typo arreglado, buena captura –