You are on page 1of 3

library(data.

table)
library(readxl)
library(PerformanceAnalytics)
library(PortfolioAnalytics)
library(ROI)
library(foreach)
library(DEoptim)
library(iterators)
library(fGarch)
library(Rglpk)
library(quadprog)
library(ROI.plugin.glpk)
library(ROI.plugin.quadprog)
library(ROI.plugin.symphony)
library(pso)
library(GenSA)
library(corpcor)
library(testthat)
library(nloptr)
library(MASS)
library(robustbase)
library(ggplot2)

setwd("~/R")

#BRING IN DATA

returns.data <- read_excel("C:/Users/admin/Desktop/Portfolio.xlsx", sheet =


"portfolio")

str(returns.data)
returns.data <- data.frame(returns.data)
str(returns.data)
row.names(returns.data) <- (returns.data$Date)
str(row.names(returns.data))
returns.data$Date <- NULL
str(returns.data)
returns.data
meanReturns <- colMeans(returns.data)
str(meanReturns)
meanReturns

#GENERATE COVARIANCE AND CORRELATION TABLES

cov.pop <- function(x,y=NULL) {


cov(x,y)*(NROW(x)-1)/NROW(x)
}

str(cov.pop)
covMat <- cov.pop(returns.data)
str(covMat)
covMat
corMat <- cor(returns.data)
corMat

#SPECIFY PORTFOLIO OBJECT


port <- portfolio.spec(assets = colnames(returns.data))
port
str(port)

#CONSTRAINTS

port <- add.constraint(port,type="weight_sum",min=0.99, max=1.001)


str(port)
port

#rportfolios <- random_portfolios(port, permutations = 5000, rp_method = "sample",


eliminate = TRUE)
//str(rportfolios)
//rportfolios

#OPTIMIZATION SETUP

minreturnLimit <- min(colMeans(returns.data))


maxreturnLimit <- max(colMeans(returns.data))

minret <- minreturnLimit


maxret <- maxreturnLimit

vec <- seq(minret, maxret, length.out = 100)


str(vec)
vec

eff.frontier <- data.frame(Risk =vector("numeric", length(vec)) ,


Return = vector("numeric", length(vec)))

frontier.weights <- mat.or.vec(nr = length(vec), nc = ncol(returns.data))


colnames(frontier.weights) <- colnames(returns.data)

//eff.frontier <- data.frame(Risk = rep(, length(vec)), Return = rep(NA,


length(vec)))

str(eff.frontier)
eff.frontier

//frontier.weights <- mat.or.vec(nr = length(vec), nc = ncol(returns.data))


//
//colnames(frontier.weights) <- colnames(returns.data)

#GENERATE EFFICIENT FRONTIER


#In add.constraint...the type is return, as in, it is targeting a specific return
specified by vec
#Subsequently, it looks for the portfolio that minimizes StdDev for that return
constraint...this is the objective

for(i in 1:length(vec)){
eff.port <- add.constraint(port, type = "return", name = "mean", return_target =
vec[i])
eff.port <- add.objective(eff.port, type = "risk", name = "var")
# eff.port <- add.objective(eff.port, type = "weight_concentration", name =
"HHI",
# conc_aversion = 0.001)

eff.port <- optimize.portfolio(returns.data, eff.port, optimize_method = "ROI")

eff.frontier$Risk[i] <- sqrt(t(eff.port$weights) %*% covMat %*% eff.port$weights)

eff.frontier$Return[i] <- eff.port$weights %*% meanReturns

eff.frontier$Sharperatio[i] <- eff.port$Return[i] / eff.port$Risk[i]

frontier.weights[i,] = eff.port$weights

print(paste(round(i/length(vec) * 100, 0), "% done..."))


}

#PLOT EFFICIENT FRONTIER

ggplot(eff.frontier, aes(x=eff.frontier$Risk, y=eff.frontier$Return)) +


geom_point(shape = 18, color = "limegreen", size = 2) + ggtitle("Portfolio
Optimization") + labs(x="Risk",y="Return")

eff.frontier$Sharpe <- eff.frontier$Return / eff.frontier$Risk

You might also like