Portfolio Analysis in R

Chapter 1 The building blocks

1.1 Calculating portfolio weights when component values are given

# Define the vector values
values <- c(4000, 4000, 2000)

# Define the vector weights
weights <- values / sum(values)

# Print the resulting weights
weights  
## [1] 0.4 0.4 0.2

1.2 The weights of an equally weighted portfolio

# case of four assets
N = 4
weights <- rep(1/N,N)

1.3 The weights of a market capitalization weighted portfolio

# Define marketcaps
 marketcaps <- c(5,8,9,20,25,100,100,500,700,2000)
  
# Compute the weights
weights <- marketcaps / sum(marketcaps)
  
# Inspect summary statistics
summary(weights)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.001442 0.003389 0.018030 0.100000 0.115400 0.576900
  
# Create a barplot of weights
  barplot(weights)

1.4 Calculation of portfolio returns

# Vector of initial value of the assets
in_values <- c(1000, 5000, 2000)
  
# Vector of final values of the assets
fin_values <- c(1100, 4500, 3000)

# Weights as the proportion of total value invested in each assets
weights <- in_values / sum(in_values)

# Vector of simple returns of the assets 
returns <- (fin_values - in_values) / in_values
  
# Compute portfolio return using the portfolio return formula
preturns <- sum(returns * weights)

1.5 From simple to gross and multi-period returns

The answer is End-value = 1045. We know this because we can plug our return, R, into the equation (1+(1+R1R1)∗(1+)∗(1+R2R2 )−1 meaning our return is compounded and (ignoring taxes) we substract our initial investment from the total that we have after two years.

1.6 The asymmetric impact of gains and losses

The answer is 100%. This makes sense because after a 50% loss, our investment will have to double itself in order to reach our par.

1.7 The time series of asset returns

# Load packages  
library(PerformanceAnalytics)
library(quantmod)
library(xts)

# Import data
prices <- read.csv("~/resources/rstudio/New Folder With Items 2/prices.csv")

prices$Date <- as.Date(prices$Date, format("%m/%d/%Y"))
prices <- prices[order(prices$Date), ]
prices <- as.xts(prices[, 2:3], order.by = prices$Date)

# Import data (alternative)
#data.AAPL <- getSymbols("AAPL", from = "2005-12-31", to = "2016-08-31", auto.assign = FALSE)
#data.MSFT <- getSymbols("MSFT", from = "2005-12-31", to = "2016-08-31", auto.assign = FALSE)


# Print the first and last six rows of prices
head(prices)
##                 AAPL     MSFT
## 2006-01-03  9.776503 20.94342
## 2006-01-04  9.805277 21.04486
## 2006-01-05  9.728111 21.06047
## 2006-01-06  9.979226 20.99804
## 2006-01-09  9.946529 20.95903
## 2006-01-10 10.575626 21.06827

tail(prices)
##              AAPL  MSFT
## 2016-08-24 108.03 57.95
## 2016-08-25 107.57 58.17
## 2016-08-26 106.94 58.03
## 2016-08-29 106.82 58.10
## 2016-08-30 106.00 57.89
## 2016-08-31 106.10 57.46


# Create the variable returns using Return.calculate()  
returns <- Return.calculate(prices)
  
# Print the first six rows of returns. Note that the first observation is NA, because there is no prior price.
head(returns)
##                    AAPL          MSFT
## 2006-01-03           NA            NA
## 2006-01-04  0.002943179  0.0048435260
## 2006-01-05 -0.007869844  0.0007417488
## 2006-01-06  0.025813336 -0.0029643213
## 2006-01-09 -0.003276507 -0.0018577924
## 2006-01-10  0.063247893  0.0052120733

tail(returns)
##                     AAPL         MSFT
## 2016-08-24 -0.0075332937  0.001036448
## 2016-08-25 -0.0042580672  0.003796376
## 2016-08-26 -0.0058566329 -0.002406739
## 2016-08-29 -0.0011221432  0.001206273
## 2016-08-30 -0.0076764651 -0.003614458
## 2016-08-31  0.0009433774 -0.007427880


# Remove the first row of returns
returns <- returns[-1, ]

1.8 The time series of portfolio returns

# Create the weights
eq_weights <- c(0.5, 0.5)

# Create a portfolio using buy and hold
pf_bh <- Return.portfolio(returns, weights = eq_weights)

# Create a portfolio rebalancing monthly 
pf_rebal <- Return.portfolio(returns, weights = eq_weights, rebalance_on = "months")

# Plot the time-series
par(mfrow = c(2, 1), mar = c(2, 4, 2, 2))
plot.zoo(pf_bh)
plot.zoo(pf_rebal)

1.9 The time series of weights

# Create the weights
eq_weights <- c(0.5, 0.5)

# Create a portfolio using buy and hold
pf_bh <- Return.portfolio(returns, weights = eq_weights, verbose = TRUE )

# Create a portfolio that rebalances monthly
pf_rebal <- Return.portfolio(returns, weights = eq_weights, rebalance_on = "months", verbose = TRUE )

# Create eop_weight_bh
eop_weight_bh <- pf_bh$EOP.Weight
head(eop_weight_bh)
##                 AAPL      MSFT
## 2006-01-04 0.4995268 0.5004732
## 2006-01-05 0.4973662 0.5026338
## 2006-01-06 0.5044797 0.4955203
## 2006-01-09 0.5041241 0.4958759
## 2006-01-10 0.5181486 0.4818514
## 2006-01-11 0.5246922 0.4753078

# Create eop_weight_rebal
eop_weight_rebal <- pf_rebal$EOP.Weight
head(eop_weight_rebal)
##                 AAPL      MSFT
## 2006-01-04 0.4995268 0.5004732
## 2006-01-05 0.4973662 0.5026338
## 2006-01-06 0.5044797 0.4955203
## 2006-01-09 0.5041241 0.4958759
## 2006-01-10 0.5181486 0.4818514
## 2006-01-11 0.5246922 0.4753078

# Plot end of period weights
par(mfrow = c(2, 1), mar=c(2, 4, 2, 2))
plot.zoo(eop_weight_bh$AAPL)
plot.zoo(eop_weight_rebal$AAPL)

Chapter 2 Analyzing performance

2.1 Exploring the monthly S&P 500 returns

library(PerformanceAnalytics)
library(quantmod)
library(xts)

# Import data
sp500 <- read.csv("~/resources/rstudio/New Folder With Items 2/sp500.csv")

sp500$Date <- as.Date(sp500$Date, format("%m/%d/%Y"))
sp500 <- sp500[order(sp500$Date), ]
sp500 <- as.xts(sp500[, 2], order.by = sp500$Date)

# Convert the daily frequency of sp500 to monthly frequency: sp500_monthly
sp500_monthly <- to.monthly(sp500)

# Print the first six rows of sp500_monthly
head(sp500_monthly)
##          sp500.Open sp500.High sp500.Low sp500.Close
## Dec 1985     211.28     211.28    211.28      211.28
## Jan 1986     211.78     211.78    211.78      211.78
## Feb 1986     226.92     226.92    226.92      226.92
## Mar 1986     238.90     238.90    238.90      238.90
## Apr 1986     235.52     235.52    235.52      235.52
## May 1986     247.35     247.35    247.35      247.35

# Create sp500_returns using Return.calculate using the closing prices
sp500_returns <- Return.calculate(sp500_monthly$sp500.Close)
head(sp500_returns)
##           sp500.Close
## Dec 1985           NA
## Jan 1986  0.002366528
## Feb 1986  0.071489281
## Mar 1986  0.052793936
## Apr 1986 -0.014148179
## May 1986  0.050229280

# Time series plot
plot.zoo(sp500_returns)


# Produce the year x month table
table.CalendarReturns(sp500_returns)
##       Jan   Feb  Mar  Apr  May  Jun  Jul   Aug   Sep   Oct  Nov  Dec
## 1985   NA    NA   NA   NA   NA   NA   NA    NA    NA    NA   NA   NA
## 1986  0.2   7.1  5.3 -1.4  5.0  1.4 -5.9   7.1  -8.5   5.5  2.1 -2.8
## 1987 13.2   3.7  2.6 -1.1  0.6  4.8  4.8   3.5  -2.4 -21.8 -8.5  7.3
## 1988  4.0   4.2 -3.3  0.9  0.3  4.3 -0.5  -3.9   4.0   2.6 -1.9  1.5
## 1989  7.1  -2.9  2.1  5.0  3.5 -0.8  8.8   1.6  -0.7  -2.5  1.7  2.1
## 1990 -6.9   0.9  2.4 -2.7  9.2 -0.9 -0.5  -9.4  -5.1  -0.7  6.0  2.5
## 1991  4.2   6.7  2.2  0.0  3.9 -4.8  4.5   2.0  -1.9   1.2 -4.4 11.2
## 1992 -2.0   1.0 -2.2  2.8  0.1 -1.7  3.9  -2.4   0.9   0.2  3.0  1.0
## 1993  0.7   1.0  1.9 -2.5  2.3  0.1 -0.5   3.4  -1.0   1.9 -1.3  1.0
## 1994  3.3  -3.0 -4.6  1.2  1.2 -2.7  3.1   3.8  -2.7   2.1 -4.0  1.2
## 1995  2.4   3.6  2.7  2.8  3.6  2.1  3.2   0.0   4.0  -0.5  4.1  1.7
## 1996  3.3   0.7  0.8  1.3  2.3  0.2 -4.6   1.9   5.4   2.6  7.3 -2.2
## 1997  6.1   0.6 -4.3  5.8  5.9  4.3  7.8  -5.7   5.3  -3.4  4.5  1.6
## 1998  1.0   7.0  5.0  0.9 -1.9  3.9 -1.2 -14.6   6.2   8.0  5.9  5.6
## 1999  4.1  -3.2  3.9  3.8 -2.5  5.4 -3.2  -0.6  -2.9   6.3  1.9  5.8
## 2000 -5.1  -2.0  9.7 -3.1 -2.2  2.4 -1.6   6.1  -5.3  -0.5 -8.0  0.4
## 2001  3.5  -9.2 -6.4  7.7  0.5 -2.5 -1.1  -6.4  -8.2   1.8  7.5  0.8
## 2002 -1.6  -2.1  3.7 -6.1 -0.9 -7.2 -7.9   0.5 -11.0   8.6  5.7 -6.0
## 2003 -2.7  -1.7  0.8  8.1  5.1  1.1  1.6   1.8  -1.2   5.5  0.7  5.1
## 2004  1.7   1.2 -1.6 -1.7  1.2  1.8 -3.4   0.2   0.9   1.4  3.9  3.2
## 2005 -2.5   1.9 -1.9 -2.0  3.0  0.0  3.6  -1.1   0.7  -1.8  3.5 -0.1
## 2006  2.5   0.0  1.1  1.2 -3.1  0.0  0.5   2.1   2.5   3.2  1.6  1.3
## 2007  1.4  -2.2  1.0  4.3  3.3 -1.8 -3.2   1.3   3.6   1.5 -4.4 -0.9
## 2008 -6.1  -3.5 -0.6  4.8  1.1 -8.6 -1.0   1.2  -9.1 -16.9 -7.5  0.8
## 2009 -8.6 -11.0  8.5  9.4  5.3  0.0  7.4   3.4   3.6  -2.0  5.7  1.8
## 2010 -3.7   2.9  5.9  1.5 -8.2 -5.4  6.9  -4.7   8.8   3.7 -0.2  6.5
## 2011  2.3   3.2 -0.1  2.8 -1.4 -1.8 -2.1  -5.7  -7.2  10.8 -0.5  0.9
## 2012  4.4   4.1  3.1 -0.7 -6.3  4.0  1.3   2.0   2.4  -2.0  0.3  0.7
## 2013  5.0   1.1  3.6  1.8  2.1 -1.5  4.9  -3.1   3.0   4.5  2.8  2.4
## 2014 -3.6   4.3  0.7  0.6  2.1  1.9 -1.5   3.8  -1.6   2.3  2.5 -0.4
## 2015 -3.1   5.5 -1.7  0.9  1.0 -2.1  2.0  -6.3  -2.6   8.3  0.1 -1.8
## 2016 -5.1  -0.4  6.6  0.3  1.5  0.1  3.6  -0.1    NA    NA   NA   NA
##      sp500.Close
## 1985          NA
## 1986        14.6
## 1987         2.0
## 1988        12.4
## 1989        27.3
## 1990        -6.6
## 1991        26.3
## 1992         4.5
## 1993         7.1
## 1994        -1.5
## 1995        34.1
## 1996        20.3
## 1997        31.0
## 1998        26.7
## 1999        19.5
## 2000       -10.1
## 2001       -13.0
## 2002       -23.4
## 2003        26.4
## 2004         9.0
## 2005         3.0
## 2006        13.6
## 2007         3.5
## 2008       -38.5
## 2009        23.5
## 2010        12.8
## 2011         0.0
## 2012        13.4
## 2013        29.6
## 2014        11.4
## 2015        -0.7
## 2016         6.2

2.2 The monthly mean and volatility

# Define sp500_returns
sp500_returns <- Return.calculate(sp500)
sp500_returns <- sp500_returns[-1, ]
colnames(sp500_returns) <- "sp500"
head(sp500_returns)
##                   sp500
## 1986-01-02  0.002366528
## 1986-02-03  0.071489281
## 1986-03-03  0.052793936
## 1986-04-01 -0.014148179
## 1986-05-01  0.050229280
## 1986-06-02  0.014109561

# Compute the mean monthly returns
mean(sp500_returns)
## [1] 0.007320322

# Compute the geometric mean of monthly returns
mean.geometric(sp500_returns)
##                      sp500
## Geometric Mean 0.006350886

# Compute the standard deviation
sd(sp500_returns)
## [1] 0.04364617

2.3 Excess returns and the portfolio’s Sharpe ratio

# Import data
rf <- read.csv("~/resources/rstudio/New Folder With Items 2/rf.csv")

rf$Date <- as.Date(rf$Date, format("%m/%d/%Y"))
rf <- rf[order(rf$Date), ]
rf <- as.xts(rf[, 2], order.by = rf$Date)
head(rf)
##              [,1]
## 1986-01-31 0.0053
## 1986-02-28 0.0060
## 1986-03-31 0.0052
## 1986-04-30 0.0049
## 1986-05-31 0.0052
## 1986-06-30 0.0052

# Align dates of sp500_returns
merged <- merge(rf, sp500_returns)
head(merged)
##                rf       sp500
## 1986-01-02     NA 0.002366528
## 1986-01-31 0.0053          NA
## 1986-02-03     NA 0.071489281
## 1986-02-28 0.0060          NA
## 1986-03-03     NA 0.052793936
## 1986-03-31 0.0052          NA

merged <- na.locf(merged)
head(merged)
##                rf       sp500
## 1986-01-02     NA 0.002366528
## 1986-01-31 0.0053 0.002366528
## 1986-02-03 0.0053 0.071489281
## 1986-02-28 0.0060 0.071489281
## 1986-03-03 0.0060 0.052793936
## 1986-03-31 0.0052 0.052793936

head(merged)
##                rf       sp500
## 1986-01-02     NA 0.002366528
## 1986-01-31 0.0053 0.002366528
## 1986-02-03 0.0053 0.071489281
## 1986-02-28 0.0060 0.071489281
## 1986-03-03 0.0060 0.052793936
## 1986-03-31 0.0052 0.052793936

sp500_returns <- merged[, 2]
head(sp500_returns)
##                  sp500
## 1986-01-02 0.002366528
## 1986-01-31 0.002366528
## 1986-02-03 0.071489281
## 1986-02-28 0.071489281
## 1986-03-03 0.052793936
## 1986-03-31 0.052793936

# Compute the annualized risk free rate
annualized_rf <- (1 + rf)^12 - 1

# Plot the annualized risk free rate
plot.zoo(annualized_rf)


# Compute the series of excess portfolio returns
# Adjust date for sp500_returns. This code below doesn't work b/c two objects date don't match
sp500_excess <- sp500_returns - rf

head(sp500_returns)
##                  sp500
## 1986-01-02 0.002366528
## 1986-01-31 0.002366528
## 1986-02-03 0.071489281
## 1986-02-28 0.071489281
## 1986-03-03 0.052793936
## 1986-03-31 0.052793936

head(rf)
##              [,1]
## 1986-01-31 0.0053
## 1986-02-28 0.0060
## 1986-03-31 0.0052
## 1986-04-30 0.0049
## 1986-05-31 0.0052
## 1986-06-30 0.0052

# Compare the mean
mean(sp500_returns)
## [1] 0.007320322

mean(sp500_excess)
## [1] 0.004582279

# Compute the Sharpe ratio
sp500_sharpe <- mean(sp500_excess) / sd(sp500_returns)
sp500_sharpe
## [1] 0.1050585

2.4 Annualized mean and volatility

# Compute the annualized mean
Return.annualized(sp500_returns)
##                        sp500
## Annualized Return 0.07892983

# Compute the annualized standard deviation
StdDev.annualized(sp500_returns)
##                                   sp500
## Annualized Standard Deviation 0.1510919

# Compute the annualized Sharpe ratio: ann_sharpe
ann_sharpe <- Return.annualized(sp500_returns) / StdDev.annualized(sp500_returns)

# Compute all of the above at once using table.AnnualizedReturns()
table.AnnualizedReturns(sp500_returns)
##                            sp500
## Annualized Return         0.0789
## Annualized Std Dev        0.1511
## Annualized Sharpe (Rf=0%) 0.5224

2.5 Effect of window length choice

Annualized volatility on rolling window of 6 months.

2.6 Rolling annualized mean and volatility

# Calculate the mean, volatility, and sharpe ratio of sp500_returns
returns_ann = Return.annualized(sp500_returns)
sd_ann = StdDev.annualized(sp500_returns)
sharpe_ann = SharpeRatio.annualized(sp500_returns, Rf = rf)

# Plotting the 12-month rolling annualized mean
chart.RollingPerformance(R = sp500_returns, width = 12, FUN = "Return.annualized")
abline(h = returns_ann)

2.7 Subperiod performance analysis and the function window

# Import data
sp500_returns <- read.csv("~/resources/rstudio/New Folder With Items 2/sp500Daily.csv")

sp500_returns$Date <- as.Date(sp500_returns$Date, format("%m/%d/%Y"))
sp500_returns <- sp500_returns[order(sp500_returns$Date), ]
sp500_returns <- as.xts(sp500_returns[, 2], order.by = sp500_returns$Date)
colnames(sp500_returns) <- "sp500"
head(sp500_returns)
##                   sp500
## 1986-01-02 -0.007998878
## 1986-01-03  0.006154917
## 1986-01-06 -0.001090720
## 1986-01-07  0.014953760
## 1986-01-08 -0.027268480
## 1986-01-09 -0.008943598


# Fill in window for 2008
sp500_2008 <- window(sp500_returns, start = "2008-01-01", end = "2008-12-31")
head(sp500_2008)
##                   sp500
## 2008-01-02 -0.014437840
## 2008-01-03  0.000000000
## 2008-01-04 -0.024551550
## 2008-01-07  0.003223259
## 2008-01-08 -0.018352270
## 2008-01-09  0.013624080


# Create window for 2014
sp500_2014 <- window(sp500_returns, start = "2014-01-01", end = "2014-12-31")
head(sp500_2014)
##                   sp500
## 2014-01-02 -0.008861913
## 2014-01-03 -0.000332965
## 2014-01-06 -0.002511767
## 2014-01-07  0.006081764
## 2014-01-08 -0.000212209
## 2014-01-09  0.000348309

# Plotting settings
par(mfrow = c(1, 2) , mar=c(3, 2, 2, 2))
names(sp500_2008) <- "sp500_2008"
names(sp500_2014) <- "sp500_2014"

# Plot histogram of 2008
chart.Histogram(sp500_2008, methods = c("add.density", "add.normal"))

# Plot histogram of 2014
chart.Histogram(sp500_2014, methods = c("add.density", "add.normal"))


# Plotting the 12-month rolling annualized standard deviation
chart.RollingPerformance(R = sp500_returns, width = 12, FUN = "StdDev.annualized")
abline(h = sd_ann)

# Plotting the 12-month rolling annualized Sharpe ratio
chart.RollingPerformance(R = sp500_returns, width = 12, FUN = "SharpeRatio.annualized", Rf = rf)
abline(h = sharpe_ann)


# Plotting all three charts together. 
charts.RollingPerformance(R = sp500_returns, width = 12, Rf = rf) 

2.8 Balancing risk and reward

Distribution C.

2.9 Detecting non-normality using skewness and kurtosis

# Define sp500_daily and sp500_monthly
sp500_daily <- sp500_returns
head(sp500_daily)
##                   sp500
## 1986-01-02 -0.007998878
## 1986-01-03  0.006154917
## 1986-01-06 -0.001090720
## 1986-01-07  0.014953760
## 1986-01-08 -0.027268480
## 1986-01-09 -0.008943598

sp500_monthly <- read.csv("~/resources/rstudio/New Folder With Items 2/sp500.csv")

sp500_monthly$Date <- as.Date(sp500_monthly$Date, format("%m/%d/%Y"))
sp500_monthly <- sp500_monthly[order(sp500_monthly$Date), ]
sp500_monthly <- as.xts(sp500_monthly[, 2], order.by = sp500_monthly$Date)
sp500_monthly <- Return.calculate(sp500_monthly)
sp500_monthly <- sp500_monthly[-1, ]
colnames(sp500_monthly) <- "sp500"
head(sp500_monthly)
##                   sp500
## 1986-01-02  0.002366528
## 1986-02-03  0.071489281
## 1986-03-03  0.052793936
## 1986-04-01 -0.014148179
## 1986-05-01  0.050229280
## 1986-06-02  0.014109561

#  Compute the skewness 
skewness(sp500_daily)  
## [1] -0.825167

skewness(sp500_monthly)  
## [1] -0.7916029


# Compute the excess kurtois 
kurtosis(sp500_daily)
## [1] 20.88491

kurtosis(sp500_monthly)
## [1] 2.435507

2.10 Downside risk measures

# Calculate the SemiDeviation
SemiDeviation(sp500_monthly)
##                     sp500
## Semi-Deviation 0.03334653

# Calculate the value at risk
VaR(sp500_monthly, p = 0.025)
##          sp500
## VaR -0.0977536

VaR(sp500_monthly, p = 0.05)
##           sp500
## VaR -0.07152617

# Calculate the expected shortfall
ES(sp500_monthly, p = 0.025)
##         sp500
## ES -0.1653925

ES(sp500_monthly, p = 0.05)
##         sp500
## ES -0.1180061

2.11 Drawdowns due to buying high, selling low

# Table of drawdowns
table.Drawdowns(sp500_monthly)
##         From     Trough         To   Depth Length To Trough Recovery
## 1 2007-11-01 2009-02-02 2013-03-01 -0.5256     65        16       49
## 2 2000-09-01 2002-09-03 2007-05-01 -0.4628     81        25       56
## 3 1987-09-01 1987-11-02 1989-07-03 -0.3017     23         3       20
## 4 1990-06-01 1990-10-01 1991-02-01 -0.1584      9         5        4
## 5 1998-07-01 1998-08-03 1998-11-02 -0.1557      5         2        3

# Plot of drawdowns
chart.Drawdown(sp500_monthly)

Chapter 3 Performance drivers

3.1 Driver 1: The assets’ individual performance

The answer is: The portfolio mean return equals the position weighted sum of the component mean returns. You can test this using: all.equal(mean(returns_6040), 0.6 * mean(returns_equities) + 0.4 * mean(returns_bonds))

3.2 Driver 2: The choice of portfolio weights

# Import data

returns_equities <- read.csv("~/resources/rstudio/New Folder With Items 2/returns_equities.csv")

returns_equities$Date <- as.Date(returns_equities$Date, format("%m/%d/%Y"))
returns_equities <- returns_equities[order(returns_equities$Date), ]
returns_equities <- as.xts(returns_equities[, 2], order.by = returns_equities$Date)
colnames(returns_equities) <- "equities"
head(returns_equities)
##              equities
## 2006-08-30 0.02182242
## 2006-09-29 0.02700156
## 2006-10-30 0.03151669
## 2006-11-29 0.01988532
## 2006-12-30 0.01337125
## 2007-01-30 0.01504026

3.3 Driver 3: The correlation between the asset returns

The answer is: Increases.

3.4 Interpreting correlation

3.5 Making a risk-reward scatter diagram

# Import data
returns <- read.csv("~/resources/rstudio/New Folder With Items 2/returns.csv")
returns$Date <- as.Date(returns$Date, format("%m/%d/%Y"))
returns <- returns[order(returns$Date), ]
returns <- as.xts(returns[, 2:5], order.by = returns$Date)
head(returns)
##              equities        bonds  realestate commodities
## 2006-08-30 0.02182242  0.015909610  0.03484325 -0.07133003
## 2006-09-29 0.02700156  0.010115275  0.01965907 -0.10736263
## 2006-10-30 0.03151669  0.006857468  0.06027768 -0.02543380
## 2006-11-29 0.01988532  0.010619145  0.04781250  0.04999998
## 2006-12-30 0.01337125 -0.006004894 -0.01842563 -0.06922181
## 2007-01-30 0.01504026 -0.000702100  0.08779223 -0.02545548

# Create a vector of returns 
means <- apply(returns, 2, "mean")
  
# Create a vector of standard deviation
sds <- apply(returns, 2, "sd")

# Create a scatter plot
plot(sds, means)
text(sds, means, labels = colnames(returns), cex = 0.7)
abline(h = 0, lty = 3)

3.6 The covariance matrix

# Create a matrix with variances on the diagonal
diag_cov <- diag(sds^2)
diag_cov
##             [,1]         [,2]        [,3]        [,4]
## [1,] 0.001920218 0.0000000000 0.000000000 0.000000000
## [2,] 0.000000000 0.0001222713 0.000000000 0.000000000
## [3,] 0.000000000 0.0000000000 0.005447762 0.000000000
## [4,] 0.000000000 0.0000000000 0.000000000 0.004797972

# Create a covariance matrix of returns
cov_matrix <- cov(returns)
cov_matrix
##                 equities         bonds   realestate   commodities
## equities    1.920218e-03  3.009761e-05 0.0024063778  1.510994e-03
## bonds       3.009761e-05  1.222713e-04 0.0002632232 -6.860821e-05
## realestate  2.406378e-03  2.632232e-04 0.0054477625  1.329142e-03
## commodities 1.510994e-03 -6.860821e-05 0.0013291423  4.797972e-03

# Create a correlation matrix of returns
cor_matrix <- cor(returns)
cor_matrix
##               equities       bonds realestate commodities
## equities    1.00000000  0.06211473  0.7440112  0.49780426
## bonds       0.06211473  1.00000000  0.3225172 -0.08957463
## realestate  0.74401117  0.32251718  1.0000000  0.25997618
## commodities 0.49780426 -0.08957463  0.2599762  1.00000000

# Verify covariances equal the product of standard deviations and correlation
all.equal(cov_matrix[1,2], cor_matrix[1,2] * sds[1] * sds[2])
## [1] "names for current but not for target"

cor_matrix[1,2] * sds[1] * sds[2]
##     equities 
## 3.009761e-05

3.7 Matrix-based calculation of portfolio mean and variance

# Define variables
weights <- c(0.4, 0.4, 0.1, 0.1)
vmeans <- c(0.007069242,  0.004009507,  0.008949548, -0.008296070)
names(vmeans) <- c("equities", "bonds", "realestate", "commodities")
sigma <- matrix(c(0.00192021806,  0.00003009761, 0.0024063778,  0.00151099397,
                  0.00003009761,  0.00012227126, 0.0002632232, -0.00006860821,
                  0.00240637781,  0.00026322319, 0.0054477625,  0.00132914233,
                  0.00151099397, -0.00006860821, 0.0013291423,  0.00479797179),
                ncol = 4, 
                nrow = 4)
colnames(sigma) <- c("equities", "bonds", "realestate", "commodities")
row.names(sigma) <- c("equities", "bonds", "realestate", "commodities")

# Create a weight matrix w
w <- as.matrix(weights)
w
##      [,1]
## [1,]  0.4
## [2,]  0.4
## [3,]  0.1
## [4,]  0.1

# Create a matrix of returns
mu <- as.matrix(vmeans)
mu
##                     [,1]
## equities     0.007069242
## bonds        0.004009507
## realestate   0.008949548
## commodities -0.008296070

# Calculate portfolio mean monthly returns
t(w)%*%mu
##             [,1]
## [1,] 0.004496847

# Calculate portfolio volatility
sqrt(t(w) %*% sigma %*% w)
##            [,1]
## [1,] 0.02818561

3.8 Who did it?

# Create portfolio weights
weights <- c(0.4, 0.4, 0.1, 0.1)

# Create volatility budget
vol_budget <- StdDev(returns, portfolio_method = "component", weights = weights)
vol_budget
## $StdDev
##            [,1]
## [1,] 0.02818561
## 
## $contribution
##    equities       bonds  realestate commodities 
## 0.016630662 0.001141136 0.006192986 0.004220826 
## 
## $pct_contrib_StdDev
##    equities       bonds  realestate commodities 
##  0.59004087  0.04048648  0.21972154  0.14975111

# Make a table of weights and risk contribution
weights_percrisk <- cbind(weights, vol_budget$pct_contrib_StdDev)
colnames(weights_percrisk) <- c("weights", "perc vol contrib")

# Print the table
weights_percrisk
##             weights perc vol contrib
## equities        0.4       0.59004087
## bonds           0.4       0.04048648
## realestate      0.1       0.21972154
## commodities     0.1       0.14975111

Chapter 4 Optimizing the portfolio

4.1 Exploring monthly returns of the 30 DJIA stocks

# Verify the class of returns 
class(returns)
## [1] "xts" "zoo"

# Investigate the dimensions of returns
dim(returns)
## [1] 121   4

# Create a vector of row means
ew_preturns <- rowMeans(returns)

# Cast the numeric vector back to an xts object
ew_preturns <- xts(ew_preturns, order.by = time(returns))

# Plot ew_preturns
plot.zoo(ew_preturns)

4.2 Finding the mean-variance efficient portfolio

# Load tseries
library(tseries)

# Create an optimized portfolio of returns
opt <- portfolio.optim(returns) #Understand the resulted components such pw, px, pm...
head(opt)
## $pw
## [1] 0.000000e+00 9.125234e-01 6.849145e-18 8.747657e-02
## 
## $px
##   [1]  0.0082781851 -0.0001612900  0.0040327384  0.0140640452 -0.0115348936
##   [6] -0.0028674407  0.0180804010  0.0003795384  0.0057821136 -0.0093985102
##  [11] -0.0006992929  0.0139717716  0.0088850050  0.0140354666  0.0144462328
##  [16]  0.0160551749  0.0051354151  0.0207080930  0.0083868401  0.0003598423
##  [21]  0.0101555161 -0.0041393269  0.0073435841 -0.0080593759  0.0002228136
##  [26] -0.0251887264 -0.0467654663  0.0145820697  0.0510191575 -0.0271782262
##  [31] -0.0149849055  0.0140611152  0.0033466975  0.0252841471  0.0036362554
##  [36]  0.0122207925  0.0115107374  0.0087706501  0.0062390593  0.0128624693
##  [41] -0.0163060160  0.0058182556  0.0069862729  0.0004753287  0.0116323741
##  [46] -0.0020164837  0.0162031306  0.0128359411  0.0069500679  0.0070892956
##  [51]  0.0039251661 -0.0065423873  0.0017840516  0.0019425954  0.0049645019
##  [56]  0.0010187653  0.0180276110  0.0053157391 -0.0092719645  0.0181606968
##  [61]  0.0123832972 -0.0040956518  0.0101365764 -0.0017045738  0.0102833999
##  [66]  0.0087169070  0.0053162032 -0.0078864071  0.0079653094 -0.0013419454
##  [71]  0.0004273928  0.0175735757  0.0062697898  0.0005585732 -0.0039506074
##  [76]  0.0038721366 -0.0026889086 -0.0016666843  0.0009272964  0.0018669442
##  [81]  0.0045578570 -0.0196025822 -0.0143134638  0.0073977824 -0.0048256998
##  [86]  0.0071754339  0.0063282937 -0.0026986391 -0.0038960996  0.0121318336
##  [91]  0.0076306610 -0.0014039291  0.0083735533  0.0103126168  0.0015607172
##  [96] -0.0072411119  0.0091239302 -0.0109147088  0.0045068842 -0.0028370236
## [101] -0.0106801435  0.0111069523 -0.0029699123 -0.0023229063  0.0066097006
## [106] -0.0058922211 -0.0100319916 -0.0045226412 -0.0028229684  0.0021568335
## [111]  0.0005744258 -0.0115446855 -0.0089685876  0.0067104698  0.0062777646
## [116]  0.0118916196  0.0113976488  0.0012731731  0.0182261123 -0.0038246096
## [121] -0.0039444996
## 
## $pm
## [1] 0.002933057
## 
## $ps
## [1] 0.01129499

# Create pf_weights
pf_weights <- opt$pw

# Assign asset names
names(pf_weights) <- colnames(returns)
head(pf_weights)
##     equities        bonds   realestate  commodities 
## 0.000000e+00 9.125234e-01 6.849145e-18 8.747657e-02

# Select optimum weights opt_weights
opt_weights <- pf_weights[pf_weights >= 0.01] #How is 0.01 determined?

# Barplot of opt_weights
barplot(opt_weights)


# Print expected portfolio return and volatility
opt$pm 
## [1] 0.002933057

opt$ps
## [1] 0.01129499

4.3 Effect of the return target

# Create portfolio with target return of average returns 
pf_mean <- portfolio.optim(returns, pm = mean(returns))

# Create portfolio with target return 10% greater than average returns
pf_10plus <- portfolio.optim(returns, pm = 1.1 * mean(returns))

# Print the standard deviations of both portfolios
pf_mean$ps
## [1] 0.01129499
pf_10plus$ps
## [1] 0.01088391


# Calculate the proportion increase in standard deviation
(pf_10plus$ps - pf_mean$ps) / (pf_mean$ps)
## [1] -0.03639487

4.4 Imposing weight constraints

4.5 Computing the efficient frontier using a grid of target returns

4.6 Interpreting the efficient frontier

The answer is: The portfolio with the greatest excess return per unit of portfolio volatility is the tangency portfolio.

4.7 Properties of the efficient frontier

The answer is: The observed average return of any risky portfolio is always higher than the risk-free rate.

4.8 The minimum variance and maximum Sharpe ratio portfolio

# Define vpm, vpsd, and mweights
vpm <- c(0.007972167, 0.008296030, 0.008619892, 0.008943755, 0.009267617, 0.009591480,
         0.009915342, 0.010239205, 0.010563067, 0.010886930, 0.011210792, 0.011534655,
         0.011858517, 0.012182380, 0.012506242, 0.012830104, 0.013153967, 0.013477829,
         0.013801692, 0.014125554, 0.014449417, 0.014773279, 0.015097142, 0.015421004,
         0.015744867, 0.016068729, 0.016392592, 0.016716454, 0.017040317, 0.017364179,
         0.017688042, 0.018011904, 0.018335767, 0.018659629, 0.018983492, 0.019307354,
         0.019631217, 0.019955079, 0.020278942, 0.020602804, 0.020926667, 0.021250529,
         0.021574392, 0.021898254, 0.022222117, 0.022545979, 0.022869842, 0.023193704,
         0.023517567)
vpsd <- c(0.05753845, 0.05053003, 0.04459450, 0.03987652, 0.03653676, 0.03446960,
          0.03382149, 0.03371899, 0.03372842, 0.03383093, 0.03402107, 0.03429342,
          0.03464616, 0.03508031, 0.03560354, 0.03621771, 0.03691892, 0.03770411,
          0.03858412, 0.03955908, 0.04062926, 0.04178903, 0.04303549, 0.04436324,
          0.04576521, 0.04723549, 0.04876942, 0.05036122, 0.05201652, 0.05375809,
          0.05557950, 0.05747316, 0.05943216, 0.06145073, 0.06355415, 0.06604677,
          0.06899817, 0.07237495, 0.07614625, 0.08027864, 0.08471929, 0.08949816,
          0.09466386, 0.10015716, 0.10592712, 0.11193095, 0.11813300, 0.12450366,
          0.13102620)
mweights <- read.csv("~/resources/rstudio/New Folder With Items 2/mweights.csv")
mweights
##               AA          AAPL           AXP            BA           BAC
## 1   2.500413e-01  2.826704e-17  1.298240e-16 -6.362972e-18 -8.562982e-17
## 2   1.958210e-01  2.146786e-17  1.014490e-16  2.646376e-17 -6.811375e-17
## 3   1.453890e-01  1.672552e-17  7.337035e-17  1.767478e-17 -5.039109e-17
## 4   9.680079e-02 -1.886119e-18  4.864670e-17  1.301775e-18 -2.812694e-17
## 5   4.549978e-02 -7.041962e-18  2.730571e-17 -1.111477e-19 -7.186243e-18
## 6   2.051779e-17 -8.406904e-19  1.881370e-17 -2.609600e-18 -1.509007e-18
## 7   1.514220e-17  8.222917e-21  2.389718e-17 -2.046173e-18 -7.952368e-18
## 8   1.165272e-17  9.354387e-03  2.972429e-17 -6.739938e-19 -8.444373e-18
## 9   9.047003e-18  1.605952e-02  3.453029e-17  1.121634e-18 -9.112574e-18
## 10  6.655250e-18  2.226933e-02  3.922388e-17  2.444314e-19 -1.034546e-17
## 11  4.409117e-18  2.724711e-02  4.329929e-17  7.369813e-19 -1.260687e-17
## 12  2.162984e-18  3.222489e-02  4.737469e-17 -1.630182e-18 -1.486827e-17
## 13  3.248697e-20  3.716548e-02  5.152175e-17  4.168953e-19 -1.734214e-17
## 14 -1.157919e-18  4.202161e-02  5.631682e-17  3.648254e-19 -2.037607e-17
## 15 -1.829032e-18  4.726362e-02  6.155048e-17  4.627241e-19 -2.331813e-17
## 16 -2.669072e-18  5.285722e-02  6.675532e-17 -3.511870e-18  4.714709e-18
## 17  2.695706e-17  5.845795e-02 -1.162312e-17 -1.358780e-18 -2.538167e-17
## 18  3.218065e-17  6.449409e-02 -1.979675e-17 -1.499820e-18 -2.677407e-17
## 19  3.839741e-17  7.117466e-02 -2.170256e-17 -1.619859e-18 -1.366421e-17
## 20  4.513903e-17  7.873367e-02 -2.441121e-17 -2.636909e-18 -2.777156e-17
## 21  5.220579e-17  8.674513e-02 -2.731966e-17 -3.654725e-18 -2.784274e-17
## 22  5.961727e-17  9.489772e-02 -3.051652e-17 -4.631062e-18 -2.796947e-17
## 23  6.804593e-17  1.032749e-01 -3.482801e-17 -5.836912e-18 -2.830768e-17
## 24  7.647460e-17  1.116520e-01 -3.913951e-17 -7.042762e-18 -2.864589e-17
## 25  8.490326e-17  1.200291e-01 -4.345101e-17 -8.248612e-18 -2.898409e-17
## 26  9.379230e-17  1.286769e-01 -4.751310e-17 -9.789777e-18 -2.935663e-17
## 27  1.028124e-16  1.374016e-01 -5.150421e-17 -1.142638e-17 -2.973895e-17
## 28  1.118324e-16  1.461264e-01 -5.549532e-17 -1.306298e-17 -1.624348e-17
## 29  1.235142e-16  1.561502e-01 -6.071588e-17 -2.371582e-18 -4.449207e-17
## 30  1.360665e-16  1.668757e-01 -6.629107e-17 -3.594232e-19 -3.112615e-17
## 31  1.486188e-16  1.776013e-01 -7.186627e-17  1.652735e-18 -3.163801e-17
## 32  1.611711e-16  1.883268e-01 -7.744146e-17  3.664894e-18 -3.214987e-17
## 33  1.737234e-16  1.990523e-01 -8.301665e-17 -1.815052e-17 -3.266173e-17
## 34  1.862849e-16  2.099116e-01 -8.876474e-17 -1.977029e-17 -3.292696e-17
## 35  2.031440e-16  2.323122e-01 -9.636096e-17 -1.588335e-17 -3.395362e-17
## 36  2.308004e-16  2.801528e-01 -1.068807e-16  8.764221e-18 -3.635558e-17
## 37  2.585890e-16  3.266719e-01 -1.184992e-16  6.705632e-18 -4.277921e-17
## 38  2.865690e-16  3.729527e-01 -1.304212e-16  5.506977e-18 -5.005706e-17
## 39  2.951646e-16  4.220202e-01 -1.454568e-16  7.398773e-18 -5.551414e-17
## 40  3.592713e-16  4.710876e-01 -1.604923e-16  9.290570e-18 -6.097122e-17
## 41  4.233780e-16  5.201551e-01 -1.755279e-16 -5.726891e-17 -6.642830e-17
## 42  4.346278e-16  5.789757e-01 -1.964728e-16 -7.051324e-17 -7.088561e-17
## 43  4.738872e-16  6.387296e-01 -2.179833e-16  1.515467e-17 -7.524723e-17
## 44  4.853910e-16  6.984836e-01 -2.394937e-16  1.867369e-17 -7.960885e-17
## 45  5.524060e-16  7.582375e-01 -2.610041e-16  1.822042e-17 -8.397048e-17
## 46  5.916653e-16  8.179915e-01  8.973086e-17  1.568126e-16 -8.833210e-17
## 47  6.309247e-16  8.777454e-01 -3.745595e-16  1.736660e-16 -9.269373e-17
## 48  6.701841e-16  9.374994e-01  1.470915e-17  6.451694e-16 -9.705535e-17
## 49  7.111711e-16  1.000000e+00 -5.291809e-17  6.949005e-16 -1.019374e-16
##              CAT           CVX            DD           DIS            GE
## 1   5.067696e-17 -3.404934e-17  5.406521e-17 -7.103697e-17 -1.132859e-16
## 2   4.706518e-17 -3.400983e-17  3.900540e-17 -5.278110e-17 -9.211364e-17
## 3   4.445128e-17 -1.673593e-17  2.984499e-17 -1.185420e-17 -6.914559e-17
## 4   3.641690e-17 -2.612255e-18  2.047724e-17  9.981674e-18 -5.084131e-17
## 5   2.657383e-17  4.426338e-03  1.226675e-17 -4.889695e-18 -3.626256e-17
## 6   2.373537e-17  4.034708e-02 -6.948974e-18  6.074775e-18 -2.409659e-17
## 7   2.101665e-17  4.726010e-02 -1.686279e-17  7.737701e-03 -2.016958e-17
## 8   1.354469e-17  3.750144e-02 -1.393143e-17  7.327910e-03 -1.974086e-17
## 9   7.752755e-18  3.003995e-02 -1.173947e-17  2.721441e-03 -1.958019e-17
## 10  2.424676e-18  2.253147e-02 -1.007532e-17  0.000000e+00 -1.980509e-17
## 11 -2.569653e-18  1.427486e-02 -7.796927e-18  0.000000e+00 -1.976049e-17
## 12 -7.563983e-18  6.018261e-03 -5.518535e-18 -1.734723e-18 -1.971588e-17
## 13 -1.268946e-17  0.000000e+00 -3.551801e-18  1.670623e-19 -1.982574e-17
## 14 -1.853673e-17  1.866952e-18 -2.174328e-18  1.983431e-19 -2.091832e-17
## 15 -2.504433e-17  6.026974e-18 -2.891743e-19 -3.183999e-19 -2.262307e-17
## 16 -3.182631e-17 -1.159835e-17  1.738821e-18 -1.213474e-17 -2.448859e-17
## 17 -3.593584e-18  5.033599e-17 -3.965905e-17  1.035384e-17  3.473296e-17
## 18 -1.227575e-18  5.069122e-17 -3.859466e-17  4.307113e-20  4.022639e-17
## 19  7.699280e-19  4.469774e-17 -3.827570e-17 -3.452491e-18  4.647068e-17
## 20  2.689905e-18  5.187293e-17 -3.896991e-17 -5.372869e-19  5.381224e-17
## 21  4.605590e-18  5.185278e-17 -4.007419e-17 -1.196993e-17  6.177120e-17
## 22  6.233321e-18  5.260298e-17 -4.110373e-17 -1.592674e-17  6.953877e-17
## 23  6.767275e-18  5.628625e-17 -4.167885e-17 -1.741923e-17  7.614653e-17
## 24  7.301230e-18  5.996953e-17 -4.225397e-17 -1.891172e-17  8.275428e-17
## 25  7.835184e-18  6.365281e-17 -4.282909e-17 -2.040421e-17  8.936204e-17
## 26  2.054456e-18  6.609987e-17 -4.308106e-17 -2.850997e-17  9.638814e-17
## 27  1.032918e-17  6.819510e-17 -4.324105e-17 -2.264525e-17  1.035333e-16
## 28  0.000000e+00  7.029033e-17 -4.340105e-17 -2.371943e-17  1.106785e-16
## 29 -3.719794e-19  7.277755e-17 -4.432974e-17 -2.719222e-17  1.138237e-16
## 30 -1.146113e-18  7.654956e-17 -4.558315e-17 -1.555043e-17  1.153523e-16
## 31  0.000000e+00  8.032156e-17 -4.683656e-17 -3.908639e-18  1.168808e-16
## 32  0.000000e+00  8.409357e-17 -4.808997e-17 -6.144636e-18  1.184094e-16
## 33  0.000000e+00  8.786558e-17 -4.934338e-17  6.669689e-17  1.199380e-16
## 34  2.336759e-19  9.106107e-17 -5.038489e-17  7.688538e-17  1.216145e-16
## 35  1.277346e-18  8.716399e-17 -4.211566e-17  9.509596e-17  1.159009e-16
## 36 -1.982995e-18  6.761429e-17 -1.243393e-17 -1.049386e-16  9.844472e-17
## 37 -3.933624e-19  5.558364e-17  1.551050e-17 -1.267053e-16  1.071007e-16
## 38 -8.736942e-19  4.499336e-17  4.299932e-17 -1.490944e-16  5.991466e-17
## 39 -1.352470e-18  2.290711e-17  6.680152e-17 -1.761133e-16  4.216634e-17
## 40 -1.831245e-18  8.208581e-19  9.060373e-17 -2.031323e-16  2.441802e-17
## 41 -2.150056e-17 -2.126539e-17  1.144059e-16 -1.384162e-16  6.669696e-18
## 42  1.205953e-17 -4.325143e-17  1.349058e-16 -1.721876e-16 -3.568855e-17
## 43 -1.086272e-18 -6.522788e-17  1.550896e-16 -2.069687e-16 -4.999018e-17
## 44  1.685873e-17 -2.489696e-16  1.752734e-16  3.293299e-16 -3.653623e-17
## 45  7.322463e-17 -2.897681e-16  1.954571e-16  3.430726e-16 -5.083786e-17
## 46 -1.004986e-17 -2.765802e-17  2.156409e-16 -3.473053e-16 -6.513949e-17
## 47  5.030533e-18 -4.626261e-17  2.358247e-16 -3.690310e-16 -7.944112e-17
## 48  5.769731e-17 -8.979484e-16  2.560085e-16  1.756662e-16 -1.214983e-16
## 49 -2.559344e-17 -9.465284e-16  2.811302e-16  1.926695e-16 -1.089489e-16
##               HD           HPQ          INTC           IBM           JNJ
## 1  -2.283165e-17 -4.810977e-17  3.174840e-17 -1.374090e-17  2.219800e-17
## 2  -1.303594e-17  4.705699e-18  2.069763e-17  1.703180e-18 -6.811368e-17
## 3   2.248861e-18 -1.029998e-17  1.613679e-17 -1.887659e-19 -8.390824e-18
## 4  -4.316595e-17  1.607002e-17  4.392765e-17  0.000000e+00 -4.337350e-18
## 5  -2.019011e-17  3.814920e-18 -2.279980e-17  3.645839e-02 -2.428021e-17
## 6  -7.178601e-18 -2.090251e-19 -1.182593e-17  5.650550e-02  2.178784e-18
## 7   7.182906e-19 -3.702768e-18 -3.482348e-19  5.716259e-02  4.090884e-02
## 8   1.645389e-02 -4.315389e-18  1.079063e-04  4.911507e-02  5.066905e-02
## 9   3.008586e-02 -4.044121e-18  6.367159e-03  4.068794e-02  5.618938e-02
## 10  4.248975e-02 -4.702404e-18  1.185527e-02  3.249727e-02  6.136902e-02
## 11  5.212163e-02 -7.893260e-18  1.452509e-02  2.320808e-02  6.575517e-02
## 12  6.175352e-02 -1.108412e-17  1.719490e-02  1.391888e-02  7.014131e-02
## 13  7.145924e-02 -1.302153e-18  1.996604e-02  4.588315e-03  7.447670e-02
## 14  8.205783e-02 -2.209552e-18  2.231590e-02  0.000000e+00  7.833811e-02
## 15  9.407332e-02 -3.059768e-18  2.387207e-02 -5.042334e-19  8.193263e-02
## 16  1.068698e-01  4.703074e-19  2.524267e-02 -2.629200e-18  8.531465e-02
## 17  1.196897e-01 -1.075245e-17  2.660274e-02 -2.169869e-17  8.866017e-02
## 18  1.300848e-01 -7.258228e-18  2.758538e-02 -1.786286e-17  9.175126e-02
## 19  1.379620e-01 -2.926741e-18  2.852771e-02 -1.297469e-17  9.367884e-02
## 20  1.458133e-01  1.377122e-18  2.953153e-02 -8.127668e-18  9.507295e-02
## 21  1.537302e-01 -1.230831e-18  3.063951e-02 -3.231589e-18  9.514983e-02
## 22  1.613996e-01  1.059174e-17  3.158218e-02  2.012095e-18  9.429551e-02
## 23  1.680427e-01  1.053237e-17  3.178330e-02  8.452977e-18  9.172683e-02
## 24  1.746859e-01  1.741190e-17  3.198442e-02  1.489386e-17  8.915815e-02
## 25  1.813290e-01  3.123032e-17  3.218554e-02  2.133474e-17  8.658948e-02
## 26  1.875540e-01  3.831063e-17  3.231194e-02  2.758636e-17  8.343673e-02
## 27  1.936599e-01  4.544810e-17  3.241708e-02  3.378412e-17  8.011775e-02
## 28  1.997659e-01  5.258556e-17  3.252222e-02  3.998187e-17  7.679877e-02
## 29  2.060558e-01  6.168862e-17  3.202106e-02  4.489586e-17  6.664637e-02
## 30  2.122036e-01  7.832401e-17  3.132751e-02  4.913502e-17  5.235103e-02
## 31  2.183513e-01  8.108162e-17  3.063397e-02  5.337417e-17  3.805568e-02
## 32  2.244990e-01  9.077812e-17  2.994042e-02  5.761333e-17  2.376034e-02
## 33  2.306467e-01  1.004746e-16  2.924688e-02  6.185249e-17  9.464992e-03
## 34  2.366837e-01  1.102672e-16  2.835296e-02  6.593730e-17  0.000000e+00
## 35  2.306000e-01  1.236838e-16  2.140331e-02  7.041439e-17 -6.477559e-19
## 36  2.010948e-01  3.337774e-17  3.281997e-03  7.954321e-17  1.860253e-17
## 37  1.699527e-01  5.421023e-17  0.000000e+00  8.844862e-17 -1.288824e-17
## 38  1.381966e-01  7.441573e-17  6.545491e-20  9.731412e-17 -1.260289e-17
## 39  9.343430e-02  9.851163e-17  3.511320e-18  1.066706e-16 -1.314846e-17
## 40  4.867197e-02  1.226075e-16  6.957185e-18  1.160270e-16 -1.369403e-17
## 41  3.909642e-03 -1.250268e-16 -3.318460e-17 -1.401009e-16 -4.891969e-18
## 42  0.000000e+00 -1.261589e-16 -3.424162e-17 -1.750423e-16 -4.761785e-18
## 43  0.000000e+00  5.844636e-17 -4.468367e-17 -2.109941e-16 -2.994946e-16
## 44  0.000000e+00  2.007822e-16  1.759194e-17 -3.173964e-16  8.825932e-18
## 45  0.000000e+00  2.321773e-16 -2.782783e-17 -3.576943e-16 -1.742315e-16
## 46  0.000000e+00  2.191169e-18  6.309564e-17 -7.430858e-17 -1.730874e-17
## 47  0.000000e+00 -6.457742e-18  8.764056e-19 -8.055161e-17 -2.885450e-16
## 48  0.000000e+00 -2.826020e-16 -8.212267e-17  3.516089e-16  1.594502e-18
## 49 -5.103331e-18 -3.059966e-16 -4.497721e-17  3.881073e-16  4.944721e-17
##              JPM            KO           MCD           MMM           MRK
## 1   1.388062e-17 -7.867687e-17 -7.651686e-17  6.771145e-18  0.000000e+00
## 2   8.629911e-18  1.301815e-17 -8.116949e-17  1.085035e-17  0.000000e+00
## 3   3.516594e-18  2.764076e-17 -8.100975e-17 -2.958045e-17  0.000000e+00
## 4  -2.662139e-19  3.716041e-18  7.922489e-17  2.692981e-18  9.016730e-04
## 5   2.082739e-18  7.773420e-03  3.071365e-17 -4.336809e-19  1.400944e-02
## 6   5.643014e-18  2.576002e-02  2.053103e-18  6.277400e-02  2.116400e-02
## 7   1.438959e-18  2.947633e-02  0.000000e+00  8.675831e-02  1.159836e-02
## 8   1.037766e-18  2.746359e-02  1.034804e-02  8.448407e-02  8.298201e-03
## 9   8.305309e-19  2.638024e-02  1.685984e-02  8.074190e-02  6.743282e-03
## 10  6.425496e-19  2.509905e-02  2.225611e-02  7.641016e-02  5.422007e-03
## 11  6.470796e-19  2.276019e-02  2.724509e-02  7.402585e-02  4.084224e-03
## 12  6.516096e-19  2.042133e-02  3.223407e-02  7.164155e-02  2.746441e-03
## 13  5.684486e-19  1.813505e-02  3.705720e-02  6.901777e-02  1.556290e-03
## 14  8.360793e-19  1.658232e-02  4.115140e-02  6.441364e-02  9.610909e-04
## 15  1.703637e-18  1.575249e-02  4.491994e-02  5.781032e-02  1.439690e-04
## 16 -6.426945e-20  1.493977e-02  4.860488e-02  5.067389e-02  0.000000e+00
## 17  0.000000e+00  1.411051e-02  5.228460e-02  4.354675e-02  4.528918e-20
## 18  2.438955e-03  1.158014e-02  5.530831e-02  3.600302e-02 -4.071859e-18
## 19  5.667172e-03  7.204534e-03  5.792113e-02  2.803722e-02  1.849165e-18
## 20  9.573757e-03  1.680197e-03  5.883952e-02  1.850203e-02  6.265146e-18
## 21  1.348064e-02  0.000000e+00  5.888313e-02  8.206057e-03  3.894147e-19
## 22  1.728077e-02  1.933105e-19  5.898914e-02  0.000000e+00  5.402286e-19
## 23  2.097557e-02  1.102899e-18  5.990503e-02 -1.734724e-18 -7.738553e-19
## 24  2.467036e-02  2.012487e-18  6.082093e-02  0.000000e+00 -2.087939e-18
## 25  2.836516e-02 -3.469447e-18  6.173682e-02 -3.485962e-18 -3.402023e-18
## 26  3.165882e-02  3.520982e-19  6.202449e-02 -2.790620e-18  7.638276e-19
## 27  3.483832e-02  8.044086e-19  6.213335e-02  3.703466e-18  2.055267e-19
## 28  3.801782e-02  4.905722e-18  6.224221e-02 -1.163505e-17  2.044717e-18
## 29  4.169642e-02  9.961311e-18  5.482618e-02 -1.588247e-17 -4.721045e-18
## 30  4.532427e-02  1.478749e-18  4.424313e-02 -2.162749e-17 -1.754495e-17
## 31  4.895213e-02 -7.003814e-18  3.366009e-02 -2.737251e-17 -3.036886e-17
## 32  5.257999e-02 -1.548638e-17  2.307704e-02 -3.311753e-17 -4.319277e-17
## 33  5.620784e-02  3.286213e-17  1.249400e-02 -3.061097e-17 -2.975738e-17
## 34  6.023836e-02 -4.967573e-17  7.273827e-04 -4.572409e-17 -7.477499e-18
## 35  5.807319e-02  7.375990e-17 -9.980028e-19 -3.969007e-17  4.983114e-18
## 36  4.227169e-02  1.400211e-17  0.000000e+00 -1.190382e-16  1.479384e-17
## 37  2.147975e-02  1.647477e-17  1.601930e-17 -1.619468e-16  4.844798e-17
## 38  0.000000e+00  1.942097e-17  2.214144e-17 -2.040436e-16  6.757094e-17
## 39  0.000000e+00  1.351249e-17  2.961028e-17 -2.450107e-16  8.573887e-17
## 40  0.000000e+00  7.603996e-18  3.707912e-17 -2.859779e-16  1.039068e-16
## 41  0.000000e+00  2.300512e-16  4.070032e-18 -2.609963e-16  7.581769e-17
## 42  8.979704e-18  2.427221e-16  5.158039e-18 -2.874165e-16  1.062089e-16
## 43  5.880532e-18  3.005300e-17 -6.572363e-17 -3.132069e-16  1.960477e-16
## 44 -2.865785e-17  3.693723e-16 -1.284346e-17 -7.440417e-17  1.825321e-16
## 45 -2.646732e-17  4.185701e-16 -2.395542e-16 -7.154623e-17 -2.309082e-16
## 46 -2.416799e-17 -5.628326e-16 -7.956777e-18  2.717402e-16  5.263110e-16
## 47 -6.908392e-17 -6.114574e-16  2.959947e-17  2.942909e-16  5.814719e-16
## 48  0.000000e+00 -1.109785e-16  1.173563e-16  5.695255e-16  3.477732e-17
## 49 -1.350489e-17 -1.396921e-16  0.000000e+00  6.117761e-16  4.364512e-17
##             MSFT           NKE           PFE            PG           TRV
## 1  -3.308735e-17  1.967923e-17 -2.886706e-16  0.000000e+00 -2.190680e-17
## 2  -1.839682e-17  1.908626e-17  2.209616e-17  5.980581e-02 -1.501376e-18
## 3  -6.688891e-18  1.729856e-17 -2.396707e-17  1.341766e-01 -2.353606e-17
## 4   1.398479e-17  2.174111e-17  2.235910e-18  1.740898e-01  6.094680e-18
## 5   2.536649e-17  1.427626e-17 -2.002834e-17  1.981513e-01  5.229552e-18
## 6   5.935482e-18 -2.670393e-18  5.333580e-18  1.942548e-01  0.000000e+00
## 7   3.783007e-18 -2.895636e-18  4.404974e-03  1.853456e-01  2.721564e-02
## 8   5.540859e-19  0.000000e+00  1.080263e-02  1.810028e-01  3.128128e-02
## 9  -2.026789e-18  6.463374e-03  1.410979e-02  1.785223e-01  3.253681e-02
## 10  4.247727e-04  1.574007e-02  1.652421e-02  1.760481e-01  3.281676e-02
## 11  8.175591e-03  2.379828e-02  1.709996e-02  1.736616e-01  3.363349e-02
## 12  1.592641e-02  3.185650e-02  1.767570e-02  1.712751e-01  3.445022e-02
## 13  2.363293e-02  3.993816e-02  1.811494e-02  1.691179e-01  3.502441e-02
## 14  3.075733e-02  4.877301e-02  1.795476e-02  1.678369e-01  3.486992e-02
## 15  3.697752e-02  5.852968e-02  1.773744e-02  1.676417e-01  3.423981e-02
## 16  4.282550e-02  6.855594e-02  1.723785e-02  1.680597e-01  3.316052e-02
## 17  4.867448e-02  7.858945e-02  1.667893e-02  1.684677e-01  3.206386e-02
## 18  5.454244e-02  8.850511e-02  1.596658e-02  1.675765e-01  3.020453e-02
## 19  6.081004e-02  9.845169e-02  1.559932e-02  1.654400e-01  2.768790e-02
## 20  6.682115e-02  1.088534e-01  1.425606e-02  1.633842e-01  2.462474e-02
## 21  7.268038e-02  1.194679e-01  1.268482e-02  1.602001e-01  2.094815e-02
## 22  7.878842e-02  1.300457e-01  1.119219e-02  1.561119e-01  1.679997e-02
## 23  8.593499e-02  1.403646e-01  9.912578e-03  1.503917e-01  1.158511e-02
## 24  9.308156e-02  1.506835e-01  8.632970e-03  1.446714e-01  6.370249e-03
## 25  1.002281e-01  1.610024e-01  7.353362e-03  1.389512e-01  1.155386e-03
## 26  1.078008e-01  1.706873e-01  5.723080e-03  1.334784e-01  0.000000e+00
## 27  1.154947e-01  1.801918e-01  3.992991e-03  1.280760e-01  0.000000e+00
## 28  1.231887e-01  1.896963e-01  2.262901e-03  1.226736e-01 -2.472750e-18
## 29  1.318359e-01  2.015398e-01  0.000000e+00  1.092283e-01 -1.025837e-18
## 30  1.406660e-01  2.142174e-01  0.000000e+00  9.279142e-02  2.548881e-18
## 31  1.494961e-01  2.268949e-01  0.000000e+00  7.635453e-02 -6.525836e-18
## 32  1.583262e-01  2.395725e-01  0.000000e+00  5.991765e-02 -8.825120e-18
## 33  1.671564e-01  2.522501e-01  5.300192e-18  4.348077e-02  1.318579e-18
## 34  1.755296e-01  2.647073e-01  7.912357e-18  2.384915e-02 -4.171643e-18
## 35  1.844730e-01  2.731383e-01  3.053827e-18  1.734723e-18 -1.113641e-17
## 36  1.972442e-01  2.759546e-01  3.544613e-17 -2.964420e-17  3.191239e-17
## 37  2.041424e-01  2.777532e-01  5.829667e-17 -6.667980e-18  1.762612e-17
## 38  2.096187e-01  2.792320e-01  8.153672e-17 -2.971723e-18  3.045491e-17
## 39  2.087358e-01  2.758097e-01  1.011189e-16  1.671413e-17  3.228483e-17
## 40  2.078530e-01  2.723874e-01  1.207012e-16  8.644409e-18  3.411475e-17
## 41  2.069701e-01  2.689651e-01  1.832817e-17 -8.953167e-17 -3.429012e-17
## 42  1.846651e-01  2.363593e-01  2.051187e-17 -1.046271e-16 -3.039798e-17
## 43  1.603099e-01  2.009605e-01 -3.079701e-17  1.334466e-16  2.659859e-16
## 44  1.359548e-01  1.655617e-01 -5.721738e-17  2.164734e-16  2.671727e-17
## 45  1.115996e-01  1.301629e-01 -2.428400e-16  1.961839e-16  1.163002e-16
## 46  8.724448e-02  9.476406e-02  3.486614e-18  2.449501e-16  1.531190e-16
## 47  6.288933e-02  5.936526e-02 -1.400425e-16  2.729820e-16  1.615390e-16
## 48  3.853418e-02  2.396646e-02  2.904625e-17 -6.711027e-17 -1.454698e-16
## 49  3.989864e-17  0.000000e+00 -6.043526e-16 -2.727196e-16 -1.613949e-16
##              UTX            VZ           WMT           XOM             T
## 1  -7.049095e-17  6.734542e-01  2.509023e-18  7.650450e-02  3.066067e-18
## 2  -3.965611e-17  5.629189e-01 -4.258935e-18  1.814543e-01  2.286827e-17
## 3  -1.365759e-17  4.590255e-01  1.062859e-02  2.507802e-01 -8.029829e-18
## 4   7.785156e-18  3.559124e-01  7.039491e-02  3.019005e-01 -2.612188e-19
## 5   1.985463e-17  2.491180e-01  1.127597e-01  3.220874e-01  9.716212e-03
## 6  -2.070807e-18  1.548682e-01  1.335944e-01  2.822761e-01  2.845598e-02
## 7  -1.619308e-17  6.667664e-02  1.400805e-01  2.547516e-01  4.062279e-02
## 8  -2.372719e-17  5.684937e-02  1.271161e-01  2.525890e-01  3.923531e-02
## 9  -3.104579e-17  4.981912e-02  1.143219e-01  2.528171e-01  3.853303e-02
## 10 -3.887698e-17  4.263940e-02  1.016478e-01  2.538806e-01  3.807892e-02
## 11 -4.806821e-17  3.337666e-02  9.037539e-02  2.557417e-01  3.889004e-02
## 12 -5.725943e-17  2.411391e-02  7.910303e-02  2.576028e-01  3.970116e-02
## 13 -6.663949e-17  1.490326e-02  6.774791e-02  2.576690e-01  4.042938e-02
## 14 -7.667986e-17  4.889669e-03  5.508146e-02  2.512686e-01  4.072637e-02
## 15 -8.693730e-17  0.000000e+00  4.030010e-02  2.421311e-01  3.667420e-02
## 16 -9.727575e-17  9.502546e-19  2.456291e-02  2.320269e-01  2.906776e-02
## 17  6.009683e-18 -4.846783e-17  8.815220e-03  2.219223e-01  2.143569e-02
## 18 -7.582784e-19 -4.428342e-17 -1.369616e-18  2.112384e-01  1.272050e-02
## 19 -7.597545e-19 -3.894723e-17  2.500848e-18  1.995169e-01  2.320883e-03
## 20 -2.364548e-18 -3.465763e-17 -7.087999e-18  1.843136e-01  0.000000e+00
## 21 -3.381906e-18 -3.178440e-17 -6.072710e-18  1.671842e-01 -2.423104e-18
## 22 -5.056053e-18 -2.852162e-17 -8.450762e-18  1.486169e-01 -3.746374e-18
## 23 -9.240374e-18 -2.215145e-17 -1.065953e-17  1.261027e-01 -4.871683e-18
## 24 -1.342469e-17 -1.578128e-17 -1.286830e-17  1.035886e-01 -5.996993e-18
## 25 -1.760901e-17 -9.411103e-18 -1.854652e-17  8.107444e-02 -7.122302e-18
## 26 -2.221013e-17 -2.434493e-18  1.047724e-17  5.664762e-02  9.291608e-18
## 27 -2.692987e-17  4.714718e-18  1.148100e-17  3.167642e-02  1.134897e-17
## 28  4.062673e-18  1.186393e-17  1.862392e-17  6.705223e-03  1.984175e-17
## 29 -1.330920e-18  1.690096e-17 -1.015632e-17 -3.412579e-18  1.637161e-17
## 30 -4.907640e-18  2.086120e-17  1.216635e-17  2.692665e-18  1.777077e-17
## 31 -5.520967e-18  2.482145e-17 -2.102214e-17 -8.935259e-18  3.304772e-17
## 32 -4.949340e-18  2.878170e-17 -2.645505e-17 -1.076615e-17  2.056909e-17
## 33 -9.003699e-18  3.274194e-17  3.595732e-17 -2.877185e-17  2.261945e-17
## 34  8.996838e-18  3.651662e-17  4.030141e-17  8.884083e-18  2.634263e-17
## 35  1.329440e-17  5.050846e-17  4.361276e-17 -6.309961e-17  3.209967e-17
## 36  3.612317e-17  7.807685e-17  1.207889e-16 -5.267598e-17  1.191574e-16
## 37  6.047305e-17  9.827048e-17  5.154225e-17 -3.841259e-17  1.217302e-16
## 38  8.548303e-17  1.170365e-16  3.785129e-17 -2.485335e-17  1.247045e-16
## 39  1.076532e-16  1.463120e-16  1.828664e-17 -2.030357e-17  1.255982e-16
## 40  1.298233e-16  1.755875e-16  5.423314e-17 -1.575380e-17  1.264920e-16
## 41  1.245830e-16  2.048630e-16 -3.031845e-16 -1.302454e-16  1.216707e-16
## 42  1.480732e-16  2.162662e-16 -3.225864e-16 -1.207357e-16  9.161674e-17
## 43  2.017674e-16  2.259591e-16 -3.414846e-16  3.472903e-16  8.849296e-17
## 44  2.676186e-16  2.356519e-16 -6.178871e-17 -2.149254e-17  5.493247e-16
## 45  2.490413e-16  2.453447e-16 -6.820954e-17 -6.026634e-17  6.062855e-16
## 46  2.926800e-17  2.411598e-16 -7.141681e-17  6.925087e-17  7.988733e-17
## 47 -5.946124e-16  2.647304e-16 -7.949297e-17  7.200889e-17  7.884046e-17
## 48 -8.064303e-16  1.677073e-16 -4.175122e-18  7.839001e-17 -2.473557e-16
## 49 -8.796692e-16  1.887804e-16  0.000000e+00  7.324101e-17 -2.711987e-16

# Create weights_minvar as the portfolio with the least risk
weights_minvar <- mweights[vpsd == min(vpsd), ]
weights_minvar
##             AA        AAPL          AXP            BA           BAC
## 8 1.165272e-17 0.009354387 2.972429e-17 -6.739938e-19 -8.444373e-18
##            CAT        CVX            DD        DIS            GE
## 8 1.354469e-17 0.03750144 -1.393143e-17 0.00732791 -1.974086e-17
##           HD           HPQ         INTC        IBM        JNJ          JPM
## 8 0.01645389 -4.315389e-18 0.0001079063 0.04911507 0.05066905 1.037766e-18
##           KO        MCD        MMM         MRK         MSFT NKE        PFE
## 8 0.02746359 0.01034804 0.08448407 0.008298201 5.540859e-19   0 0.01080263
##          PG        TRV           UTX         VZ       WMT      XOM
## 8 0.1810028 0.03128128 -2.372719e-17 0.05684937 0.1271161 0.252589
##            T
## 8 0.03923531

# Calculate the Sharpe ratio
vsr <- (vpm - 0.0075) / vpsd
vsr
##  [1] 0.008206113 0.015753602 0.025112783 0.036205642 0.048379139
##  [6] 0.060676074 0.071414417 0.081236271 0.090815609 0.100113417
## [11] 0.109073348 0.117650995 0.125800868 0.133476015 0.140610793
## [16] 0.147168443 0.153145515 0.158545819 0.163323461 0.167485038
## [21] 0.171044636 0.174047567 0.176532020 0.178548817 0.180155778
## [26] 0.181404469 0.182339507 0.183006964 0.183409367 0.183491992
## [31] 0.183305751 0.182901097 0.182321608 0.181602871 0.180688311
## [36] 0.178772618 0.175819402 0.172091020 0.167821029 0.163216567
## [41] 0.158484178 0.153640354 0.148677563 0.143756612 0.138983454
## [46] 0.134421972 0.130106253 0.126050142 0.122247054

# Create weights_max_sr as the portfolio with the maximum Sharpe ratio
weights_max_sr <- mweights[vsr == max(vsr), ]
weights_max_sr
##              AA      AAPL           AXP            BA           BAC
## 30 1.360665e-16 0.1668757 -6.629107e-17 -3.594232e-19 -3.112615e-17
##              CAT          CVX            DD           DIS           GE
## 30 -1.146113e-18 7.654956e-17 -4.558315e-17 -1.555043e-17 1.153523e-16
##           HD          HPQ       INTC          IBM        JNJ        JPM
## 30 0.2122036 7.832401e-17 0.03132751 4.913502e-17 0.05235103 0.04532427
##              KO        MCD           MMM           MRK     MSFT       NKE
## 30 1.478749e-18 0.04424313 -2.162749e-17 -1.754495e-17 0.140666 0.2142174
##    PFE         PG          TRV          UTX          VZ          WMT
## 30   0 0.09279142 2.548881e-18 -4.90764e-18 2.08612e-17 1.216635e-17
##             XOM            T
## 30 2.692665e-18 1.777077e-17

# Create barplot of weights_minvar and weights_max_sr
par(mfrow = c(2, 1), mar = c(3, 2, 2, 1))
barplot(weights_minvar[weights_minvar > 0.01], xlab = names(weights_minvar[weights_minvar > 0.01]))
barplot(weights_max_sr[weights_max_sr > 0.01])

4.9 Split-sample evaluation

4.10 Out of sample performance evaluation