los paquetes

library("quantmod")
library("fPortfolio")
library("fImport")
library("timeSeries")
library("PortfolioAnalytics")

Obtención de los datos desde Yahoo Finance

simbolos=c("IBM","AAPL","AMZN","MSFT")
getSymbols(simbolos,from="2000-1-1", to="2018-12-31")
## [1] "IBM"  "AAPL" "AMZN" "MSFT"
precios<- cbind(Ad(IBM),Ad(AAPL),Ad(AMZN),Ad(MSFT))
names(precios)<-c("IBM","AAPL","AMZN","MSFT")
head(precios)
##                 IBM     AAPL    AMZN     MSFT
## 2000-01-03 79.15391 2.665724 89.3750 42.11531
## 2000-01-04 76.46708 2.440975 81.9375 40.69265
## 2000-01-05 79.15391 2.476697 69.7500 41.12173
## 2000-01-06 77.78920 2.262367 65.5625 39.74422
## 2000-01-07 77.44802 2.369532 69.5625 40.26359
## 2000-01-10 80.51861 2.327857 69.1875 40.55718

Usando timeSeries

precios.ts <- as.timeSeries(precios)
seriesPlot(precios.ts[,"AAPL"])

returnPlot(precios.ts[,"AAPL"])

par(mfcol = c(2, 2))
seriesPlot(precios.ts)

par(mfcol = c(2, 2))
returnPlot(precios.ts)

Cálculo de retornos

retornos <- Return.calculate(precios, method = "log")
head(retornos)
##                    IBM        AAPL         AMZN         MSFT
## 2000-01-03          NA          NA           NA           NA
## 2000-01-04 -0.03453394 -0.08807814 -0.086884239 -0.034364039
## 2000-01-05  0.03453394  0.01452827 -0.161039341  0.010489231
## 2000-01-06 -0.01739164 -0.09051421 -0.061913535 -0.034072273
## 2000-01-07 -0.00439559  0.04628086  0.059221743  0.012983191
## 2000-01-10  0.03888130 -0.01774437 -0.005405419  0.007265244
retornos <- retornos[-1,]

Estadísticas Básicas

basicStats(retornos)
colMeans(retornos*100)
##         IBM        AAPL        AMZN        MSFT 
## 0.007215305 0.085128196 0.058731791 0.018094821
covarianza<-cov(retornos)
covarianza
##               IBM         AAPL         AMZN         MSFT
## IBM  0.0002647715 0.0001683675 0.0001726466 0.0001537189
## AAPL 0.0001683675 0.0007219236 0.0002929492 0.0002127249
## AMZN 0.0001726466 0.0002929492 0.0010978006 0.0002580928
## MSFT 0.0001537189 0.0002127249 0.0002580928 0.0003725299

Paquete PortfolioAnalytics

Especificación del portafolio

portafolio_spec <- portfolio.spec(colnames(retornos))

Restricción de inversión completa de modo que los pesos sumen 1

portafolio_spec <- add.constraint(portfolio = portafolio_spec,
                                  type = "full_investment")

Restricción larga de modo que el peso de un activo esté entre 0 y 1

portafolio_spec <- add.constraint(portfolio = portafolio_spec, 
                                  type = "long_only")

Objetivo para minimizar la desviación estándar de la cartera

portafolio_spec <- add.objective(portfolio = portafolio_spec, type = "risk",
                                 name = "StdDev")

Optimización de la cartera utilizando optimize_method = ROI".

Para ejecutar lo anterior es necesario instalar el paquete ROI y sus plugins ROI.plugin.glpk y ROI.plugin.quadprog.

portafolio_opt <- optimize.portfolio(retornos, portfolio =
                                       portafolio_spec,
                                     optimize_method = "ROI")
print(portafolio_opt)
## ***********************************
## PortfolioAnalytics Optimization
## ***********************************
## 
## Call:
## optimize.portfolio(R = retornos, portfolio = portafolio_spec, 
##     optimize_method = "ROI")
## 
## Optimal Weights:
##    IBM   AAPL   AMZN   MSFT 
## 0.6174 0.0724 0.0189 0.2913 
## 
## Objective Measure:
##  StdDev 
## 0.01496

Maximización de la función cuadrática de utilidad

Especificación del portafolio

portafolio_spec2 <- portfolio.spec(assets = colnames(retornos))

Restricción de inversión completa de modo que los pesos sumen 1

portafolio_spec2 <- add.constraint(portfolio = portafolio_spec2,
                                   type = "full_investment")

Restricción larga de modo que el peso de un activo esté entre 0 y 1

portafolio_spec2 <- add.constraint(portfolio = portafolio_spec2,
                                   type = "long_only")

Maximizar la devolución media de la cartera

portafolio_spec2 <- add.objective(portfolio = portafolio_spec2,
                                  type = "return", name = "mean")

Objetivo para minimizar la varianza del portafolio. La aversión al riesgo debe establecerse en 10.

portafolio_spec2 <- add.objective(portfolio = portafolio_spec2, type = "risk",
                                  name = "var", risk_aversion =10)
portafolio_opt2 <- optimize.portfolio(R = retornos, 
                                      portfolio = portafolio_spec2,
                                      optimize_method = "ROI")
print(portafolio_opt2)
## ***********************************
## PortfolioAnalytics Optimization
## ***********************************
## 
## Call:
## optimize.portfolio(R = retornos, portfolio = portafolio_spec2, 
##     optimize_method = "ROI")
## 
## Optimal Weights:
##    IBM   AAPL   AMZN   MSFT 
## 0.5627 0.1319 0.0357 0.2698 
## 
## Objective Measure:
##      mean 
## 0.0002226 
## 
## 
##  StdDev 
## 0.01504