R para finanzas y economía

Análisis y optimización de portafolios con R (II)

5
(7)

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)

plot of chunk unnamed-chunk-67

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)

plot of chunk unnamed-chunk-68

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)

plot of chunk unnamed-chunk-71

weightsPie(tgPortfolio, col=col)
mtext(text = "Portafolio tangente", side = 3, line = 1.5,
        font = 2, cex = 0.7, adj = 0)

plot of chunk unnamed-chunk-71

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: 7

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

3 Comments

  • Reply
    Rubén Encinas
    12 agosto, 2020 at 5:05 pm

    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.

  • Reply
    Leinad
    3 julio, 2020 at 3:20 am

    Excelente, muy bueno
    y para agregarle el indice de Sharpe, como habria que hacerlo????

  • Reply
    Hugo Reyes
    8 diciembre, 2019 at 3:40 am

    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)

Leave a Reply

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.