# To clean up the memory of your current R session run the following line
rm(list=ls(all=TRUE))

library(quantmod)
library(xts)

#Importing Price Data
data.AMZN <- getSymbols("AMZN", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)
data.MSFT <- getSymbols("MSFT", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)
data.AAPL <- getSymbols("AAPL", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)
data.TSLA <- getSymbols("TSLA", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)
data.IBM <- getSymbols("IBM", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)
data.FB <- getSymbols("FB", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)
#to = "2013-12-31" in the book was replaced by to = "2014-01-01"
#B/c that code doesn't produce the output that includes stock price of 2013-12-31the date. 

multi <- data.AMZN[, 6] # Need to create a new data object before cbinding
multi <- cbind(multi, data.MSFT[, 6], data.AAPL[, 6], data.TSLA[, 6], data.IBM[, 6], data.FB[, 6])

Step 1: Find First and Last Adjusted Closing Price for Each Security Over the Investmet Period

period.ret <- multi[c(1, nrow(multi)), ]
period.ret
##            AMZN.Adjusted MSFT.Adjusted AAPL.Adjusted TSLA.Adjusted
## 2013-12-31        398.79      33.91713      74.57128        150.43
## 2017-09-29        961.35      74.49000     154.11999        341.10
##            IBM.Adjusted FB.Adjusted
## 2013-12-31      166.089       54.65
## 2017-09-29      145.080      170.87

Step 2: Calculate Returns for Each Security Over the Investment Period

rets <- lapply(period.ret, Delt) # lapply returns output in a list
rets
## $AMZN.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29          1.410667
## 
## $MSFT.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29          1.196236
## 
## $AAPL.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29          1.066747
## 
## $TSLA.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29            1.2675
## 
## $IBM.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29        -0.1264924
## 
## $FB.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29          2.126624
#rets <- mapply(Delt, data.frame(period.ret)) #mapply does the same but returns output in DF

Step 3: Convert to a data.frame and Clean up Data

rets <- data.frame(rets)
rets
##            Delt.1.arithmetic Delt.1.arithmetic.1 Delt.1.arithmetic.2
## 2013-12-31                NA                  NA                  NA
## 2017-09-29          1.410667            1.196236            1.066747
##            Delt.1.arithmetic.3 Delt.1.arithmetic.4 Delt.1.arithmetic.5
## 2013-12-31                  NA                  NA                  NA
## 2017-09-29              1.2675          -0.1264924            2.126624
rets <- rets[2, ] * 100
names(rets) <- paste(c("AMZN", "MSFT", "AAPL", "TSLA", "IBM", "FB"))
rets
##                AMZN     MSFT     AAPL   TSLA       IBM       FB
## 2017-09-29 141.0667 119.6236 106.6747 126.75 -12.64924 212.6624

Step 4: Calculate Weight of Each Security in the Portfolio

i.AMZN <- 40000 
i.MSFT <- 10
i.AAPL <- 10
i.TSLA <- 20
i.IBM <- 10
i.FB <- 10

w.AMZN <- i.AMZN / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.MSFT <- i.MSFT / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.AAPL <- i.AAPL / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.TSLA <- i.TSLA / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.IBM <- i.IBM / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.FB <- i.FB / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.AMZN
## [1] 0.9985022
w.MSFT
## [1] 0.0002496256
w.AAPL
## [1] 0.0002496256
w.TSLA
## [1] 0.0004992511
w.IBM
## [1] 0.0002496256
w.FB
## [1] 0.0002496256

Step 5: Calculate Portfolio Return

port.ret.6asset <- w.AMZN * rets$AMZN + w.MSFT * rets$MSFT + w.AAPL * rets$AAPL + w.TSLA * rets$TSLA + w.IBM * rets$IBM + w.FB * rets$FB
port.ret.6asset 
## [1] 141.0251

Interpretation The portfolio return over the period is 141%. The stock that performed the best over the period was Facebook.

Alternative portfolio

data.AMZN <- getSymbols("AMZN", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)
data.MSFT <- getSymbols("MSFT", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)
data.AAPL <- getSymbols("AAPL", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)
data.TSLA <- getSymbols("TSLA", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)
data.IBM <- getSymbols("IBM", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)
data.FB <- getSymbols("FB", from = "2013-12-31", to = "2017-10-01", auto.assign = FALSE)

multi <- data.AMZN[, 6] # Need to create a new data object before cbinding
multi <- cbind(multi, data.MSFT[, 6], data.AAPL[, 6], data.TSLA[, 6], data.IBM[, 6], data.FB[, 6])

Step 1: Find First and Last Adjusted Closing Price for Each Security Over the Investmet Period

period.ret <- multi[c(1, nrow(multi)), ]
period.ret
##            AMZN.Adjusted MSFT.Adjusted AAPL.Adjusted TSLA.Adjusted
## 2013-12-31        398.79      33.91713      74.57128        150.43
## 2017-09-29        961.35      74.49000     154.11999        341.10
##            IBM.Adjusted FB.Adjusted
## 2013-12-31      166.089       54.65
## 2017-09-29      145.080      170.87

Step 2: Calculate Returns for Each Security Over the Investment Period

rets <- lapply(period.ret, Delt) # lapply returns output in a list
rets
## $AMZN.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29          1.410667
## 
## $MSFT.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29          1.196236
## 
## $AAPL.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29          1.066747
## 
## $TSLA.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29            1.2675
## 
## $IBM.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29        -0.1264924
## 
## $FB.Adjusted
##            Delt.1.arithmetic
## 2013-12-31                NA
## 2017-09-29          2.126624
#rets <- mapply(Delt, data.frame(period.ret)) #mapply does the same but returns output in DF

Step 3: Convert to a data.frame and Clean up Data

rets <- data.frame(rets)
rets
##            Delt.1.arithmetic Delt.1.arithmetic.1 Delt.1.arithmetic.2
## 2013-12-31                NA                  NA                  NA
## 2017-09-29          1.410667            1.196236            1.066747
##            Delt.1.arithmetic.3 Delt.1.arithmetic.4 Delt.1.arithmetic.5
## 2013-12-31                  NA                  NA                  NA
## 2017-09-29              1.2675          -0.1264924            2.126624
rets <- rets[2, ] * 100
names(rets) <- paste(c("AMZN", "MSFT", "AAPL", "TSLA", "IBM", "FB"))
rets
##                AMZN     MSFT     AAPL   TSLA       IBM       FB
## 2017-09-29 141.0667 119.6236 106.6747 126.75 -12.64924 212.6624

Step 4: Calculate Weight of Each Security in the Portfolio

i.AMZN <- 10000 
i.MSFT <- 10
i.AAPL <- 10
i.TSLA <- 30
i.IBM <- 30
i.FB <- 10

w.AMZN <- i.AMZN / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.MSFT <- i.MSFT / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.AAPL <- i.AAPL / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.TSLA <- i.TSLA / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.IBM <- i.IBM / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.FB <- i.FB / (i.AMZN + i.MSFT + i.AAPL + i.TSLA + i.IBM + i.FB)
w.AMZN
## [1] 0.9910803
w.MSFT
## [1] 0.0009910803
w.AAPL
## [1] 0.0009910803
w.TSLA
## [1] 0.002973241
w.IBM
## [1] 0.002973241
w.FB
## [1] 0.0009910803

Step 5: Calculate Portfolio Return

port.ret.6asset <- w.AMZN * rets$AMZN + w.MSFT * rets$MSFT + w.AAPL * rets$AAPL + w.TSLA * rets$TSLA + w.IBM * rets$IBM + w.FB * rets$FB
port.ret.6asset 
## [1] 140.5827

Interpretation The portfolio return is 140% The two stocks that performed the best were facebook and amazon.