Key Issues
portfolio returns = returns of basket of securities benchmark portfolio = hypothetical portfolio that we can compare the performance of our portf
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)
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
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
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
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))