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

Extracción de las ponderaciones

extractWeights(portafolio_opt)
##  COCA-COLA       AAPL        IBM       AMZN 
## 0.63544969 0.04250320 0.29050855 0.03153856

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