library("tseries")
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library("quantmod")
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: TTR
library("quantmod")
library("PortfolioAnalytics")
## Loading required package: foreach
## Loading required package: PerformanceAnalytics
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
library("DEoptim")
## Loading required package: parallel
## 
## DEoptim package
## Differential Evolution algorithm in R
## Authors: D. Ardia, K. Mullen, B. Peterson and J. Ulrich
library("xts")
# Reading of Data
data <- read.csv("gaurav_ranjan.csv", header = T)
data <- xts(data[ ,2:5], order.by = as.Date.factor(data[,1]))  
View(data)
# Indian Stocks from Bse Index
indian_stocks <- data[,1]
m_indian_stocks <- monthlyReturn(indian_stocks, type = "arithmetic")
colnames(indian_stocks) <- "m_indian_stocks"
table.AnnualizedReturns(m_indian_stocks)
##                           monthly.returns
## Annualized Return                  0.1140
## Annualized Std Dev                 0.1732
## Annualized Sharpe (Rf=0%)          0.6584
charts.PerformanceSummary(m_indian_stocks)

# Indian Bonds

indian_bonds <- data[,2]
m_indian_bonds <- monthlyReturn(indian_bonds)
colnames(indian_bonds) <- "m_indian_bonds"
table.AnnualizedReturns(m_indian_bonds)
##                           monthly.returns
## Annualized Return                  0.0742
## Annualized Std Dev                 0.0018
## Annualized Sharpe (Rf=0%)         40.9594
charts.PerformanceSummary(m_indian_bonds)

# International stocks

international_stock <- data[,3]
m_international_stock <- monthlyReturn(international_stock)
colnames(international_stock) <- "m_international_stock"
table.AnnualizedReturns(m_international_stock)
##                           monthly.returns
## Annualized Return                  0.1415
## Annualized Std Dev                 0.1372
## Annualized Sharpe (Rf=0%)          1.0309
charts.PerformanceSummary(m_international_stock)

# International Bonds
international_bonds <- data[,4]
m_international_bond <- monthlyReturn(international_bonds)
colnames(international_bonds) <- "m_international_bond"
table.AnnualizedReturns(m_international_bond)
##                           monthly.returns
## Annualized Return                  0.0468
## Annualized Std Dev                 0.0519
## Annualized Sharpe (Rf=0%)          0.9009
charts.PerformanceSummary(m_international_bond)

# Bonds Compare
bondscomp <- cbind(m_indian_bonds,m_international_bond)
table.AnnualizedReturns(bondscomp)
##                           monthly.returns monthly.returns.1
## Annualized Return                  0.0742            0.0468
## Annualized Std Dev                 0.0018            0.0519
## Annualized Sharpe (Rf=0%)         40.9594            0.9009
charts.PerformanceSummary(bondscomp)

# stocks Compare

stockcomp <- cbind(m_indian_stocks,m_international_stock)
table.AnnualizedReturns(stockcomp)
##                           monthly.returns monthly.returns.1
## Annualized Return                  0.1140            0.1415
## Annualized Std Dev                 0.1732            0.1372
## Annualized Sharpe (Rf=0%)          0.6584            1.0309
charts.PerformanceSummary(stockcomp)

# 4. Portfolio Optimization

# 4.2. Portfolio Benchmarks 

# 4.2.1. Portfolio Assets Returns Matrix
mport <- cbind(m_indian_stocks,m_international_stock,m_indian_bonds, m_international_stock)

# 4.2.2. Naive Global Portfolio (Monthly Rebalancing)
mnaivew <- as.numeric(t(c(0.25,0.25,0.25,0.25)))
names(mnaivew) <- c("m_indian_stocks","m_international_stock","m_indian_bonds","m_international_stock")
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("m_indian_stocks","m_international_stock","m_indian_bonds","m_international_stock")
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("m_indian_stocks","m_international_stock","m_indian_bonds","m_international_stock")
mbogle <- Return.portfolio(R=mport,weights=mboglew,geometric=F,rebalance_on="months")
colnames(mbogle) <- "mbogle"

# 4.2.6. Benchmark Portfolios Returns Comparison
benchcomp <- cbind(mnaive,mroche,mbogle)
table.AnnualizedReturns(benchcomp)
##                           mnaive mroche mbogle
## Annualized Return         0.1214 0.1164 0.1335
## Annualized Std Dev        0.0993 0.0889 0.1336
## Annualized Sharpe (Rf=0%) 1.2232 1.3092 0.9990
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["::2021-12-31"],portfolio=mport1c,optimize_method="DEoptim",search_size=20000,trace=T )
## Iteration: 1 bestvalit: -0.012359 bestmemit:    0.008000    0.124000    0.004000    0.870000
## Iteration: 2 bestvalit: -0.012409 bestmemit:    0.008000    0.196000    0.000000    0.804000
## Iteration: 3 bestvalit: -0.012409 bestmemit:    0.008000    0.196000    0.000000    0.804000
## Iteration: 4 bestvalit: -0.012409 bestmemit:    0.008000    0.196000    0.000000    0.804000
## Iteration: 5 bestvalit: -0.012409 bestmemit:    0.008000    0.196000    0.000000    0.804000
## Iteration: 6 bestvalit: -0.012409 bestmemit:    0.008000    0.196000    0.000000    0.804000
## Iteration: 7 bestvalit: -0.012409 bestmemit:    0.008000    0.196000    0.000000    0.804000
## Iteration: 8 bestvalit: -0.012409 bestmemit:    0.008000    0.196000    0.000000    0.804000
## Iteration: 9 bestvalit: -0.012409 bestmemit:    0.008000    0.196000    0.000000    0.804000
## [1] 0.008 0.196 0.000 0.804
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["::2021-12-31"],portfolio=mport2c,optimize_method="DEoptim",search_size=20000,trace=T)
## Iteration: 1 bestvalit: 0.004744 bestmemit:    0.032000    0.090000    0.882000    0.002000
## Iteration: 2 bestvalit: 0.003198 bestmemit:    0.060000    0.002000    0.940000    0.004000
## Iteration: 3 bestvalit: 0.002659 bestmemit:    0.046000    0.012000    0.938000    0.000000
## Iteration: 4 bestvalit: 0.002659 bestmemit:    0.046000    0.012000    0.938000    0.000000
## Iteration: 5 bestvalit: 0.002637 bestmemit:    0.030000    0.024000    0.928000    0.012000
## Iteration: 6 bestvalit: 0.002637 bestmemit:    0.030000    0.024000    0.928000    0.012000
## Iteration: 7 bestvalit: 0.002637 bestmemit:    0.030000    0.024000    0.928000    0.012000
## Iteration: 8 bestvalit: 0.002063 bestmemit:    0.018000    0.002000    0.943099    0.032000
## Iteration: 9 bestvalit: 0.002063 bestmemit:    0.018000    0.002000    0.943099    0.032000
## Iteration: 10 bestvalit: 0.001340 bestmemit:    0.004000    0.006000    0.958000    0.022000
## Iteration: 11 bestvalit: 0.001340 bestmemit:    0.004000    0.006000    0.958000    0.022000
## Iteration: 12 bestvalit: 0.001340 bestmemit:    0.004000    0.006000    0.958000    0.022000
## Iteration: 13 bestvalit: 0.001340 bestmemit:    0.004000    0.006000    0.958000    0.022000
## Iteration: 14 bestvalit: 0.001340 bestmemit:    0.004000    0.006000    0.958000    0.022000
## Iteration: 15 bestvalit: 0.001302 bestmemit:    0.000000    0.016000    0.968000    0.014000
## Iteration: 16 bestvalit: 0.001302 bestmemit:    0.000000    0.016000    0.968000    0.014000
## Iteration: 17 bestvalit: 0.001252 bestmemit:    0.001609    0.008982    0.967365    0.018453
## Iteration: 18 bestvalit: 0.001252 bestmemit:    0.001609    0.008982    0.967365    0.018453
## Iteration: 19 bestvalit: 0.001252 bestmemit:    0.001609    0.008982    0.967365    0.018453
## Iteration: 20 bestvalit: 0.001252 bestmemit:    0.001609    0.008982    0.967365    0.018453
## Iteration: 21 bestvalit: 0.001252 bestmemit:    0.001609    0.008982    0.967365    0.018453
## Iteration: 22 bestvalit: 0.001252 bestmemit:    0.001609    0.008982    0.967365    0.018453
## Iteration: 23 bestvalit: 0.000832 bestmemit:    0.008000    0.000000    0.992000    0.008000
## Iteration: 24 bestvalit: 0.000702 bestmemit:    0.002000    0.010000    0.986000    0.000000
## Iteration: 25 bestvalit: 0.000702 bestmemit:    0.002000    0.010000    0.986000    0.000000
## Iteration: 26 bestvalit: 0.000702 bestmemit:    0.002000    0.010000    0.986000    0.000000
## Iteration: 27 bestvalit: 0.000702 bestmemit:    0.002000    0.010000    0.986000    0.000000
## Iteration: 28 bestvalit: 0.000702 bestmemit:    0.002000    0.010000    0.986000    0.000000
## Iteration: 29 bestvalit: 0.000702 bestmemit:    0.002000    0.010000    0.986000    0.000000
## Iteration: 30 bestvalit: 0.000702 bestmemit:    0.002000    0.010000    0.986000    0.000000
## Iteration: 31 bestvalit: 0.000702 bestmemit:    0.002000    0.010000    0.986000    0.000000
## [1] 0.002 0.010 0.986 0.000
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["::2021-12-31"],portfolio=mport3c,optimize_method="DEoptim",search_size=20000,trace=T)
## Iteration: 1 bestvalit: -0.001187 bestmemit:    0.036000    0.094000    0.858000    0.020000
## Iteration: 2 bestvalit: -0.002744 bestmemit:    0.040000    0.052000    0.902000    0.004000
## Iteration: 3 bestvalit: -0.005069 bestmemit:    0.002000    0.006000    0.978000    0.016000
## Iteration: 4 bestvalit: -0.005069 bestmemit:    0.002000    0.006000    0.978000    0.016000
## Iteration: 5 bestvalit: -0.005069 bestmemit:    0.002000    0.006000    0.978000    0.016000
## Iteration: 6 bestvalit: -0.005069 bestmemit:    0.002000    0.006000    0.978000    0.016000
## Iteration: 7 bestvalit: -0.005069 bestmemit:    0.002000    0.006000    0.978000    0.016000
## Iteration: 8 bestvalit: -0.005069 bestmemit:    0.002000    0.006000    0.978000    0.016000
## Iteration: 9 bestvalit: -0.005069 bestmemit:    0.002000    0.006000    0.978000    0.016000
## Iteration: 10 bestvalit: -0.005069 bestmemit:    0.002000    0.006000    0.978000    0.016000
## [1] 0.002 0.006 0.978 0.016
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["::2021-12-31"],portfolio=mport4c,optimize_method="DEoptim",search_size=20000,trace=T)
## Iteration: 1 bestvalit: -0.003054 bestmemit:    0.000000    0.020000    0.902000    0.068000
## Iteration: 2 bestvalit: -0.005336 bestmemit:    0.018000    0.022000    0.946000    0.016000
## VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.00141582387969031
## Warning in FUN(newX[, i], ...): NA or NaN produced in objective function for
## weights 000.9740.022
## Iteration: 3 bestvalit: -0.005336 bestmemit:    0.018000    0.022000    0.946000    0.016000
## Iteration: 4 bestvalit: -0.005336 bestmemit:    0.018000    0.022000    0.946000    0.016000
## Iteration: 5 bestvalit: -0.006185 bestmemit:    0.028000    0.010000    0.970000    0.000000
## Iteration: 6 bestvalit: -0.006185 bestmemit:    0.028000    0.010000    0.970000    0.000000
## Iteration: 7 bestvalit: -0.006185 bestmemit:    0.028000    0.010000    0.970000    0.000000
## VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.00138609667351221
## Warning in FUN(newX[, i], ...): NA or NaN produced in objective function for
## weights 0.00600.9840.02
## VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.00123732952133511
## Warning in FUN(newX[, i], ...): NA or NaN produced in objective function for
## weights 0.0080.0240.9780
## Iteration: 8 bestvalit: -0.006185 bestmemit:    0.028000    0.010000    0.970000    0.000000
## Iteration: 9 bestvalit: -0.006185 bestmemit:    0.028000    0.010000    0.970000    0.000000
## Iteration: 10 bestvalit: -0.006185 bestmemit:    0.028000    0.010000    0.970000    0.000000
## Iteration: 11 bestvalit: -0.006185 bestmemit:    0.028000    0.010000    0.970000    0.000000
## Iteration: 12 bestvalit: -0.006185 bestmemit:    0.028000    0.010000    0.970000    0.000000
## [1] 0.028 0.010 0.970 0.000
chart.Weights(mportopt4)

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.