Siguiendo con la entrada anterior sobre portafolios de inversión con R, ahora calcularé la frontera eficiente, portafolio eficiente y el portafolio tangente u óptimo con el lenguaje de programación R (R language).
espcartera<-portfolioSpec()
setRiskFreeRate(espcartera)<- -0.001 ##Rentabilidad Activo Libre de Riesgo
setNFrontierPoints(espcartera) <- 20
Al no indicar las especificaciones de la cartera, la función portfolioSpec() toma los valores por defecto, por consiguiente, el tipo de modelo para calcular el portafolio eficiente es el de media-varianza (MV) o modelo de Markowitz.
Por otro lado, se debe especificar la tasa del activo libre de riesgo, la cual en el modelo de media-varianza influye en la conformación de los portafolios eficientes, y consecuentemente del portafolio óptimo o tangente.
Ahora añado algunas restricciones: supongamos que únicamente se permiten posiciones en largo (LongOnly):
constraints="LongOnly"
Frontera eficiente
Calculo y dibujo la frontera eficiente:
Frontera <- portfolioFrontier(as.timeSeries(Rendimientos),spec=espcartera,constraints )
Frontera
## ## Title: ## MV Portfolio Frontier ## Estimator: covEstimator ## Solver: solveRquadprog ## Optimize: minRisk ## Constraints: LongOnly ## Portfolio Points: 5 of 20 ## ## Portfolio Weights: ## AAPL XOM HD JPM JNJ ## 1 0.0000 1.0000 0.0000 0.0000 0.0000 ## 5 0.0132 0.3852 0.0000 0.0000 0.6016 ## 10 0.0940 0.1448 0.2063 0.0000 0.5549 ## 15 0.1697 0.0000 0.4640 0.0000 0.3663 ## 20 0.0000 0.0000 1.0000 0.0000 0.0000 ## ## Covariance Risk Budgets: ## AAPL XOM HD JPM JNJ ## 1 0.0000 1.0000 0.0000 0.0000 0.0000 ## 5 0.0094 0.4191 0.0000 0.0000 0.5715 ## 10 0.0978 0.1384 0.2165 0.0000 0.5474 ## 15 0.1880 0.0000 0.5472 0.0000 0.2649 ## 20 0.0000 0.0000 1.0000 0.0000 0.0000 ## ## Target Returns and Risks: ## mean Cov CVaR VaR ## 1 0.0002 0.0116 0.0273 0.0189 ## 5 0.0003 0.0089 0.0209 0.0140 ## 10 0.0005 0.0085 0.0205 0.0142 ## 15 0.0007 0.0093 0.0219 0.0148 ## 20 0.0009 0.0125 0.0283 0.0201
frontierPlot(Frontera)
grid()
tangencyPoints(Frontera, pch = 19, col = "red", cex=2)
tangencyLines(Frontera, col="darkgreen", pch=19, cex=2)
minvariancePoints(Frontera, col="blue", pch=19, cex=2)
monteCarloPoints(Frontera, mCsteps=500, col="green", cex=0.001)
En el gráfico de la frontera eficiente, los círculos negros corresponden a portafolios eficientes; el punto rojo representa el portafolio tangente y el punto azul el portafolio con la menor varianza, esto es, el punto con el riesgo más pequeño de la frontera eficiente, denominado portafolio con la mínima varianza global (Minimum Variance Portfolio – MVP).
Los puntos verdes corresponden a posibles portafolios generados mediante simulación de Montecarlo y la línea de color verde oscuro representa la línea tangente, que como se ve, sobre esta se encuentra el portafolio tangente.
Portafolio o cartera eficiente
A continuación, dibujo los pesos de los portafolios ubicados en la frontera eficiente:
col <- qualiPalette(ncol(Rendimientos), "Dark2")
weightsPlot(Frontera, col=col)
Calculo un portafolio o cartera eficiente, el cual como se ha expuesto anteriormente, es un portafolio que se encuentra en la frontera eficiente:
efPortfolio <- efficientPortfolio(as.timeSeries(Rendimientos),espcartera,constraints)
efPortfolio
## ## Title: ## MV Efficient Portfolio ## Estimator: covEstimator ## Solver: solveRquadprog ## Optimize: minRisk ## Constraints: LongOnly ## ## Portfolio Weights: ## AAPL XOM HD JPM JNJ ## 0.0810 0.1878 0.1660 0.0000 0.5651 ## ## Covariance Risk Budgets: ## AAPL XOM HD JPM JNJ ## 0.0810 0.1878 0.1660 0.0000 0.5651 ## ## Target Returns and Risks: ## mean Cov CVaR VaR ## 0.0005 0.0085 0.0204 0.0140
Calculo el portafolio o cartera tangente, el cual es el portafolio con la relación rentabilidad-riesgo más alta de la frontera eficiente.
Este cálculo, se realiza minimizando el ratio o índice de Sharpe (Sharpe Ratio) para una tasa libre de riesgo dada, por lo que se obtiene el portafolio con el ratio de Sharpe más elevado. El ratio de Sharpe muestra la rentabilidad ajustada por la tasa libre de riesgo y el riesgo de la covarianza.
tgPortfolio <- tangencyPortfolio(as.timeSeries(Rendimientos),espcartera,constraints)
tgPortfolio
## ## Title: ## MV Tangency Portfolio ## Estimator: covEstimator ## Solver: solveRquadprog ## Optimize: minRisk ## Constraints: LongOnly ## ## Portfolio Weights: ## AAPL XOM HD JPM JNJ ## 0.1456 0.0000 0.3717 0.0000 0.4827 ## ## Covariance Risk Budgets: ## AAPL XOM HD JPM JNJ ## 0.1613 0.0000 0.4300 0.0000 0.4086 ## ## Target Returns and Risks: ## mean Cov CVaR VaR ## 0.0007 0.0089 0.0211 0.0142
Grafico el portafolio eficiente y portafolio tangente:
weightsPie(efPortfolio, col=col )
mtext(text = "Portafolio eficiente", side = 3, line = 1.5,
font = 2, cex = 0.7, adj = 0)
weightsPie(tgPortfolio, col=col)
mtext(text = "Portafolio tangente", side = 3, line = 1.5,
font = 2, cex = 0.7, adj = 0)
Por lo anterior, la cartera o portafolio eficiente estaría conformado por:
- Acción de AAPL con un peso del 8.1%.
- Acción de XOM con un peso del 18.78%.
- Acción de HD con un peso del 16.6%.
- Acción de JNP con un peso del 56.51%.
Portafolio o cartera tangente
Por último, la cartera o portafolio tangente estaría conformado por:
- Acción de AAPL con un peso del 14.56%.
- Acción de HD con un peso del 37.17%.
- Acción de JNP con un peso del 48.27%.
Para aprender más casos prácticos de finanzas cuantitativas ve a la página donde hablo de ello y donde encontrarás más aplicaciones de R para finanzas.
¿Te ha parecido útil? ¡Puntúa esta entrada!
¡Haz clic en una estrella para puntuar!
Promedio de puntuación 5 / 5. Recuento de votos: 11
Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.
4 comentarios en “Análisis y optimización de portafolios con R (II)”
Buenas tardes Conney. Estoy implementando este código para una cartera de 6 acciones: Coca Cola (KO), Verizon(VZ), Air Liquide(AI.PA), Bureau Veritas(BVI.PA), EDP(EDP.LS) y ERG(ERG.MI).
Me encuentro con el problema de que la serie de cotizaciones descargadas de AI.PA, BVI.PA y ERG.MI me salen con dos valores NA. Y a raíz de ello, no me calcula determinadas cosas: al construir el data.frame con el rendimiento esperado y la desviación típica, para esos títulos me aparece como valor NA, el valor de las varianzas individuales de esos activos es también NA, en las matrices de covarianzas y de correlaciones aparecen, para esos activos, NA’s y el heatmap no se genera. A partir de ahí, la cartera eficiente y la cartera tangente se generan teniendo en cuenta exclusivamente los activos que no tienen NA (KO, VZ y EDP.LS).
He probado en el objeto Rendimientos a interpolar los NA’s sustituyéndolos por la media y a guardarlo en un nuevo objeto llamado Rendimientos1. De esa manera, al hacer summary(Rendimientos1), se eliminan los NA`s de esos 4 títulos pero posteriormente no me deja construir RendimientoPromedio porque no me deja hacer mean(Rendimientos1$KO), etc) porque sale un error diciendo $ is invalid in atomic operators.
He intentado también en la serie descargada eliminar o interpolar los valores faltantes pero a la hora de calcularse Rendimientos, me siguen saliendo dos NA’s.
¿Sabes cómo puedo solucionar el problema de los NA en las series de cotizaciones de esos tres títulos?
Muchas gracias.
Excelente, muy bueno
y para agregarle el indice de Sharpe, como habria que hacerlo????
Pudiste agregar el índice de sharpe
Cómo se podría poner de restricción, por ejemplo, que los pesos relativos de los activos no sean menores al 5%? (O asegurar que al menos se invierta un 5% en todos los activos de la cartera)