Práctica 5: Optimización de portafolios
De la sección anterior Obtención y Análisis de Rendimientos R, se analizaron los rendimientos de 6 acciones, las cuales se tomarán para este apartado.
Creación de la frontera eficiente
Para la optimización de portafolios y la obtención de la frontera
eficiente, es necesario hacer uso de la librería fPortfolio
. por
tanto, después de instalarla, se debe llamar.
Para conocer mas argumentos de la librería ver aquí
library('fPortfolio')
Para poder trazar la línea del mercado de capitales y entontrar el portafolio tangente a la frontera eficiente, debe definirse o encontrarse una tasa libre de riesgo, la cual dependerá del mercado en el que se encuentre, en este caso, como las acciones son del mercado de Estados Unidos, se trabajará con la tasa de los bonos a 10 años de este país. Esta tasa normalmente se entiende como una nominal anual, por lo que se debe encontar la correspondiente para la periodicidad en la que se tenga el portarfolio, en este caso, diaria.
rf=0.000029
Se deben confingurar los argumentos para que la función fPortfolio
optimice, es decir, cargar las especificaciones portfolioSpec()
del
programa optimizador en un objeto llamado espcartera
. Generalmente,
se configura la tasa libre de riesgo con la función
'setRiskFreeRate<-'()
, el número de puntos o portafolios que se
desean mostrar en la frontera eficiente con la función
'setNFrontierPoints<-'
y la restricción de no negatividad con la
función constraints="longOnly"
.
Los resultados del modelo mostraran los parámetros con los que se
configuró, por ejemplo; muestra en Type: MV
que el tipo de modelo
es el de Markowitz de mínima variaza. El programa optimizador
Optimize:minRisk
, es el que en su función objetivo minimiza el
riesgo, utilizando como estimador la matriz de covarianzas
Estimator:covEstimator
.
espcartera=portfolioSpec()
`setRiskFreeRate<-`(espcartera, 0.000029)
`setNFrontierPoints<-`(espcartera, 20)
constraints="longOnly"
Model List:
Type: MV
Optimize: minRisk
Estimator: covEstimator
Params: alpha = 0.05
Portfolio List:
Target Weights: NULL
Target Return: NULL
Target Risk: NULL
Risk-Free Rate: 2.9e-05
Number of Frontier Points: 50
Optim List:
Solver: solveRquadprog
Objective: portfolioObjective portfolioReturn portfolioRisk
Options: meq = 2
Trace: FALSE
Model List:
Type: MV
Optimize: minRisk
Estimator: covEstimator
Params: alpha = 0.05
Portfolio List:
Target Weights: NULL
Target Return: NULL
Target Risk: NULL
Risk-Free Rate: 0
Number of Frontier Points: 20
Optim List:
Solver: solveRquadprog
Objective: portfolioObjective portfolioReturn portfolioRisk
Options: meq = 2
Trace: FALSE
Luego, se crea un objeto Frontera
de clase fPortfolio
que creará
la frontera sobre los datos obtenidos de los rendimientos, esto se
realiza con la función portfolioFrontier()
. El objeto que configura
la optimización del portafolio espcartera
debe ser ajustado a los
datos de los rendimientos de las acciones con las que se esté trabajando
en el argumento spec =
, en este caso, serán los rendimientos
analizados en Obtención y Análisis de Rendimientos
R.
Los rendimientos tendrán que ser una serie de tiempo por lo que se
utiliza la función as.timeSeries()
sobre los rendimientos
Rdtos[-1,]
. se incluye dentro de la función el portafolio de mínima
varianza con el argumento include.mvl = TRUE
y el título del modelo
es title = "Cartera"
.
Esto producirá una serie de posibles portafolios que cumplen con la carcteristica de maximizar el rendimiento dados ciertos niveles de riesgo.
Frontera= portfolioFrontier(as.timeSeries(Rdtos[-1,]), spec = espcartera, include.mvl = TRUE, title = "Cartera")
print(Frontera)
Title:
MV Portfolio Frontier
Estimator: covEstimator
Solver: solveRquadprog
Optimize: minRisk
Constraints: LongOnly
Portfolio Points: 5 of 50
Portfolio Weights:
WMT.Adjusted PG.Adjusted NFLX.Adjusted KO.Adjusted JNJ.Adjusted
1 0.0000 0.0000 0.0000 1.0000 0.0000
13 0.0733 0.0000 0.0307 0.5271 0.3689
25 0.3101 0.0000 0.0849 0.2994 0.3057
37 0.4467 0.1130 0.1278 0.0915 0.2210
50 0.0000 0.0000 1.0000 0.0000 0.0000
Covariance Risk Budgets:
WMT.Adjusted PG.Adjusted NFLX.Adjusted KO.Adjusted JNJ.Adjusted
1 0.0000 0.0000 0.0000 1.0000 0.0000
13 0.0469 0.0000 0.0182 0.5967 0.3382
25 0.2869 0.0000 0.0772 0.3253 0.3106
37 0.4611 0.1181 0.1339 0.0793 0.2076
50 0.0000 0.0000 1.0000 0.0000 0.0000
Target Returns and Risks:
mean Cov CVaR VaR
1 0.0000 0.0186 0.0520 0.0266
13 0.0002 0.0153 0.0416 0.0218
25 0.0005 0.0139 0.0343 0.0192
37 0.0007 0.0140 0.0327 0.0168
50 0.0009 0.0248 0.0583 0.0376
Description:
Sun Aug 09 18:47:44 2020 by user: Natalia
Gráfico de la frontera eficiente
La función que permite crear el gráfico de la frontera es
frontierPlot()
, la cual se aplica sobre el objeto clase
fPortfolio
creado anteriormente, donde sus argumentos son: *
frontier="both"
para que contruya tanto la parte superior, como la
inferior de la frontera. * col = c("black", "black")
y cex=2
para el color y el tamano de los puntos que componen la frontera.
Para visualizar la nube de puntos verdes que conforman multiples parejas de riesgo y rendimiento, pero que nos on los óptimos, se utiliza la función
monteCarloPoints()
sobre el objetoFrontera
, con los mismos argumentos de las funciones para gráficos (colorescol= c("green", "green")
, tamañocex=0.5
, y tipo de gráficopch = 19
), además el argumentomcSteps = 500
indicará la cantidad puntos que desea ver, este argumento se puede cambiar por cualquier número.La línea del mercado de capitales se traza con la función
tangencyLines()
sobre el objetoFrontera
.Identificar el portafolio de mínima varianza (punto azul) se logra con la función
minvariancePoints()
, sobre el objetoFrontera
y se determina color tipo de gráfico y tamaño.Por último para visualizar el portafolio tangente, se utiliza la función
tangencyPoints()
sobreFrontera
y con los mismos atributos anteriores.
#dev.off() opcional si se desa borrar la ventana de gráficos
frontierPlot(Frontera, frontier = "both", col = c("black", "black"), cex=2)
monteCarloPoints(Frontera,col= c("green", "green"), mcSteps = 500, cex=0.5, pch = 19)
tangencyLines(Frontera)
minvariancePoints(Frontera, col="blue", pch=19, cex=2)
tangencyPoints(Frontera, col="red", cex= 2, pch=19)
![../../_images/output_10_08.png](../../_images/output_10_08.png)
Gráfico de los pesos para los portafolios
El gráfico de pesos de los portafolios, permite visualizar las acciones que aportan a los diferentes niveles de riesgo y rendimiento, cada color representa una acción, el tamaño vertical de las barras indica el peso que debe darse a cada una, para asumir el objetivo de riesgo (absisa superior) y el objetvo de rendimiento (absisa inferior); y debe leerse en cada una de las barras; por ejemplo, la primera barra de izquierda a derecha indica que para tener un rendimiento de -0.00146 y un riesgo de 0.0243, se debe invertir un 0.5% aprox. en BABA y un 99.5% en WBA. la línea negra, indica la barra de proporciones que tiene el portafolio de mínima varianza, para el cual habría que invertir un 25% aprox en BABA un 70% en WMT, un pequeño 1% aprox en WBA y un 4% aprox. en TSLA y nada en PEP no AAPL.
Para obtener este gráfico, se utliza la función weightsPlot()
sobre
el objeto Frontera
, con los colores definos por la paleta
col= qualiPalette(ncol(Rdtos), "Dark2")
col= qualiPalette(ncol(Rdtos), "Dark2")
weightsPlot(Frontera, col=col)
![../../_images/output_12_07.png](../../_images/output_12_07.png)