Chapter 3: Portfolio Returns

Key Issues

portfolio returns = returns of basket of securities benchmark portfolio = hypothetical portfolio that we can compare the performance of our portf

3.1 Constructing Portfolio Returns (Long Way)

Portfolio return is the weighted average of the returns of the individual securities in the portfolio. Suppose we invested $50K in AMZN, $10 in GSPC, $30 in YHOO, and $10 in IBM How much would this portfolio return b/t December 31, 2010 and December 31, 2013?

Step 0: Import Price Data

# 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 = "2010-12-31", to = "2013-12-31", auto.assign = FALSE)
data.YHOO <- getSymbols("YHOO", from = "2010-12-31", to = "2013-12-31", auto.assign = FALSE)
data.IBM <- getSymbols("IBM", from = "2010-12-31", to = "2013-12-31", auto.assign = FALSE)
data.TSLA <- getSymbols("TSLA", from = "2010-12-31", to = "2013-12-31", auto.assign = FALSE)

3.3 Constructing Benchmark Portfolio Returns

Construct an equal-weighted (EW) and value-weighted (VW) portfolio, consisting of AMZN, YHOO, and IBM.

In this section, prepare an object, port, which will be used later to build EW and VW portfolio.

Step 1: Importing the Price Data

data.AMZN[c(1:3, nrow(data.AMZN)), ]
##            AMZN.Open AMZN.High AMZN.Low AMZN.Close AMZN.Volume
## 2010-12-31    181.96    182.30   179.51     180.00     3451900
## 2011-01-03    181.37    186.00   181.21     184.22     5331400
## 2011-01-04    186.15    187.70   183.78     185.01     5031800
## 2013-12-31    394.58    398.83   393.80     398.79     1996500
##            AMZN.Adjusted
## 2010-12-31        180.00
## 2011-01-03        184.22
## 2011-01-04        185.01
## 2013-12-31        398.79
data.YHOO[c(1:3, nrow(data.YHOO)), ]
##            YHOO.Open YHOO.High YHOO.Low YHOO.Close YHOO.Volume
## 2010-12-31     16.74     16.76    16.47      16.63     7754500
## 2011-01-03     16.81     16.94    16.67      16.75    17684000
## 2011-01-04     16.71     16.83    16.57      16.59    11092800
## 2013-12-31     40.17     40.50    40.00      40.44     8291400
##            YHOO.Adjusted
## 2010-12-31         16.63
## 2011-01-03         16.75
## 2011-01-04         16.59
## 2013-12-31         40.44
data.IBM[c(1:3, nrow(data.IBM)), ]
##            IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
## 2010-12-31   146.73   147.07  145.96    146.76    2969800     124.5860
## 2011-01-03   147.21   148.20  147.14    147.48    4603800     125.1972
## 2011-01-04   147.56   148.22  146.64    147.64    5060100     125.3331
## 2013-12-31   186.49   187.79  186.30    187.57    3619700     167.8438
data.TSLA[c(1:3, nrow(data.TSLA)), ]
##            TSLA.Open TSLA.High TSLA.Low TSLA.Close TSLA.Volume
## 2010-12-31     26.57     27.25    26.50      26.63     1417900
## 2011-01-03     26.84     27.00    25.90      26.62     1283000
## 2011-01-04     26.66     26.95    26.02      26.67     1187400
## 2013-12-31    152.32    153.20   148.66     150.43     4262400
##            TSLA.Adjusted
## 2010-12-31         26.63
## 2011-01-03         26.62
## 2011-01-04         26.67
## 2013-12-31        150.43

Step 2: Create Object with Only the Relevant Data

port <- data.AMZN[, c(4, 6)]
port <- merge(port, data.YHOO[, c(4, 6)])
port <- merge(port, data.IBM[, c(4, 6)])
port <- merge(port, data.TSLA[, c(4, 6)])
#port <- cbind(port, data.YHOO[, c(4, 6)], data.IBM[, c(4, 6)])
port[c(1:3, nrow(port)), ]
##            AMZN.Close AMZN.Adjusted YHOO.Close YHOO.Adjusted IBM.Close
## 2010-12-31     180.00        180.00      16.63         16.63    146.76
## 2011-01-03     184.22        184.22      16.75         16.75    147.48
## 2011-01-04     185.01        185.01      16.59         16.59    147.64
## 2013-12-31     398.79        398.79      40.44         40.44    187.57
##            IBM.Adjusted TSLA.Close TSLA.Adjusted
## 2010-12-31     124.5860      26.63         26.63
## 2011-01-03     125.1972      26.62         26.62
## 2011-01-04     125.3331      26.67         26.67
## 2013-12-31     167.8438     150.43        150.43

Step 3: Calculate Returns of Each Security

port$AMZN.ret <- Delt(port$AMZN.Adjusted)
port$YHOO.ret <- Delt(port$YHOO.Adjusted)
port$IBM.ret <- Delt(port$IBM.Adjusted)
port$TSLA.ret <- Delt(port$TSLA.Adjusted)
port[c(1:3, nrow(port)), ]
##            AMZN.Close AMZN.Adjusted YHOO.Close YHOO.Adjusted IBM.Close
## 2010-12-31     180.00        180.00      16.63         16.63    146.76
## 2011-01-03     184.22        184.22      16.75         16.75    147.48
## 2011-01-04     185.01        185.01      16.59         16.59    147.64
## 2013-12-31     398.79        398.79      40.44         40.44    187.57
##            IBM.Adjusted TSLA.Close TSLA.Adjusted    AMZN.ret     YHOO.ret
## 2010-12-31     124.5860      26.63         26.63          NA           NA
## 2011-01-03     125.1972      26.62         26.62 0.023444450  0.007215935
## 2011-01-04     125.3331      26.67         26.67 0.004288318 -0.009552239
## 2013-12-31     167.8438     150.43        150.43 0.013778412  0.005970099
##                IBM.ret      TSLA.ret
## 2010-12-31          NA            NA
## 2011-01-03 0.004905984 -0.0003754412
## 2011-01-04 0.001084912  0.0018782494
## 2013-12-31 0.006222864 -0.0131855745

Step 4: Convert to data.frame Object and Subset Data

port <- cbind(index(port), data.frame(port))
names(port)[1] <- "date"
port[c(1:3, nrow(port)), ]
##                  date AMZN.Close AMZN.Adjusted YHOO.Close YHOO.Adjusted
## 2010-12-31 2010-12-31     180.00        180.00      16.63         16.63
## 2011-01-03 2011-01-03     184.22        184.22      16.75         16.75
## 2011-01-04 2011-01-04     185.01        185.01      16.59         16.59
## 2013-12-31 2013-12-31     398.79        398.79      40.44         40.44
##            IBM.Close IBM.Adjusted TSLA.Close TSLA.Adjusted    AMZN.ret
## 2010-12-31    146.76     124.5860      26.63         26.63          NA
## 2011-01-03    147.48     125.1972      26.62         26.62 0.023444450
## 2011-01-04    147.64     125.3331      26.67         26.67 0.004288318
## 2013-12-31    187.57     167.8438     150.43        150.43 0.013778412
##                YHOO.ret     IBM.ret      TSLA.ret
## 2010-12-31           NA          NA            NA
## 2011-01-03  0.007215935 0.004905984 -0.0003754412
## 2011-01-04 -0.009552239 0.001084912  0.0018782494
## 2013-12-31  0.005970099 0.006222864 -0.0131855745

port <- subset(port,
               port$date >= "2012-12-31" &
               port$date <= "2013-12-31")
port[c(1:3, nrow(port)), ]
##                  date AMZN.Close AMZN.Adjusted YHOO.Close YHOO.Adjusted
## 2012-12-31 2012-12-31     250.87        250.87      19.90         19.90
## 2013-01-02 2013-01-02     257.31        257.31      20.08         20.08
## 2013-01-03 2013-01-03     258.48        258.48      19.78         19.78
## 2013-12-31 2013-12-31     398.79        398.79      40.44         40.44
##            IBM.Close IBM.Adjusted TSLA.Close TSLA.Adjusted    AMZN.ret
## 2012-12-31    191.55     168.1425      33.87         33.87 0.023207448
## 2013-01-02    196.35     172.3559      35.36         35.36 0.025670679
## 2013-01-03    195.27     171.4079      34.77         34.77 0.004547095
## 2013-12-31    187.57     167.8438     150.43        150.43 0.013778412
##                YHOO.ret      IBM.ret    TSLA.ret
## 2012-12-31  0.020512821  0.009060750  0.01956647
## 2013-01-02  0.009045226  0.025058747  0.04399179
## 2013-01-03 -0.014940189 -0.005500391 -0.01668555
## 2013-12-31  0.005970099  0.006222864 -0.01318557

3.3.1 Equal-Weighted Portfolio

considerd as an approach to capture the small capitalization stock premeum (the belief that small cap stock yield higher returns over larger cap stocks) An example is the S&P 500 Equal Weight Index

Step 1: Keep Only Variables We Need to Construct EW Portfolio

ewport <- port[, c(1, 10:13)]
ewport[c(1:3, nrow(ewport)), ]
##                  date    AMZN.ret     YHOO.ret      IBM.ret    TSLA.ret
## 2012-12-31 2012-12-31 0.023207448  0.020512821  0.009060750  0.01956647
## 2013-01-02 2013-01-02 0.025670679  0.009045226  0.025058747  0.04399179
## 2013-01-03 2013-01-03 0.004547095 -0.014940189 -0.005500391 -0.01668555
## 2013-12-31 2013-12-31 0.013778412  0.005970099  0.006222864 -0.01318557

names(ewport)[2:5] <- c("AMZN", "YHOO", "IBM", "TSLA")
rownames(ewport) <- seq(1, nrow(ewport), 1)
ewport[c(1:3, nrow(ewport)), ]
##           date        AMZN         YHOO          IBM        TSLA
## 1   2012-12-31 0.023207448  0.020512821  0.009060750  0.01956647
## 2   2013-01-02 0.025670679  0.009045226  0.025058747  0.04399179
## 3   2013-01-03 0.004547095 -0.014940189 -0.005500391 -0.01668555
## 253 2013-12-31 0.013778412  0.005970099  0.006222864 -0.01318557

Step 2: Convert Net Returns to Gross Returns

ewport[2:5] <- ewport[2:5] + 1
ewport[c(1:3, nrow(ewport)), ]
##           date     AMZN      YHOO       IBM      TSLA
## 1   2012-12-31 1.023207 1.0205128 1.0090608 1.0195665
## 2   2013-01-02 1.025671 1.0090452 1.0250587 1.0439918
## 3   2013-01-03 1.004547 0.9850598 0.9944996 0.9833145
## 253 2013-12-31 1.013778 1.0059701 1.0062229 0.9868144

Step 3: Calculate EW Portfolio Values for 1Q 2013

# Subset ewport by data from December 31, 2012 to March 31, 2013
ewq1 <- subset(ewport,
               ewport$date >= "2012-12-31" &
               ewport$date <= "2013-03-31")
ewq1[c(1:3, nrow(ewq1)), ]
##          date     AMZN      YHOO       IBM      TSLA
## 1  2012-12-31 1.023207 1.0205128 1.0090608 1.0195665
## 2  2013-01-02 1.025671 1.0090452 1.0250587 1.0439918
## 3  2013-01-03 1.004547 0.9850598 0.9944996 0.9833145
## 61 2013-03-28 1.004485 0.9974566 1.0114278 0.9929245

# Calculate the cumulative gross returns fro each security for Q1
ewq1[1, 2:5] <- 1
ewq1[2:5] <- cumprod(ewq1[2:5])
ewq1[c(1:3, nrow(ewq1)), ]
##          date     AMZN      YHOO      IBM     TSLA
## 1  2012-12-31 1.000000 1.0000000 1.000000 1.000000
## 2  2013-01-02 1.025671 1.0090452 1.025059 1.043992
## 3  2013-01-03 1.030335 0.9939699 1.019421 1.026572
## 61 2013-03-28 1.062263 1.1824121 1.118234 1.118689

# Calculate the index value for each security for Q1
num.sec <- 4
ewq1$AMZN.ind <- ewq1$AMZN / num.sec
ewq1$YHOO.ind <- ewq1$YHOO / num.sec
ewq1$IBM.ind <- ewq1$IBM / num.sec
ewq1$TSLA.ind <- ewq1$TSLA / num.sec
ewq1[c(1:3, nrow(ewq1)), ]
##          date     AMZN      YHOO      IBM     TSLA  AMZN.ind  YHOO.ind
## 1  2012-12-31 1.000000 1.0000000 1.000000 1.000000 0.2500000 0.2500000
## 2  2013-01-02 1.025671 1.0090452 1.025059 1.043992 0.2564177 0.2522613
## 3  2013-01-03 1.030335 0.9939699 1.019421 1.026572 0.2575836 0.2484925
## 61 2013-03-28 1.062263 1.1824121 1.118234 1.118689 0.2655658 0.2956030
##      IBM.ind  TSLA.ind
## 1  0.2500000 0.2500000
## 2  0.2562647 0.2609979
## 3  0.2548551 0.2566431
## 61 0.2795586 0.2796723

# Calculate the agrregate portfolio value on each day
q1.val <- data.frame(rowSums(ewq1[, 6:9]))
q1.val[c(1:3, nrow(q1.val)), ]
## [1] 1.000000 1.025942 1.017574 1.120400
names(q1.val) <- paste("port.val")
q1.val$date <- ewq1$date
q1.val[c(1:3, nrow(q1.val)), ]
##    port.val       date
## 1  1.000000 2012-12-31
## 2  1.025942 2013-01-02
## 3  1.017574 2013-01-03
## 61 1.120400 2013-03-28

# Pass the aggregate portfolio value at the end of Q1 to Q2
q2.inv <- q1.val[nrow(q1.val), 1]
q2.inv
## [1] 1.1204

Step 4: Calculate EW Portfolio Values for 2Q 2013

# Subset ewport by data from April 1, 2013 to June 30, 2013
ewq2 <- subset(ewport,
               ewport$date >= "2013-04-01" &
               ewport$date <= "2013-06-30")
ewq2[c(1:3, nrow(ewq2)), ]
##           date      AMZN      YHOO       IBM      TSLA
## 62  2013-04-01 0.9816878 0.9987250 0.9956868 1.1594088
## 63  2013-04-02 1.0065365 1.0119149 1.0093229 1.0093330
## 64  2013-04-03 0.9837080 0.9831791 0.9920694 0.9269282
## 125 2013-06-28 1.0005045 0.9866510 0.9767953 0.9827002

# Calculate the cumulative gross returns fro each security for Q2
#ewq2[1, 2:4] <- 1 This is the difference from Q1
ewq2[2:5] <- cumprod(ewq2[2:5])
ewq2[c(1:3, nrow(ewq2)), ]
##           date      AMZN      YHOO       IBM     TSLA
## 62  2013-04-01 0.9816878 0.9987250 0.9956868 1.159409
## 63  2013-04-02 0.9881047 1.0106247 1.0049695 1.170230
## 64  2013-04-03 0.9720065 0.9936251 0.9969995 1.084719
## 125 2013-06-28 1.0420279 1.0679982 0.9001677 2.833465

# Calculate the index value for each security for Q2
ewq2$AMZN.ind <- (q2.inv / num.sec) * ewq2$AMZN #a difference from Q1
ewq2$YHOO.ind <- (q2.inv / num.sec) * ewq2$YHOO 
ewq2$IBM.ind <- (q2.inv / num.sec) * ewq2$IBM 
ewq2$TSLA.ind <- (q2.inv / num.sec) * ewq2$TSLA 
ewq2[c(1:3, nrow(ewq2)), ]
##           date      AMZN      YHOO       IBM     TSLA  AMZN.ind  YHOO.ind
## 62  2013-04-01 0.9816878 0.9987250 0.9956868 1.159409 0.2749707 0.2797428
## 63  2013-04-02 0.9881047 1.0106247 1.0049695 1.170230 0.2767681 0.2830759
## 64  2013-04-03 0.9720065 0.9936251 0.9969995 1.084719 0.2722590 0.2783143
## 125 2013-06-28 1.0420279 1.0679982 0.9001677 2.833465 0.2918719 0.2991462
##       IBM.ind  TSLA.ind
## 62  0.2788918 0.3247503
## 63  0.2814919 0.3277812
## 64  0.2792595 0.3038297
## 125 0.2521369 0.7936535

# Calculate the agrregate portfolio value on each day
q2.val <- data.frame(rowSums(ewq2[, 6:9]))
q2.val[c(1:3, nrow(q2.val)), ]
## [1] 1.158356 1.169117 1.133662 1.636809
names(q2.val) <- paste("port.val")
q2.val$date <- ewq2$date
q2.val[c(1:3, nrow(q2.val)), ]
##     port.val       date
## 62  1.158356 2013-04-01
## 63  1.169117 2013-04-02
## 64  1.133662 2013-04-03
## 125 1.636809 2013-06-28

# Pass the aggregate portfolio value at the end of Q2 to Q3
q3.inv <- q2.val[nrow(q2.val), 1]
q3.inv 
## [1] 1.636809
#$1.121 at the end of Q1 and 1.125
#Means the portfolio grown from $1.121 at the end of Q1 to $1.125 at the end of Q2
#Note that it doesn't mean that the portfolio grew 12.5% during Q2 but 12.5% during Q1-Q2
#b/c this is a cumulative measure 

Step 5: Calculate EW Portfolio Values for 3Q 2013

# Subset ewport by data from July 1, 2013 to September 30, 2013
ewq3 <- subset(ewport,
               ewport$date >= "2013-07-01" &
                 ewport$date <= "2013-09-30")
ewq3[c(1:3, nrow(ewq3)), ]
##           date      AMZN      YHOO       IBM      TSLA
## 126 2013-07-01 1.0158810 1.0043773 1.0008895 1.0914679
## 127 2013-07-02 1.0057781 0.9900951 1.0011502 1.0054617
## 128 2013-07-03 1.0010573 1.0240096 1.0091384 0.9781022
## 189 2013-09-30 0.9893358 0.9886736 0.9906912 1.0129387

# Calculate the cumulative gross returns fro each security for Q3
#ewq3[1, 2:4] <- 1 This is the difference from Q1
ewq3[2:5] <- cumprod(ewq3[2:5])
ewq3[c(1:3, nrow(ewq3)), ]
##           date     AMZN     YHOO       IBM     TSLA
## 126 2013-07-01 1.015881 1.004377 1.0008895 1.091468
## 127 2013-07-02 1.021751 0.994429 1.0020407 1.097429
## 128 2013-07-03 1.022831 1.018305 1.0111977 1.073398
## 189 2013-09-30 1.125860 1.319936 0.9738146 1.801136

# Calculate the index value for each security for Q3
ewq3$AMZN.ind <- (q3.inv / num.sec) * ewq3$AMZN #a difference from Q1
ewq3$YHOO.ind <- (q3.inv / num.sec) * ewq3$YHOO 
ewq3$IBM.ind <- (q3.inv / num.sec) * ewq3$IBM 
ewq3$TSLA.ind <- (q3.inv / num.sec) * ewq3$TSLA 
ewq3[c(1:3, nrow(ewq3)), ]
##           date     AMZN     YHOO       IBM     TSLA  AMZN.ind  YHOO.ind
## 126 2013-07-01 1.015881 1.004377 1.0008895 1.091468 0.4157007 0.4109933
## 127 2013-07-02 1.021751 0.994429 1.0020407 1.097429 0.4181027 0.4069225
## 128 2013-07-03 1.022831 1.018305 1.0111977 1.073398 0.4185447 0.4166925
## 189 2013-09-30 1.125860 1.319936 0.9738146 1.801136 0.4607042 0.5401208
##       IBM.ind  TSLA.ind
## 126 0.4095661 0.4466310
## 127 0.4100372 0.4490704
## 128 0.4137843 0.4392367
## 189 0.3984870 0.7370288

# Calculate the agrregate portfolio value on each day
q3.val <- data.frame(rowSums(ewq3[, 6:9]))
q3.val[c(1:3, nrow(q3.val)), ]
## [1] 1.682891 1.684133 1.688258 2.136341
names(q3.val) <- paste("port.val")
q3.val$date <- ewq3$date
q3.val[c(1:3, nrow(q3.val)), ]
##     port.val       date
## 126 1.682891 2013-07-01
## 127 1.684133 2013-07-02
## 128 1.688258 2013-07-03
## 189 2.136341 2013-09-30

# Pass the aggregate portfolio value at the end of Q3 to Q4
q4.inv <- q3.val[nrow(q3.val), 1]
q4.inv
## [1] 2.136341

Step 6: Calculate EW Portfolio Values for 4Q 2013

# Subset ewport by data from October 1, 2013 to December 31, 2013
ewq4 <- subset(ewport,
               ewport$date >= "2013-10-01" &
                 ewport$date <= "2013-12-31")
ewq4[c(1:3, nrow(ewq4)), ]
##           date      AMZN      YHOO       IBM      TSLA
## 190 2013-10-01 1.0265801 1.0343685 1.0064802 0.9980866
## 191 2013-10-02 0.9986291 0.9950451 0.9923812 0.9375648
## 192 2013-10-03 0.9820598 0.9923844 0.9940527 0.9577784
## 253 2013-12-31 1.0137784 1.0059701 1.0062229 0.9868144

# Calculate the cumulative gross returns fro each security for q4
#ewq4[1, 2:4] <- 1 This is the difference from Q1
ewq4[2:5] <- cumprod(ewq4[2:5])
ewq4[c(1:3, nrow(ewq4)), ]
##           date     AMZN     YHOO       IBM      TSLA
## 190 2013-10-01 1.026580 1.034368 1.0064802 0.9980866
## 191 2013-10-02 1.025173 1.029243 0.9988120 0.9357708
## 192 2013-10-03 1.006781 1.021405 0.9928718 0.8962611
## 253 2013-12-31 1.275557 1.219174 1.0183460 0.7779387

# Calculate the index value for each security for q4
ewq4$AMZN.ind <- (q4.inv / num.sec) * ewq4$AMZN #a difference from Q1
ewq4$YHOO.ind <- (q4.inv / num.sec) * ewq4$YHOO 
ewq4$IBM.ind <- (q4.inv / num.sec) * ewq4$IBM 
ewq4$TSLA.ind <- (q4.inv / num.sec) * ewq4$TSLA 
ewq4[c(1:3, nrow(ewq4)), ]
##           date     AMZN     YHOO       IBM      TSLA  AMZN.ind  YHOO.ind
## 190 2013-10-01 1.026580 1.034368 1.0064802 0.9980866 0.5482812 0.5524409
## 191 2013-10-02 1.025173 1.029243 0.9988120 0.9357708 0.5475296 0.5497036
## 192 2013-10-03 1.006781 1.021405 0.9928718 0.8962611 0.5377068 0.5455173
## 253 2013-12-31 1.275557 1.219174 1.0183460 0.7779387 0.6812559 0.6511428
##       IBM.ind  TSLA.ind
## 190 0.5375462 0.5330633
## 191 0.5334507 0.4997814
## 192 0.5302782 0.4786798
## 253 0.5438835 0.4154855

# Calculate the agrregate portfolio value on each day
q4.val <- data.frame(rowSums(ewq4[, 6:9]))
q4.val[c(1:3, nrow(q4.val)), ]
## [1] 2.171332 2.130465 2.092182 2.291768
names(q4.val) <- paste("port.val")
q4.val$date <- ewq4$date
q4.val[c(1:3, nrow(q4.val)), ]
##     port.val       date
## 190 2.171332 2013-10-01
## 191 2.130465 2013-10-02
## 192 2.092182 2013-10-03
## 253 2.291768 2013-12-31

Step 7: Combine Quarterly EW Portfolio Values into One Data Object

ew.portval <- rbind(q1.val, q2.val, q3.val, q4.val)
ew.portval[c(1:3, nrow(ew.portval)), ]
##     port.val       date
## 1   1.000000 2012-12-31
## 2   1.025942 2013-01-02
## 3   1.017574 2013-01-03
## 253 2.291768 2013-12-31

3.3.2 Value-Weighted Portfolio

It’s considerd as an approach to track the changes in the size of the sector. Larger firms are given more weight in VW, whereas equal weights are given in EW portfolio. An example is the S&P 500 Index. It rebalances only at the beginning of each quarter.

Step 1: Keep Only Variables We Need to Construct EW Portfolio

vwport <- port[, c(1, 2, 4, 6, 8, 10:13)] #port is from 3.3 Constructing Benchmark Portfolio Returns
vwport[c(1:3, nrow(vwport)), ]
##                  date AMZN.Close YHOO.Close IBM.Close TSLA.Close
## 2012-12-31 2012-12-31     250.87      19.90    191.55      33.87
## 2013-01-02 2013-01-02     257.31      20.08    196.35      35.36
## 2013-01-03 2013-01-03     258.48      19.78    195.27      34.77
## 2013-12-31 2013-12-31     398.79      40.44    187.57     150.43
##               AMZN.ret     YHOO.ret      IBM.ret    TSLA.ret
## 2012-12-31 0.023207448  0.020512821  0.009060750  0.01956647
## 2013-01-02 0.025670679  0.009045226  0.025058747  0.04399179
## 2013-01-03 0.004547095 -0.014940189 -0.005500391 -0.01668555
## 2013-12-31 0.013778412  0.005970099  0.006222864 -0.01318557
rownames(vwport) <- seq(1:nrow(vwport))
vwport[c(1:3, nrow(vwport)), ]
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close    AMZN.ret
## 1   2012-12-31     250.87      19.90    191.55      33.87 0.023207448
## 2   2013-01-02     257.31      20.08    196.35      35.36 0.025670679
## 3   2013-01-03     258.48      19.78    195.27      34.77 0.004547095
## 253 2013-12-31     398.79      40.44    187.57     150.43 0.013778412
##         YHOO.ret      IBM.ret    TSLA.ret
## 1    0.020512821  0.009060750  0.01956647
## 2    0.009045226  0.025058747  0.04399179
## 3   -0.014940189 -0.005500391 -0.01668555
## 253  0.005970099  0.006222864 -0.01318557

Step 2: Convert Net Returns to Gross Returns

vwport$AMZN.ret <- vwport$AMZN.ret + 1
vwport$YHOO.ret <- vwport$YHOO.ret + 1
vwport$IBM.ret <- vwport$IBM.ret + 1
vwport$TSLA.ret <- vwport$TSLA.ret + 1
vwport[c(1:3, nrow(vwport)), ]
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close AMZN.ret
## 1   2012-12-31     250.87      19.90    191.55      33.87 1.023207
## 2   2013-01-02     257.31      20.08    196.35      35.36 1.025671
## 3   2013-01-03     258.48      19.78    195.27      34.77 1.004547
## 253 2013-12-31     398.79      40.44    187.57     150.43 1.013778
##      YHOO.ret   IBM.ret  TSLA.ret
## 1   1.0205128 1.0090608 1.0195665
## 2   1.0090452 1.0250587 1.0439918
## 3   0.9850598 0.9944996 0.9833145
## 253 1.0059701 1.0062229 0.9868144

Step 3: Calculate the Market Capitalization of Each Security in the Portfolio

# Construct Series of Calendar Days
date <- seq(as.Date("2012-12-31"), as.Date("2013-12-31"), by = 1)
date <- data.frame(date)
date[c(1:3, nrow(date)), ]
## [1] "2012-12-31" "2013-01-01" "2013-01-02" "2013-12-31"

# Create Data Object with Daily Prices
PRICE.qtr <- vwport[, 1:5]
PRICE.qtr[c(1:3, nrow(PRICE.qtr)), ]
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close
## 1   2012-12-31     250.87      19.90    191.55      33.87
## 2   2013-01-02     257.31      20.08    196.35      35.36
## 3   2013-01-03     258.48      19.78    195.27      34.77
## 253 2013-12-31     398.79      40.44    187.57     150.43

# Filling in Last Available Price on Non-trading Days
PRICE.qtr <- na.locf(merge(x = date, y = PRICE.qtr, by = "date", all.x = TRUE))
#all.x=T tells R to keep all the data in the "by" varialble that is available in x=date
#na.locf tells R to copy over the last available data in y 
#when there is a date in x that is not available in y
PRICE.qtr[c(1:3, nrow(PRICE.qtr)), ]
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close
## 1   2012-12-31     250.87      19.90    191.55      33.87
## 2   2013-01-01     250.87      19.90    191.55      33.87
## 3   2013-01-02     257.31      20.08    196.35      35.36
## 366 2013-12-31     398.79      40.44    187.57     150.43

# Keep Only Prices at the End of Each Calendar Quarter
PRICE.qtr <- subset(PRICE.qtr,
                    PRICE.qtr$date == as.Date("2012-12-31") |
                    PRICE.qtr$date == as.Date("2013-03-31") |
                    PRICE.qtr$date == as.Date("2013-06-30") |
                    PRICE.qtr$date == as.Date("2013-09-30"))
PRICE.qtr
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close
## 1   2012-12-31     250.87      19.90    191.55      33.87
## 91  2013-03-31     266.49      23.53    213.30      37.89
## 182 2013-06-30     277.69      25.13    191.11     107.36
## 274 2013-09-30     312.64      33.17    185.18     193.37

# Obtain Share Outstanding Data from SEC Filings
#http://www.sec.gov/edgar/searchedgar/companysearch.html
#Interactive Data / Financial Statements / Condensed Consolidated Balance Sheets
PRICE.qtr$AMZN.shout <- c(454000000, 455000000, 457000000, 458000000)
PRICE.qtr$YHOO.shout <- c(1115233000, 1084766000, 1065046000, 1013059000)
PRICE.qtr$IBM.shout <- c(1117367676, 1108794396, 1095425823, 1085854383)
PRICE.qtr$TSLA.shout <- c(114214274, 115161040, 121429665, 122566098)
PRICE.qtr
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close AMZN.shout
## 1   2012-12-31     250.87      19.90    191.55      33.87   4.54e+08
## 91  2013-03-31     266.49      23.53    213.30      37.89   4.55e+08
## 182 2013-06-30     277.69      25.13    191.11     107.36   4.57e+08
## 274 2013-09-30     312.64      33.17    185.18     193.37   4.58e+08
##     YHOO.shout  IBM.shout TSLA.shout
## 1   1115233000 1117367676  114214274
## 91  1084766000 1108794396  115161040
## 182 1065046000 1095425823  121429665
## 274 1013059000 1085854383  122566098

# Calculate Market Capitalization of Each Security
str(PRICE.qtr)
## 'data.frame':    4 obs. of  9 variables:
##  $ date      : chr  "2012-12-31" "2013-03-31" "2013-06-30" "2013-09-30"
##  $ AMZN.Close: chr  "250.87" "266.49" "277.69" "312.64"
##  $ YHOO.Close: chr  "19.90" "23.53" "25.13" "33.17"
##  $ IBM.Close : chr  "191.55" "213.30" "191.11" "185.18"
##  $ TSLA.Close: chr  " 33.87" " 37.89" "107.36" "193.37"
##  $ AMZN.shout: num  4.54e+08 4.55e+08 4.57e+08 4.58e+08
##  $ YHOO.shout: num  1.12e+09 1.08e+09 1.07e+09 1.01e+09
##  $ IBM.shout : num  1.12e+09 1.11e+09 1.10e+09 1.09e+09
##  $ TSLA.shout: num  1.14e+08 1.15e+08 1.21e+08 1.23e+08
PRICE.qtr$date <- as.Date(PRICE.qtr$date)
PRICE.qtr$AMZN.Close <- as.numeric(PRICE.qtr$AMZN.Close)
PRICE.qtr$YHOO.Close <- as.numeric(PRICE.qtr$YHOO.Close)
PRICE.qtr$IBM.Close <- as.numeric(PRICE.qtr$IBM.Close)
PRICE.qtr$TSLA.Close <- as.numeric(PRICE.qtr$TSLA.Close)
str(PRICE.qtr)
## 'data.frame':    4 obs. of  9 variables:
##  $ date      : Date, format: "2012-12-31" "2013-03-31" ...
##  $ AMZN.Close: num  251 266 278 313
##  $ YHOO.Close: num  19.9 23.5 25.1 33.2
##  $ IBM.Close : num  192 213 191 185
##  $ TSLA.Close: num  33.9 37.9 107.4 193.4
##  $ AMZN.shout: num  4.54e+08 4.55e+08 4.57e+08 4.58e+08
##  $ YHOO.shout: num  1.12e+09 1.08e+09 1.07e+09 1.01e+09
##  $ IBM.shout : num  1.12e+09 1.11e+09 1.10e+09 1.09e+09
##  $ TSLA.shout: num  1.14e+08 1.15e+08 1.21e+08 1.23e+08

weights <- PRICE.qtr
weights$AMZN.mcap <- weights$AMZN.Close * weights$AMZN.shout
weights$YHOO.mcap <- weights$YHOO.Close * weights$YHOO.shout
weights$IBM.mcap <- weights$IBM.Close * weights$IBM.shout
weights$TSLA.mcap <- weights$TSLA.Close * weights$TSLA.shout
weights
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close AMZN.shout
## 1   2012-12-31     250.87      19.90    191.55      33.87   4.54e+08
## 91  2013-03-31     266.49      23.53    213.30      37.89   4.55e+08
## 182 2013-06-30     277.69      25.13    191.11     107.36   4.57e+08
## 274 2013-09-30     312.64      33.17    185.18     193.37   4.58e+08
##     YHOO.shout  IBM.shout TSLA.shout    AMZN.mcap   YHOO.mcap     IBM.mcap
## 1   1115233000 1117367676  114214274 113894980000 22193136700 214031778338
## 91  1084766000 1108794396  115161040 121252950000 25524543980 236505844667
## 182 1065046000 1095425823  121429665 126904330000 26764605980 209346829034
## 274 1013059000 1085854383  122566098 143189120000 33603167030 201078514644
##       TSLA.mcap
## 1    3868437460
## 91   4363451806
## 182 13036688834
## 274 23700606370

# Calculate Quarter-end Aggregate Market Capitalization
weights$tot.mcap <- rowSums(weights[, 10:13])
weights
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close AMZN.shout
## 1   2012-12-31     250.87      19.90    191.55      33.87   4.54e+08
## 91  2013-03-31     266.49      23.53    213.30      37.89   4.55e+08
## 182 2013-06-30     277.69      25.13    191.11     107.36   4.57e+08
## 274 2013-09-30     312.64      33.17    185.18     193.37   4.58e+08
##     YHOO.shout  IBM.shout TSLA.shout    AMZN.mcap   YHOO.mcap     IBM.mcap
## 1   1115233000 1117367676  114214274 113894980000 22193136700 214031778338
## 91  1084766000 1108794396  115161040 121252950000 25524543980 236505844667
## 182 1065046000 1095425823  121429665 126904330000 26764605980 209346829034
## 274 1013059000 1085854383  122566098 143189120000 33603167030 201078514644
##       TSLA.mcap     tot.mcap
## 1    3868437460 353988332498
## 91   4363451806 387646790452
## 182 13036688834 376052453848
## 274 23700606370 401571408044

Step 4: Calculate Quarter-end Weights of Each Security in the Portfolio

weights$AMZN.wgt <- weights$AMZN.mcap / weights$tot.mcap
weights$YHOO.wgt <- weights$YHOO.mcap / weights$tot.mcap
weights$IBM.wgt <- weights$IBM.mcap / weights$tot.mcap
weights$TSLA.wgt <- weights$TSLA.mcap / weights$tot.mcap
weights
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close AMZN.shout
## 1   2012-12-31     250.87      19.90    191.55      33.87   4.54e+08
## 91  2013-03-31     266.49      23.53    213.30      37.89   4.55e+08
## 182 2013-06-30     277.69      25.13    191.11     107.36   4.57e+08
## 274 2013-09-30     312.64      33.17    185.18     193.37   4.58e+08
##     YHOO.shout  IBM.shout TSLA.shout    AMZN.mcap   YHOO.mcap     IBM.mcap
## 1   1115233000 1117367676  114214274 113894980000 22193136700 214031778338
## 91  1084766000 1108794396  115161040 121252950000 25524543980 236505844667
## 182 1065046000 1095425823  121429665 126904330000 26764605980 209346829034
## 274 1013059000 1085854383  122566098 143189120000 33603167030 201078514644
##       TSLA.mcap     tot.mcap  AMZN.wgt   YHOO.wgt   IBM.wgt   TSLA.wgt
## 1    3868437460 353988332498 0.3217478 0.06269454 0.6046295 0.01092815
## 91   4363451806 387646790452 0.3127923 0.06584485 0.6101065 0.01125626
## 182 13036688834 376052453848 0.3374644 0.07117253 0.5566958 0.03466721
## 274 23700606370 401571408044 0.3565720 0.08367918 0.5007292 0.05901966

weights <- weights[, c(1, 15:18)]
weights
##           date  AMZN.wgt   YHOO.wgt   IBM.wgt   TSLA.wgt
## 1   2012-12-31 0.3217478 0.06269454 0.6046295 0.01092815
## 91  2013-03-31 0.3127923 0.06584485 0.6101065 0.01125626
## 182 2013-06-30 0.3374644 0.07117253 0.5566958 0.03466721
## 274 2013-09-30 0.3565720 0.08367918 0.5007292 0.05901966

weights$date <- weights$date + 1 #since the weights are applicable at the start of the next Q
weights
##           date  AMZN.wgt   YHOO.wgt   IBM.wgt   TSLA.wgt
## 1   2013-01-01 0.3217478 0.06269454 0.6046295 0.01092815
## 91  2013-04-01 0.3127923 0.06584485 0.6101065 0.01125626
## 182 2013-07-01 0.3374644 0.07117253 0.5566958 0.03466721
## 274 2013-10-01 0.3565720 0.08367918 0.5007292 0.05901966

Step 5: Calculate the Quarterly VW Portfolio Values

q1.vw.wgt <- subset(weights, date == "2013-01-01") #I'm not sure why author took the long way
q2.vw.wgt <- subset(weights, date == "2013-04-01")
q3.vw.wgt <- subset(weights, date == "2013-07-01")
q4.vw.wgt <- subset(weights, date == "2013-10-01")
q1.vw.wgt
##         date  AMZN.wgt   YHOO.wgt   IBM.wgt   TSLA.wgt
## 1 2013-01-01 0.3217478 0.06269454 0.6046295 0.01092815
q2.vw.wgt
##          date  AMZN.wgt   YHOO.wgt   IBM.wgt   TSLA.wgt
## 91 2013-04-01 0.3127923 0.06584485 0.6101065 0.01125626
q3.vw.wgt
##           date  AMZN.wgt   YHOO.wgt   IBM.wgt   TSLA.wgt
## 182 2013-07-01 0.3374644 0.07117253 0.5566958 0.03466721
q4.vw.wgt
##           date AMZN.wgt   YHOO.wgt   IBM.wgt   TSLA.wgt
## 274 2013-10-01 0.356572 0.08367918 0.5007292 0.05901966

Step 6: Create Pie Charts of the Weights

par(mfrow = c(2, 2))

Q1.pie.values <- as.numeric(q1.vw.wgt[, -1])
Q1.pie.labels <- names(q1.vw.wgt[, -1])
pie(Q1.pie.values,
    labels = Q1.pie.labels,
    col = c("black", "gray", "gray40", "blue"),
    main = "Q1 Value Weighting")

Q2.pie.values <- as.numeric(q2.vw.wgt[, -1])
Q2.pie.labels <- names(q1.vw.wgt[, -1])
pie(Q2.pie.values,
    labels = Q2.pie.labels,
    col = c("black", "gray", "gray40", "blue"),
    main = "Q2 Value Weighting")

Q3.pie.values <- as.numeric(q3.vw.wgt[, -1])
Q3.pie.labels <-  c("Amazon", "Yahoo", "IBM", "Tesla")
pct <- round(Q3.pie.values * 100)
Q3.pie.labels <- paste(Q3.pie.labels, pct) #Add Pct to Labels
Q3.pie.labels <- paste(Q3.pie.labels, "%", sep = "") #Add % Sign
pie(Q3.pie.values,
    labels = Q3.pie.labels,
    col = c("black", "gray", "gray40", "blue"),
    main = "Q3 Value Weighting")

Q4.pie.values <- as.numeric(q4.vw.wgt[, -1])
Q4.pie.labels <- c("Amazon", "Yahoo", "IBM", "Tesla")
pct <- round(Q4.pie.values * 100)
Q4.pie.labels <- paste(Q4.pie.labels, pct) #Add Pct to Labels
Q4.pie.labels <- paste(Q4.pie.labels, "%", sep = "") #Add % Sign
pie(Q4.pie.values,
    labels = Q4.pie.labels,
    col = rainbow(length(Q4.pie.labels)), #to plot colored pie charts
    main = "Q4 Value Weighting")

Step 7: Calculate VW Portfolio Values for 1Q 2013

vw.q1 <- subset(vwport,
                vwport$date >= as.Date("2012-12-31") &
                vwport$date <= as.Date("2013-03-31"))
vw.q1[c(1:3, nrow(vw.q1)), ]
##          date AMZN.Close YHOO.Close IBM.Close TSLA.Close AMZN.ret
## 1  2012-12-31     250.87      19.90    191.55      33.87 1.023207
## 2  2013-01-02     257.31      20.08    196.35      35.36 1.025671
## 3  2013-01-03     258.48      19.78    195.27      34.77 1.004547
## 61 2013-03-28     266.49      23.53    213.30      37.89 1.004485
##     YHOO.ret   IBM.ret  TSLA.ret
## 1  1.0205128 1.0090608 1.0195665
## 2  1.0090452 1.0250587 1.0439918
## 3  0.9850598 0.9944996 0.9833145
## 61 0.9974566 1.0114278 0.9929245

vw.q1 <- vw.q1[, c(1, 6:9)]
vw.q1[c(1:3, nrow(vw.q1)), ]
##          date AMZN.ret  YHOO.ret   IBM.ret  TSLA.ret
## 1  2012-12-31 1.023207 1.0205128 1.0090608 1.0195665
## 2  2013-01-02 1.025671 1.0090452 1.0250587 1.0439918
## 3  2013-01-03 1.004547 0.9850598 0.9944996 0.9833145
## 61 2013-03-28 1.004485 0.9974566 1.0114278 0.9929245

names(vw.q1)[2:5] <- paste(c("AMZN", "YHOO", "IBM", "TSLA"))
vw.q1[c(1:3, nrow(vw.q1)), ]
##          date     AMZN      YHOO       IBM      TSLA
## 1  2012-12-31 1.023207 1.0205128 1.0090608 1.0195665
## 2  2013-01-02 1.025671 1.0090452 1.0250587 1.0439918
## 3  2013-01-03 1.004547 0.9850598 0.9944996 0.9833145
## 61 2013-03-28 1.004485 0.9974566 1.0114278 0.9929245

vw.q1[1, 2:5] <- 1
vw.q1$AMZN <- cumprod(vw.q1$AMZN) 
vw.q1$YHOO <- cumprod(vw.q1$YHOO)
vw.q1$IBM <- cumprod(vw.q1$IBM)
vw.q1$TSLA <- cumprod(vw.q1$TSLA)
vw.q1[c(1:3, nrow(vw.q1)), ]
##          date     AMZN      YHOO      IBM     TSLA
## 1  2012-12-31 1.000000 1.0000000 1.000000 1.000000
## 2  2013-01-02 1.025671 1.0090452 1.025059 1.043992
## 3  2013-01-03 1.030335 0.9939699 1.019421 1.026572
## 61 2013-03-28 1.062263 1.1824121 1.118234 1.118689

vw.q1$AMZN.idx <- vw.q1$AMZN * q1.vw.wgt$AMZN.wgt #Apply the Q-end weights; note 
# that q1.vw.wgt$AMZN.wgt is a scalar
vw.q1$YHOO.idx <- vw.q1$YHOO * q1.vw.wgt$YHOO.wgt
vw.q1$IBM.idx <- vw.q1$IBM * q1.vw.wgt$IBM.wgt
vw.q1$TSLA.idx <- vw.q1$TSLA * q1.vw.wgt$TSLA.wgt
vw.q1[c(1:3, nrow(vw.q1)), ]
##          date     AMZN      YHOO      IBM     TSLA  AMZN.idx   YHOO.idx
## 1  2012-12-31 1.000000 1.0000000 1.000000 1.000000 0.3217478 0.06269454
## 2  2013-01-02 1.025671 1.0090452 1.025059 1.043992 0.3300073 0.06326163
## 3  2013-01-03 1.030335 0.9939699 1.019421 1.026572 0.3315079 0.06231649
## 61 2013-03-28 1.062263 1.1824121 1.118234 1.118689 0.3417809 0.07413079
##      IBM.idx   TSLA.idx
## 1  0.6046295 0.01092815
## 2  0.6197807 0.01140890
## 3  0.6163717 0.01121853
## 61 0.6761175 0.01222520
#idx = daily gross returns * quarterly weight
#weight is based on market capitalization
#So larger firms would have a greater influence on portfolio returns

q1.vw.val <- data.frame(rowSums(vw.q1[, 6:9])) #Calculate the daily portfolio values
q1.vw.val[c(1:3, nrow(q1.vw.val)), ]
## [1] 1.000000 1.024459 1.021415 1.104254
names(q1.vw.val) <- paste("port.val")
q1.vw.val$date <- vw.q1$date
q1.vw.val[c(1:3, nrow(q1.vw.val)), ]
##    port.val       date
## 1  1.000000 2012-12-31
## 2  1.024459 2013-01-02
## 3  1.021415 2013-01-03
## 61 1.104254 2013-03-28

q2.vw.inv <- q1.vw.val[nrow(q1.vw.val), 1]
q2.vw.inv
## [1] 1.104254

Step 8: Calculate VW Portfolio Values for 2Q 2013

vw.q2 <- subset(vwport,
                vwport$date >= "2013-04-01" &
                vwport$date <= "2013-06-30")
vw.q2[c(1:3, nrow(vw.q2)), ]
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close  AMZN.ret
## 62  2013-04-01     261.61      23.50    212.38      43.93 0.9816878
## 63  2013-04-02     263.32      23.78    214.36      44.34 1.0065365
## 64  2013-04-03     259.03      23.38    212.66      41.10 0.9837080
## 125 2013-06-28     277.69      25.13    191.11     107.36 1.0005045
##      YHOO.ret   IBM.ret  TSLA.ret
## 62  0.9987250 0.9956868 1.1594088
## 63  1.0119149 1.0093229 1.0093330
## 64  0.9831791 0.9920694 0.9269282
## 125 0.9866510 0.9767953 0.9827002

vw.q2 <- vw.q2[, c(1, 6:9)]
vw.q2[c(1:3, nrow(vw.q2)), ]
##           date  AMZN.ret  YHOO.ret   IBM.ret  TSLA.ret
## 62  2013-04-01 0.9816878 0.9987250 0.9956868 1.1594088
## 63  2013-04-02 1.0065365 1.0119149 1.0093229 1.0093330
## 64  2013-04-03 0.9837080 0.9831791 0.9920694 0.9269282
## 125 2013-06-28 1.0005045 0.9866510 0.9767953 0.9827002

names(vw.q2)[2:5] <- paste(c("AMZN", "YHOO", "IBM", "TSLA"))
vw.q2[c(1:3, nrow(vw.q2)), ]
##           date      AMZN      YHOO       IBM      TSLA
## 62  2013-04-01 0.9816878 0.9987250 0.9956868 1.1594088
## 63  2013-04-02 1.0065365 1.0119149 1.0093229 1.0093330
## 64  2013-04-03 0.9837080 0.9831791 0.9920694 0.9269282
## 125 2013-06-28 1.0005045 0.9866510 0.9767953 0.9827002

#vw.q2[1, 2:4] <- 1 #difference from Q1
vw.q2$AMZN <- cumprod(vw.q2$AMZN)
vw.q2$YHOO <- cumprod(vw.q2$YHOO)
vw.q2$IBM <- cumprod(vw.q2$IBM)
vw.q2$TSLA <- cumprod(vw.q2$TSLA)
vw.q2[c(1:3, nrow(vw.q2)), ]
##           date      AMZN      YHOO       IBM     TSLA
## 62  2013-04-01 0.9816878 0.9987250 0.9956868 1.159409
## 63  2013-04-02 0.9881047 1.0106247 1.0049695 1.170230
## 64  2013-04-03 0.9720065 0.9936251 0.9969995 1.084719
## 125 2013-06-28 1.0420279 1.0679982 0.9001677 2.833465

vw.q2$AMZN.ind <- (q2.vw.inv * q2.vw.wgt$AMZN.wgt) * vw.q2$AMZN #Apply weight
vw.q2$YHOO.ind <- (q2.vw.inv * q2.vw.wgt$YHOO.wgt) * vw.q2$YHOO
vw.q2$IBM.ind <- (q2.vw.inv * q2.vw.wgt$IBM.wgt) * vw.q2$IBM
vw.q2$TSLA.ind <- (q2.vw.inv * q2.vw.wgt$TSLA.wgt) * vw.q2$TSLA
vw.q2[c(1:3, nrow(vw.q2)), ]
##           date      AMZN      YHOO       IBM     TSLA  AMZN.ind   YHOO.ind
## 62  2013-04-01 0.9816878 0.9987250 0.9956868 1.159409 0.3390773 0.07261676
## 63  2013-04-02 0.9881047 1.0106247 1.0049695 1.170230 0.3412937 0.07348198
## 64  2013-04-03 0.9720065 0.9936251 0.9969995 1.084719 0.3357333 0.07224595
## 125 2013-06-28 1.0420279 1.0679982 0.9001677 2.833465 0.3599189 0.07765358
##       IBM.ind   TSLA.ind
## 62  0.6708070 0.01441119
## 63  0.6770609 0.01454569
## 64  0.6716914 0.01348281
## 125 0.6064545 0.03521933

q2.vw.val <- data.frame(rowSums(vw.q2[, 6:9]))
q2.vw.val[c(1:3, nrow(q2.vw.val)), ]
## [1] 1.096912 1.106382 1.093153 1.079246

names(q2.vw.val) <- paste("port.val")
q2.vw.val[c(1:3, nrow(q2.vw.val)), ]
## [1] 1.096912 1.106382 1.093153 1.079246

q2.vw.val$date <- vw.q2$date
q2.vw.val[c(1:3, nrow(q2.vw.val)), ]
##     port.val       date
## 62  1.096912 2013-04-01
## 63  1.106382 2013-04-02
## 64  1.093153 2013-04-03
## 125 1.079246 2013-06-28

q3.vw.inv <- q2.vw.val[nrow(q2.vw.val), 1]
q3.vw.inv
## [1] 1.079246
#$1.104 at the end of Q1 and $1.056 by the end of Q2
#it doesn't mean that the portfolio grew 5.6% during Q2 but 5.6% during Q1-Q2
#b/c it's a cumulative measure

Step 9: Calculate VW Portfolio Values for 3Q 2013

vw.q3 <- subset(vwport,
                vwport$date >= "2013-07-01" &
                vwport$date <= "2013-09-30")
vw.q3[c(1:3, nrow(vw.q3)), ]
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close  AMZN.ret
## 126 2013-07-01     282.10      25.24    191.28     117.18 1.0158810
## 127 2013-07-02     283.73      24.99    191.50     117.82 1.0057781
## 128 2013-07-03     284.03      25.59    193.25     115.24 1.0010573
## 189 2013-09-30     312.64      33.17    185.18     193.37 0.9893358
##      YHOO.ret   IBM.ret  TSLA.ret
## 126 1.0043773 1.0008895 1.0914679
## 127 0.9900951 1.0011502 1.0054617
## 128 1.0240096 1.0091384 0.9781022
## 189 0.9886736 0.9906912 1.0129387

vw.q3 <- vw.q3[, c(1, 6:9)]
vw.q3[c(1:3, nrow(vw.q3)), ]
##           date  AMZN.ret  YHOO.ret   IBM.ret  TSLA.ret
## 126 2013-07-01 1.0158810 1.0043773 1.0008895 1.0914679
## 127 2013-07-02 1.0057781 0.9900951 1.0011502 1.0054617
## 128 2013-07-03 1.0010573 1.0240096 1.0091384 0.9781022
## 189 2013-09-30 0.9893358 0.9886736 0.9906912 1.0129387

names(vw.q3)[2:5] <- paste(c("AMZN", "YHOO", "IBM", "TSLA"))
vw.q3[c(1:3, nrow(vw.q3)), ]
##           date      AMZN      YHOO       IBM      TSLA
## 126 2013-07-01 1.0158810 1.0043773 1.0008895 1.0914679
## 127 2013-07-02 1.0057781 0.9900951 1.0011502 1.0054617
## 128 2013-07-03 1.0010573 1.0240096 1.0091384 0.9781022
## 189 2013-09-30 0.9893358 0.9886736 0.9906912 1.0129387

#vw.q3[1, 2:5] <- 1 #difference from Q1
vw.q3$AMZN <- cumprod(vw.q3$AMZN)
vw.q3$YHOO <- cumprod(vw.q3$YHOO)
vw.q3$IBM <- cumprod(vw.q3$IBM)
vw.q3$TSLA <- cumprod(vw.q3$TSLA)
vw.q3[c(1:3, nrow(vw.q3)), ]
##           date     AMZN     YHOO       IBM     TSLA
## 126 2013-07-01 1.015881 1.004377 1.0008895 1.091468
## 127 2013-07-02 1.021751 0.994429 1.0020407 1.097429
## 128 2013-07-03 1.022831 1.018305 1.0111977 1.073398
## 189 2013-09-30 1.125860 1.319936 0.9738146 1.801136

vw.q3$AMZN.ind <- (q3.vw.inv * q3.vw.wgt$AMZN.wgt) * vw.q3$AMZN #Apply weight
vw.q3$YHOO.ind <- (q3.vw.inv * q3.vw.wgt$YHOO.wgt) * vw.q3$YHOO
vw.q3$IBM.ind <- (q3.vw.inv * q3.vw.wgt$IBM.wgt) * vw.q3$IBM
vw.q3$TSLA.ind <- (q3.vw.inv * q3.vw.wgt$TSLA.wgt) * vw.q3$TSLA
vw.q3[c(1:3, nrow(vw.q3)), ]
##           date     AMZN     YHOO       IBM     TSLA  AMZN.ind   YHOO.ind
## 126 2013-07-01 1.015881 1.004377 1.0008895 1.091468 0.3699912 0.07714892
## 127 2013-07-02 1.021751 0.994429 1.0020407 1.097429 0.3721291 0.07638477
## 128 2013-07-03 1.022831 1.018305 1.0111977 1.073398 0.3725225 0.07821874
## 189 2013-09-30 1.125860 1.319936 0.9738146 1.801136 0.4100463 0.10138786
##       IBM.ind   TSLA.ind
## 126 0.6013463 0.04083668
## 127 0.6020380 0.04105972
## 128 0.6075396 0.04016060
## 189 0.5850794 0.06738854

q3.vw.val <- data.frame(rowSums(vw.q3[, 6:9]))
q3.vw.val[c(1:3, nrow(q3.vw.val)), ]
## [1] 1.089323 1.091612 1.098442 1.163902

names(q3.vw.val) <- paste("port.val")
q3.vw.val[c(1:3, nrow(q3.vw.val)), ]
## [1] 1.089323 1.091612 1.098442 1.163902

q3.vw.val$date <- vw.q3$date
q3.vw.val[c(1:3, nrow(q3.vw.val)), ]
##     port.val       date
## 126 1.089323 2013-07-01
## 127 1.091612 2013-07-02
## 128 1.098442 2013-07-03
## 189 1.163902 2013-09-30

q4.vw.inv <- q3.vw.val[nrow(q3.vw.val), 1]
q4.vw.inv
## [1] 1.163902
#$1.104 at the end of Q1 and $1.111 by the end of Q3
#it doesn't mean that the portfolio grew 11.1% during q3 but 11.1% during Q1-Q3
#b/c it's a cumulative measure

Step 10: Calculate VW Portfolio Values for 4Q 2013

vw.q4 <- subset(vwport,
                vwport$date >= "2013-10-01" &
                  vwport$date <= "2013-12-31")
vw.q4[c(1:3, nrow(vw.q4)), ]
##           date AMZN.Close YHOO.Close IBM.Close TSLA.Close  AMZN.ret
## 190 2013-10-01     320.95      34.31    186.38     193.00 1.0265801
## 191 2013-10-02     320.51      34.14    184.96     180.95 0.9986291
## 192 2013-10-03     314.76      33.88    183.86     173.31 0.9820598
## 253 2013-12-31     398.79      40.44    187.57     150.43 1.0137784
##      YHOO.ret   IBM.ret  TSLA.ret
## 190 1.0343685 1.0064802 0.9980866
## 191 0.9950451 0.9923812 0.9375648
## 192 0.9923844 0.9940527 0.9577784
## 253 1.0059701 1.0062229 0.9868144

vw.q4 <- vw.q4[, c(1, 6:9)]
vw.q4[c(1:3, nrow(vw.q4)), ]
##           date  AMZN.ret  YHOO.ret   IBM.ret  TSLA.ret
## 190 2013-10-01 1.0265801 1.0343685 1.0064802 0.9980866
## 191 2013-10-02 0.9986291 0.9950451 0.9923812 0.9375648
## 192 2013-10-03 0.9820598 0.9923844 0.9940527 0.9577784
## 253 2013-12-31 1.0137784 1.0059701 1.0062229 0.9868144

names(vw.q4)[2:5] <- paste(c("AMZN", "YHOO", "IBM", "TSLA"))
vw.q4[c(1:3, nrow(vw.q4)), ]
##           date      AMZN      YHOO       IBM      TSLA
## 190 2013-10-01 1.0265801 1.0343685 1.0064802 0.9980866
## 191 2013-10-02 0.9986291 0.9950451 0.9923812 0.9375648
## 192 2013-10-03 0.9820598 0.9923844 0.9940527 0.9577784
## 253 2013-12-31 1.0137784 1.0059701 1.0062229 0.9868144

#vw.q4[1, 2:4] <- 1 #difference from Q1
vw.q4$AMZN <- cumprod(vw.q4$AMZN)
vw.q4$YHOO <- cumprod(vw.q4$YHOO)
vw.q4$IBM <- cumprod(vw.q4$IBM)
vw.q4$TSLA <- cumprod(vw.q4$TSLA)
vw.q4[c(1:3, nrow(vw.q4)), ]
##           date     AMZN     YHOO       IBM      TSLA
## 190 2013-10-01 1.026580 1.034368 1.0064802 0.9980866
## 191 2013-10-02 1.025173 1.029243 0.9988120 0.9357708
## 192 2013-10-03 1.006781 1.021405 0.9928718 0.8962611
## 253 2013-12-31 1.275557 1.219174 1.0183460 0.7779387

vw.q4$AMZN.ind <- (q4.vw.inv * q4.vw.wgt$AMZN.wgt) * vw.q4$AMZN #Apply weight
vw.q4$YHOO.ind <- (q4.vw.inv * q4.vw.wgt$YHOO.wgt) * vw.q4$YHOO
vw.q4$IBM.ind <- (q4.vw.inv * q4.vw.wgt$IBM.wgt) * vw.q4$IBM
vw.q4$TSLA.ind <- (q4.vw.inv * q4.vw.wgt$TSLA.wgt) * vw.q4$TSLA
vw.q4[c(1:3, nrow(vw.q4)), ]
##           date     AMZN     YHOO       IBM      TSLA  AMZN.ind  YHOO.ind
## 190 2013-10-01 1.026580 1.034368 1.0064802 0.9980866 0.4260460 0.1007417
## 191 2013-10-02 1.025173 1.029243 0.9988120 0.9357708 0.4254619 0.1002425
## 192 2013-10-03 1.006781 1.021405 0.9928718 0.8962611 0.4178291 0.0994791
## 253 2013-12-31 1.275557 1.219174 1.0183460 0.7779387 0.5293750 0.1187407
##       IBM.ind   TSLA.ind
## 190 0.5865764 0.06856166
## 191 0.5821074 0.06428100
## 192 0.5786454 0.06156695
## 253 0.5934918 0.05343902

q4.vw.val <- data.frame(rowSums(vw.q4[, 6:9]))
q4.vw.val[c(1:3, nrow(q4.vw.val)), ]
## [1] 1.181926 1.172093 1.157521 1.295046

names(q4.vw.val) <- paste("port.val")
q4.vw.val[c(1:3, nrow(q4.vw.val)), ]
## [1] 1.181926 1.172093 1.157521 1.295046

q4.vw.val$date <- vw.q4$date
q4.vw.val[c(1:3, nrow(q4.vw.val)), ]
##     port.val       date
## 190 1.181926 2013-10-01
## 191 1.172093 2013-10-02
## 192 1.157521 2013-10-03
## 253 1.295046 2013-12-31
#$1.104 at the end of Q1 and $1.259 by the end of Q4
#it doesn't mean that the portfolio grew 25.9% during Q4 but 25.9% during Q1-Q4
#b/c it's a cumulative measure

Step 11: Combine Quarterly VW Portfolio Values into One Data Object

vw.portval <- rbind(q1.vw.val, q2.vw.val, q3.vw.val, q4.vw.val)
vw.portval[c(1:3, nrow(vw.portval)), ]
##     port.val       date
## 1   1.000000 2012-12-31
## 2   1.024459 2013-01-02
## 3   1.021415 2013-01-03
## 253 1.295046 2013-12-31

3.3.3 Normalized EW and VW Portfolio Price Chart

Compare the performance of EW and VW portfolio from 12/31/2012 to 12/31/2013

Step 1: Combine the Data

port.val <- merge(vw.portval, ew.portval, by = "date")
port.val[c(1:3, nrow(port.val)), ]
##           date port.val.x port.val.y
## 1   2012-12-31   1.000000   1.000000
## 2   2013-01-02   1.024459   1.025942
## 3   2013-01-03   1.021415   1.017574
## 253 2013-12-31   1.295046   2.291768

Step 2: Rename the Variables

names(port.val)[2:3] <- paste(c("VW.cum", "EW.cum"))
port.val[c(1:3, nrow(port.val)), ]
##           date   VW.cum   EW.cum
## 1   2012-12-31 1.000000 1.000000
## 2   2013-01-02 1.024459 1.025942
## 3   2013-01-03 1.021415 1.017574
## 253 2013-12-31 1.295046 2.291768

Step 3: Plot the Data

par(mfrow = c(1, 1))
y.range <- range(port.val[, 2:3])
y.range
## [1] 1.000000 2.312282
plot(port.val$EW.cum,
     xlab = "Date",
     ylab = "Value of Investment",
     ylim = y.range,
     type = "l",
     lty = 1,
     main = "Value of R1 Investment in Equal-Weighted and
          Value-Weighted Portfolio of AMZN, YHOO, and IBM
          December 31, 2012 - December 31, 2013")
lines(port.val$VW.cum, lty = 2)
abline(h = 1, lty = 1)
legend("topleft",
       c("Equal-Weighted Portfolio", "Value-Weighted Portfolio"), #typo in the textbook
       lty = c(1, 2))