library(“tseries”) library(“PortfolioAnalytics”) library(“quantmod”) library(“Quandl”) library(“DEoptim”)

#data reading print(getwd()) data = read.csv(“Investment-Portfolio-Analysis-Data.txt”, header=T) View(data) data = xts(data[,2:30], order.by = as.Date(data[,1]))

##1. asset classes ##1.1 Cash and Cash equivalents #US total money market #getSymbols(“SHV”, src=“yahoo”, from=“2007-01-01”, to=“2022-01-01”) #cash = SHV[,6]

cash = data[,1] mcash = monthlyReturn(cash, type=‘arithmetic’) View(mcash) colnames(mcash) = “mcash” table.AnnualizedReturns(mcash) charts.PerformanceSummary(mcash)

Assets Pricing Models Data

CPI <- Quandl(“FRED/CPIAUCSL”, type=“xts”, start_date=“2007-01-01”, end_date=“2017-01-01”)

cpi <- CPI

cpi <- data[,24] mcpi <- monthlyReturn(cpi) colnames(mcpi) <- “mcpi” mmom <- data[,19]/100 msprem <- data[,20]/100 msize <- data[,21]/100 mstyle <- data[,22]/100 mrisk <- data[,23]/100 mlsprem <- mlstocks-mrisk

Capital Asset Pricing Model CAPM

CAPM Regression

mregc <- lm(mlsprem~msprem) summary(mregc)

CAPM Expected Returns

mcapm <- mean(mrisk)+mbcapm*(mean(msprem)) mcapm

CAPM Residual Variance (Unsystematic Risk)

mresvarc <- summary(mregc)$sigma mresvarc

Fama-French-Carhart Regression

mfactf <- cbind(msprem,msize,mstyle,mmom) mregf <- lm(mlsprem~mfactf) summary(mregf)

Fama-French-Carhart Beta Coefficients

msprembf <- summary(mregf)\(coefficients[2] msizeb <- summary(mregf)\)coefficients[3] mstyleb <- summary(mregf)\(coefficients[4] mmomb <- summary(mregf)\)coefficients[5] mbffc <- cbind(msprembf,msizeb,mstyleb,mmomb) mbffc

Fama-French-Carhart Alpha Intercept

maffc <- summary(mregf)$coefficients[1] maffc

Fama-French-Carhart Expected Returns

mffc <- mean(mrisk)+maffc+msprembfmean(msprem)+msizebmean(msize)+mstylebmean(mstyle)+mmombmean(mmom) mffc

#Arbitrage Pricing Theory Model APT

Arbitrage Pricing Theory Regression

mfacta <- cbind(msprem,mcpi) mrega <- lm(mlsprem~mfacta) summary(mrega)

Arbitrage Pricing Theory Coefficients

mspremba <- mrega\(coefficients[2] mcpib <- mrega\)coefficients[3] mbapt <- cbind(mspremba,mcpib) mbapt

#Arbitrage Pricing Theory Expected Returns mapt <- mean(mrisk)+maapt+msprembamean(msprem)+mcpibmean(mcpi) names(mapt) <- “mapt” mapt

Arbitrage Pricing Theory Residual Variance (Unsystematic Risk)

mresvara <- summary(mrega)$sigma mresvara

Expected Returns Third Comparison

retcomp3 <- cbind(mmean,mmed,mgmean,mcapm,mffc,mapt) retcomp3

Excess Returns Comparison

eretcomp <- cbind(macapm,maffc,maapt)

4. Portfolio Optimization

4.1. Portfolio Performance Metrics

4.1.1. Sharpe Ratio

msharpe <- SharpeRatio(mlstocks,Rf=mean(mcash)) msharpe

4.1.2. Treynor Ratio

mtreynor <- TreynorRatio(Ra=mlstocks,Rb=mstocks,Rf=mean(mcash)) mtreynor

4.2. Portfolio Benchmarks

4.2.1. Portfolio Assets Returns Matrix

mport <- cbind(mbonds,mstocks,mibonds,mistocks)

4.2.2. Naive Global Portfolio (Monthly Rebalancing)

mnaivew <- as.numeric(t(c(0.25,0.25,0.25,0.25))) names(mnaivew) <- c(“mbonds”,“mstocks”,“mibonds”,“mistocks”) mnaive <- Return.portfolio(R=mport,weights=mnaivew,geometric=F,rebalance_on=“months”) colnames(mnaive) <- “mnaive”

4.2.3. Roche Global Portfolio (Monthly Rebalancing)

mrochew <- as.numeric(t(c(0.24,0.18,0.33,0.25))) names(mrochew) <- c(“mbonds”,“mstocks”,“mibonds”,“mistocks”) mroche <- Return.portfolio(R=mport,weights=mrochew,geometric=F,rebalance_on=“months”) colnames(mroche) <- “mroche”

4.2.4. Bogle U.S. Portfolio (Monthly Rebalancing)

mboglew <- as.numeric(t(c(0.40,0.60,0.00,0.00))) names(mboglew) <- c(“mbonds”,“mstocks”,“mibonds”,“mistocks”) mbogle <- Return.portfolio(R=mport,weights=mboglew,geometric=F,rebalance_on=“months”) colnames(mbogle) <- “mbogle”

4.2.6. Benchmark Portfolios Returns Comparison

table.AnnualizedReturns(benchcomp) charts.PerformanceSummary(benchcomp)

4.3. Portfolio Optimization

4.3.1. Mean Maximization

Portfolio Specifications

mport1c <- portfolio.spec(assets = colnames(mport))

Portfolio Constraints

mport1c <- add.constraint(mport1c,type=“weight_sum”,min_sum=0.99,max_sum=1.01) mport1c <- add.constraint(mport1c,type=“long_only”)

Portfolio Objectives

mport1c <- add.objective(mport1c,type=“return”,name=“mean”)

Portfolio Optimization

mportopt1 <- optimize.portfolio(R=mport[“::2014-12-31”],portfolio=mport1c,optimize_method=“DEoptim”, ) chart.Weights(mportopt1)

4.3.2. Standard deviation minimization

Portfolio Specifications

mport2c <- portfolio.spec(assets=colnames(mport))

Portfolio Constraints

mport2c <- add.constraint(mport2c,type=“weight_sum”,min_sum=0.99,max_sum=1.01) mport2c <- add.constraint(mport2c,type=“long_only”)

Portfolio Objectives

mport2c <- add.objective(mport2c,type=“risk”,name=“StdDev”)

Portfolio Optimization

mportopt2 <- optimize.portfolio(R=mport[“::2014-12-31”],portfolio=mport2c,optimize_method=“DEoptim”,search_size=20000,trace=T) chart.Weights(mportopt2)

4.3.3. Mean Maximization and Standard Deviation Minimization Portfolio

Portfolio Specifications

mport3c <- portfolio.spec(assets=colnames(mport))

Portfolio Constraints

mport3c <- add.constraint(mport3c,type=“weight_sum”,min_sum=0.99,max_sum=1.01) mport3c <- add.constraint(mport3c,type=“long_only”)

Portfolio Objectives

mport3c <- add.objective(mport3c,type=“return”,name=“mean”) mport3c <- add.objective(mport3c,type=“risk”,name=“StdDev”)

Portfolio Optimization

mportopt3 <- optimize.portfolio(R=mport[“::2014-12-31”],portfolio=mport3c,optimize_method=“DEoptim”,search_size=20000,trace=T) chart.Weights(mportopt3) chart.EfficientFrontier(mportopt3,match.col=“StdDev”)

4.3.4. Mean Maximization Value at Risk (VaR) Minimization Portfolio

Portfolio Specifications

mport4c <- portfolio.spec(assets=colnames(mport))

Portfolio Constraints

mport4c <- add.constraint(mport4c,type=“weight_sum”,min_sum=0.99,max_sum=1.01) mport4c <- add.constraint(mport4c,type=“long_only”)

Portfolio Objectives

mport4c <- add.objective(mport4c,type=“return”,name=“mean”) mport4c <- add.objective(mport4c,type=“risk”,name=“VaR”,arguments=list(p = 0.99,method=“modified”))

Portfolio Optimization

mportopt4 <- optimize.portfolio(R=mport[“::2014-12-31”],portfolio=mport4c,optimize_method=“DEoptim”,search_size=20000,trace=T) chart.Weights(mportopt4)

4.3.5. Optimized Portfolios Backtesting Comparison

mportcomp = cbind(mnaive[“2015-01-31::”],mport1,mport2,mport3,mport4) table.AnnualizedReturns(mportcomp) charts.PerformanceSummary(mportcomp)