################################################
# The purpose of this test is to optimize a #
# Global minimum variance portfolio through #
# portfolio analytics using custom location #
# and scatter estimates #
# The portfolio is long only with a uniform #
# reasonable box. #
################################################
# Loading packages
suppressMessages(require(PortfolioAnalytics))
# Loading optimization packages
suppressMessages(require(ROI))
suppressMessages(require(ROI.plugin.glpk))
suppressMessages(require(ROI.plugin.quadprog))
##################
## Loading test ##
##################
suppressMessages(library(CMEtest))
options(width=60, warn = -1)
##################
## Loading data ##
##################
# Loading data
data(sp500.subset)
returns <- sp500.subset[1:50,1:10]
assets <- colnames(returns)
## Specifying portfolio
port_gmv <- portfolio.spec(assets = assets)
## specifying long only constraing
long_const = 0
## specifying unform upper box constraints
upper_box <- 0.60
## Setting constraints
port_gmv <- add.constraint(portfolio = port_gmv,
type="full_investment",
enabled=TRUE)
port_gmv <- add.constraint(portfolio = port_gmv,
type = "box",
min = long_const,
max = upper_box)
## Adding objective function
port_gmv <- add.objective(portfolio = port_gmv,
type = "risk",
name = "var")
## Showing portfolio specification
print(port_gmv)
## Showing portfolio specification
print(port_gmv)
## Specifying sample cov
mleCovSpec <- CMEspec(smooth = 'None',
estim = 'mle',
shrink = 'None',
filter = 'None')
## Showing summary
summary(mleCovSpec)
robCovSpec <- CMEspec(smooth = 'None',
estim = 'mcd',
shrink = 'None',
filter = 'None')
## Showing summary
summary(robCovSpec)
## Generating Moment functions. These functions will dynamically compute
## location and scatter when passed to optimize.portfolio.
MleMomentFUN <- MakeMomentFUN(mleCovSpec, type = "regular")
RobMomentFUN <- MakeMomentFUN(robCovSpec, type = "regular")
###################################
## Let's Optimize the potfolios! ##
###################################
## mle version
opt_gmv_mle <- optimize.portfolio(R = returns,
portfolio = port_gmv,
optimize_method = "ROI",
momentFUN = "MleMomentFUN",
trace = TRUE)
## Robust version
opt_gmv_rob <- optimize.portfolio(R = returns,
portfolio = port_gmv,
optimize_method = "ROI",
momentFUN = "RobMomentFUN",
trace = TRUE)
## Extracting weigths
## MLE
print(extractWeights(opt_gmv_mle))
## Robust
print(extractWeights(opt_gmv_rob))
## Let us compute the covariances by estimating the specification object
mleCovEst <- Estimate(mleCovSpec, returns)
class(mleCovEst)
robCovEst <- Estimate(robCovSpec, returns)
class(robCovEst)
## Now we create Precomputed moment functions
MlePrecompMomentFUN <- MakeMomentFUN(mleCovEst, type = "regular")
RobPrecompMomentFUN <- MakeMomentFUN(robCovEst, type = "regular")
# mle version
opt_gmv_mle <- optimize.portfolio(R = returns,
portfolio = port_gmv,
optimize_method = "ROI",
momentFUN = "MlePrecompMomentFUN",
trace = TRUE)
## Robust version
opt_gmv_rob <- optimize.portfolio(R = returns,
portfolio = port_gmv,
optimize_method = "ROI",
momentFUN = "RobPrecompMomentFUN",
trace = TRUE)
# #Extracting the weigths
print(extractWeights(opt_gmv_mle))
print(extractWeights(opt_gmv_rob))
# Specifying RMT filtering
filteredCorSpec <- CMEspec(estim = "mle",
estimCtrl = list(corr = TRUE),
filter = "MP",
filterCtrl = list(fit.type = "MDE",
norm.meth = "partial",
exclude.market = FALSE))
## Specifying filtered moment function
filteredMleMomentFUN <- MakeMomentFUN(filteredCorSpec, type = "filtered")
## Estimating filtered correlation
filteredCorEst <- Estimate(filteredCorSpec, sp500.subset)
## let us get the filtered correlation matrix
print(head(GetCor(filteredCorEst, "filtered")))
## let us get the non noisy eigenvalues and eigenvectors
print(filteredCorEst$.filterEstim$signalEigVals)
print(head(filteredCorEst$.filterEstim$signalEigVecs))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.