2 votos

Cálculo de la frontera eficiente a partir de los rendimientos esperados y la DS

Estoy tratando de calcular la frontera eficiente (y la cartera óptima en la relación de Sharpe) dados dos vectores para una cartera: (1) rendimientos esperados y (2) desviaciones estándar históricas. Me gustaría ser capaz de calcular esto en R. Usando el portfolioFrontier() función del fPortfolio en R, he calculado con éxito la frontera eficiente y la asignación óptima de la cartera en la relación de Sharpe utilizando una serie temporal de rendimientos históricos. Sin embargo, el fPortfolio parece que sólo permite realizar pruebas retrospectivas en una serie temporal. Me gustaría calcular la frontera eficiente y la cartera óptima en la relación de Sharpe para rendimientos futuros (es decir, esperados). ¿Cómo puedo hacerlo?

Lo ideal sería implementar esto con una función en R. El recurso más cercano que pude encontrar fue de este sitio web utilizando el código de Octave. He traducido con éxito el código a R, pero la frontera eficiente no parece coincidir (o ser tan precisa) como la del paquete R.

Aquí está mi intento en R (traduciendo el código de Octave del sitio web anterior):

expectedReturns <- c(4, 2, 13, 10)
covarianceMatrix <- matrix(c(185, 86.5, 80, 20, 86.5, 196, 76, 13.5, 80, 76, 411, -19, 20, 13.5, -19, 25), nrow=4, ncol=4, byrow=TRUE)

# Calculate Efficient Frontier
unity <- rep(1, length(expectedReturns))
A <- unity %*% solve(covarianceMatrix) %*% unity
B <- unity %*% solve(covarianceMatrix) %*% expectedReturns
C <- expectedReturns %*% solve(covarianceMatrix) %*% expectedReturns
D <- A*C-B^2

mu = seq(0, 30, by=.1)
minVar = ((A*mu^2)-2*B*mu+C)/D
minSD = sqrt(minVar)

plot(minSD, mu)

0 votos

Tal vez esto pueda ayudarte: quant.stackexchange.com/questions/21464/

0 votos

Dice que sólo quiere introducir las desviaciones estándar, pero ¿qué pasa con las correlaciones?

0 votos

Tal vez la función mvFrontier en la versión devel del paquete NMOF hace lo que tú quieres: github.com/enricoschumann/NMOF/blob/master/R/ En cuanto a las entradas, m son los rendimientos esperados y var es la matriz de covarianza.

3voto

BigCanOfTuna Puntos 210

Como se indica en mi comentario, la función mvFrontier en la versión de desarrollo del NMOF paquete puede ayudar a usted. (Revelación: soy el encargado de mantener el paquete). puede obtener el última versión de GitHub .

Algunas observaciones, primero sobre la correlación: una frontera eficiente frontera eficiente muestra el riesgo de la cartera, normalmente la volatilidad en comparación con el rendimiento de la cartera. La volatilidad de la cartera es función de las volatilidades de los activos y de la de los activos y de la correlación de los rendimientos entre estos activos, por lo que no se puede eliminar la correlación.

La matriz de varianza-covarianza puede descomponerse en el producto (matricial) S veces C veces S en el que S es una matriz diagonal con las desviaciones estándar en su diagonal principal y ceros en el resto, y en la que C es la matriz de correlación.

Suponga que tiene las siguientes previsiones:

na <- 4                            ## number of assets 
vols <- c(0.10, 0.15, 0.20, 0.22)  ## forecast vols
m <- c(0.06, 0.12, 0.09, 0.07)     ## forecast returns

Entonces, una matriz de covarianza para una correlación constante de 0,5 puede calcularse de esta manera:

const_cor <- function(rho, na) {
    C <- array(rho, dim = c(na, na))
    diag(C) <- 1
    C
}
var <- diag(vols) %*% const_cor(0.5, na) %*% diag(vols)

Por lo tanto, es posible que desee experimentar con diferentes supuestos sobre las correlaciones: es difícil es difícil encontrar matrices de correlación arbitrarias válidas, pero pero lo que funciona es la correlación positiva constante (es decir, todas es decir, todas las correlaciones entre pares son 0,1, o 0,2, ...). Dependiendo de los datos reales, la correlación puede hacer poca diferencia en los resultados (véase este nota por ejemplo).

Otra observación, sobre las derivaciones matriciales (como en el enlace que has proporcionado): Yo preferiría abordar el problema como un problema de optimización en lugar de seguir unas enfoque analítico. La ventaja es que puedes querer introducir restricciones (no permitir pizarras cortas por ejemplo), lo que resulta más difícil con el enfoque analítico. analítico.

Así que este sería un ejemplo para llamar a mvFrontier :

library("NMOF")
wmax <- 1     ## maximum holding size
wmin <- 0.0   ## minimum holding size
rf <- 0.02

## without cash
p1 <- mvFrontier(m, var, wmin = wmin, wmax = wmax, n = 50)

## with cash
p2 <- mvFrontier(m, var, wmin = wmin, wmax = wmax, n = 50, rf = rf)

plot(p1$volatility, p1$return, pch = 19, cex = 0.5, type = "o",
     xlab = "Expected volatility",
     ylab = "Expected return")
lines(p2$volatility, p2$return, col = grey(0.5))
abline(v = 0, h = rf)

frontiers

0voto

Horatio Alderaan Puntos 1635

Lo mismo puede lograrse para el paquete fPortfolio utilizando SetEstimator. Ejemplo de ello:

expectedReturns <- c(4, 2, 13, 10)
covarianceMatrix <- matrix(c(185, 86.5, 80, 20, 86.5, 196, 76, 13.5, 80, 76, 411, -19, 20, 13.5, -19, 25), nrow=4, ncol=4, byrow=TRUE)

covtEstimator <- function (x,data,spec) {
x.mat = as.matrix(x)
list(mu=expectedReturns,Sigma=covarianceMatrix)
}

# Calculate Efficient Frontier
defaultSpec <- portfolioSpec()
setEstimator(defaultSpec) <- 'covtEstimator'
efficientPortfolio(yourreturndata, defaultSpec, constraints = "LongOnly")

Referencia adicional : Página 293 en este pdf

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