library("quantmod")
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Version 0.4-0 included new data defaults. See ?getSymbols.
library("timeSeries")
## Loading required package: timeDate
##
## Attaching package: 'timeSeries'
## The following object is masked from 'package:zoo':
##
## time<-
library("tseries")
library('fBasics')
##
## Attaching package: 'fBasics'
## The following object is masked from 'package:TTR':
##
## volatility
library('fAssets')
library('fPortfolio')
library('PerformanceAnalytics')
##
## Attaching package: 'PerformanceAnalytics'
## The following objects are masked from 'package:timeDate':
##
## kurtosis, skewness
## The following object is masked from 'package:graphics':
##
## legend
library('PortfolioAnalytics')
## Loading required package: foreach
simbolos<-c("KO","AAPL","IBM","AMZN")
getSymbols(simbolos, from="2000-01-01", to="2020-06-21")
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
##
## This message is shown once per session and may be disabled by setting
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
## [1] "KO" "AAPL" "IBM" "AMZN"
head(KO)
## KO.Open KO.High KO.Low KO.Close KO.Volume KO.Adjusted
## 2000-01-03 29.00000 29.00000 27.62500 28.18750 10997000 11.90722
## 2000-01-04 28.18750 28.40625 27.81250 28.21875 7308000 11.92042
## 2000-01-05 28.21875 28.71875 28.03125 28.46875 9457400 12.02603
## 2000-01-06 28.46875 28.84375 28.28125 28.50000 7129200 12.03923
## 2000-01-07 28.93750 30.37500 28.93750 30.37500 11474000 12.83128
## 2000-01-10 30.37500 30.46875 29.37500 29.40625 8723800 12.42205
chartSeries(Cl(KO),theme = chartTheme("white"))

activos<- merge.xts(KO[,6],AAPL[,6],IBM[,6],AMZN[,6])
colnames(activos)<-c("COCA-COLA","AAPL","IBM","AMZN")
head(activos)
## COCA-COLA AAPL IBM AMZN
## 2000-01-03 11.90722 3.460857 74.62083 89.3750
## 2000-01-04 11.92042 3.169071 72.08791 81.9375
## 2000-01-05 12.02603 3.215448 74.62083 69.7500
## 2000-01-06 12.03923 2.937188 73.33427 65.5625
## 2000-01-07 12.83128 3.076317 73.01262 69.5625
## 2000-01-10 12.42205 3.022212 75.90739 69.1875
Representación Gráfica
activos.ts <-as.timeSeries(activos)
seriesPlot(activos.ts[,'AAPL'])

returnPlot(activos.ts[,'AAPL'])

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

Obtención de los retornos usando returns de timeseries
cartera.retornos<- returns(activos)
head(cartera.retornos)
## COCA-COLA AAPL IBM AMZN
## 2000-01-03 NA NA NA NA
## 2000-01-04 0.001108125 -0.08807776 -0.034533360 -0.086884239
## 2000-01-05 0.008820489 0.01452821 0.034533360 -0.161039341
## 2000-01-06 0.001096934 -0.09051403 -0.017391566 -0.061913535
## 2000-01-07 0.063715627 0.04628044 -0.004395796 0.059221743
## 2000-01-10 -0.032412421 -0.01774409 0.038881808 -0.005405419
cartera.retornos<-cartera.retornos[-1,]
head(cartera.retornos)
## COCA-COLA AAPL IBM AMZN
## 2000-01-04 0.001108125 -0.08807776 -0.034533360 -0.086884239
## 2000-01-05 0.008820489 0.01452821 0.034533360 -0.161039341
## 2000-01-06 0.001096934 -0.09051403 -0.017391566 -0.061913535
## 2000-01-07 0.063715627 0.04628044 -0.004395796 0.059221743
## 2000-01-10 -0.032412421 -0.01774409 0.038881808 -0.005405419
## 2000-01-11 0.033440784 -0.05250555 0.008439130 -0.035865913
basicStats(cartera.retornos)
## COCA.COLA AAPL IBM AMZN
## nobs 5148.000000 5148.000000 5148.000000 5148.000000
## NAs 0.000000 0.000000 0.000000 0.000000
## Minimum -0.106038 -0.731247 -0.168916 -0.284568
## Maximum 0.129971 0.130194 0.113537 0.296181
## 1. Quartile -0.005526 -0.010417 -0.007122 -0.012044
## 3. Quartile 0.006346 0.012926 0.007613 0.013732
## Mean 0.000263 0.000897 0.000096 0.000660
## Median 0.000432 0.000892 0.000261 0.000497
## Sum 1.351931 4.615617 0.495446 3.398867
## SE Mean 0.000187 0.000371 0.000233 0.000450
## LCL Mean -0.000104 0.000170 -0.000361 -0.000223
## UCL Mean 0.000630 0.001624 0.000553 0.001543
## Variance 0.000180 0.000708 0.000280 0.001044
## Stdev 0.013435 0.026610 0.016727 0.032312
## Skewness -0.175670 -4.192186 -0.228197 0.448143
## Kurtosis 9.329269 114.316109 8.497049 12.578062
Cartera Eficiente
cartera.optima <- portfolio.optim(cartera.retornos)
ponderacion<-cartera.optima$pw
names(ponderacion)<-colnames(cartera.retornos)
ponderacion
## COCA-COLA AAPL IBM AMZN
## 0.62343295 0.28167301 0.00000000 0.09489405
cartera.optima$pm
## [1] 0.0004789171
cartera.optima$ps
## [1] 0.01368731
chart.CumReturns(cartera.retornos, legend.loc = 'topleft', main = '')

plot(portfolioFrontier(as.timeSeries(cartera.retornos)),which=1)

plot(portfolioFrontier(as.timeSeries(cartera.retornos)),which=1)
plot(portfolioFrontier(as.timeSeries(cartera.retornos)),which=3)

Minimización de la función de riesgo de la cartera
Especificación de un objeto de cartera.
portafolio_spec <- portfolio.spec(colnames(cartera.retornos))
print.default(portafolio_spec)
## $assets
## COCA-COLA AAPL IBM AMZN
## 0.25 0.25 0.25 0.25
##
## $category_labels
## NULL
##
## $weight_seq
## NULL
##
## $constraints
## list()
##
## $objectives
## list()
##
## $call
## portfolio.spec(assets = colnames(cartera.retornos))
##
## attr(,"class")
## [1] "portfolio.spec" "portfolio"
Adición de restricciones al objeto de cartera
Adición de restricción de inversión completa que especifica que los pesos deben sumar 1.
portafolio_spec <- add.constraint(portfolio = portafolio_spec,type = "full_investment")
Adición de restricción de inversión larga
portafolio_spec <- add.constraint(portfolio = portafolio_spec, type = "long_only")
Definición del objetivo de minimización de Riesgo
portafolio_spec <- add.objective(portfolio = portafolio_spec, type = "risk",name = "StdDev")
Optimización del portafolio
portafolio_opt <- optimize.portfolio(cartera.retornos, portfolio = portafolio_spec,optimize_method = "ROI")
## Registered S3 method overwritten by 'ROI':
## method from
## print.constraint PortfolioAnalytics
Visualización de resultados
print(portafolio_opt)
## ***********************************
## PortfolioAnalytics Optimization
## ***********************************
##
## Call:
## optimize.portfolio(R = cartera.retornos, portfolio = portafolio_spec,
## optimize_method = "ROI")
##
## Optimal Weights:
## COCA-COLA AAPL IBM AMZN
## 0.6354 0.0425 0.2905 0.0315
##
## Objective Measure:
## StdDev
## 0.01191
Gráfica de las ponderaciones
chart.Weights(portafolio_opt)

Maximización de la función cuadrática de utilidad
Especificación de un objeto de cartera.
portafolio_spec2 <- portfolio.spec(assets = colnames(cartera.retornos))
Adición de restricción de inversión completa que especifica que los pesos deben sumar 1.
portafolio_spec2 <- add.constraint(portfolio = portafolio_spec2,type = "full_investment")
Adición de restricción de inversión larga
portafolio_spec2 <- add.constraint(portfolio = portafolio_spec2,
type = "long_only")
Definición del objetivo de maximización de la funcióón de utilidad
portafolio_spec2 <- add.objective(portfolio = portafolio_spec2,
type = "return", name = "mean")
Definición del objetivo de minimización del riesgo
portafolio_spec2 <- add.objective(portfolio = portafolio_spec2, type = "risk",
name = "var", risk_aversion =10)
Optimización del portafolio
portafolio_opt2 <- optimize.portfolio(R = cartera.retornos, portfolio = portafolio_spec2,
optimize_method = "ROI")
Visualización de resultados
print(portafolio_opt2)
## ***********************************
## PortfolioAnalytics Optimization
## ***********************************
##
## Call:
## optimize.portfolio(R = cartera.retornos, portfolio = portafolio_spec2,
## optimize_method = "ROI")
##
## Optimal Weights:
## COCA-COLA AAPL IBM AMZN
## 0.6380 0.1007 0.2139 0.0475
##
## Objective Measure:
## mean
## 0.0003097
##
##
## StdDev
## 0.01203