# 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
# case of four assets
N = 4
weights <- rep(1/N,N)
# 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)
# 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)
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.
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.
# 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, ]
# 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)
# 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)
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
# 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
# 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
# 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
Annualized volatility on rolling window of 6 months.
# 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)
# 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)
Distribution C.
# 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
# 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
# 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)
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))
# 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
The answer is: Increases.
# 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)
# 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
# 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
# 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
# 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)
# 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
# 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
The answer is: The portfolio with the greatest excess return per unit of portfolio volatility is the tangency portfolio.
The answer is: The observed average return of any risky portfolio is always higher than the risk-free rate.
# 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])