Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #install.packages(c("readxl", "quadprog"))
- source("portfolio.R")
- library("quadprog")
- library("readxl")
- library(PerformanceAnalytics)
- #Calcula o retorno simples de 1 ativo
- getRts <- function(aux.quotes){
- idx <- 2:length(aux.quotes)
- return((aux.quotes[idx] - aux.quotes[idx-1])/ aux.quotes[idx-1])
- }
- #Calcula o retorno continuamente composto de 1 ativo
- getRtcc <- function(aux.quotes){
- return(log(1 + getRts(aux.quotes)))
- }
- close.df <- as.data.frame(read_xlsx("close.xlsx", col_names = TRUE))
- row_names <- close.df[,1]
- close.df <- close.df[,2:ncol(close.df)]
- rownames(close.df) <- as.Date(row_names, origin = "1970-01-01")
- weights.vec = c(0.19434, 0.13030, 0.09964, 0.06222, 0.03914, 0.02704,
- 0.02509, 0.02502, 0.01907, 0.01783, 0.00960, 0.00914)
- risk.free <- 0
- ret.df <- apply(close.df, 2, getRtcc)
- mu.vec <- apply(ret.df, 2, mean)
- sig.vec <- apply(ret.df, 2, sd)
- sigma.mat <- cov(ret.df)
- num_rows <- nrow(ret.df)
- num_cols <- ncol(ret.df)
- one.vec <- rep(1, num_cols)
- zero.vec <- rep(0, num_cols)
- getPortRet <- function(){
- ret <- rep(0, num_rows)
- for(i in 1:num_cols){
- ret <- ret + weights.vec[i]*ret.df[,i]
- }
- return(ret)
- }
- portfolio <- getPortfolio(er = mu.vec, cov.mat = sigma.mat, weights = weights.vec)
- gmvp.portfolio <- globalMin.portfolio(er = mu.vec, cov.mat = sigma.mat)
- gmvp.portfolio
- tan.portfolio <- tangency.portfolio(er = mu.vec, cov.mat = sigma.mat, risk.free = risk.free, shorts = TRUE)
- tan.portfolio
- ################# QUESTAO 1 #################
- ## Traçando a fronteira da bala de Markowitz com posições curtas permitidas ##
- ef.frontier.s <- efficient.frontier(er = mu.vec, cov.mat = sigma.mat,
- nport = 100, alpha.min = -2, alpha.max = 3,
- shorts = TRUE)
- plot(ef.frontier.s, col = "blue")
- ################# QUESTAO 2 #################
- ## Traçando a fronteira da bala de Markowitz com posições curtas não permitidas ##
- ef.frontier.ns <- efficient.frontier(er = mu.vec, cov.mat = sigma.mat,
- nport = 100, alpha.min = -2, alpha.max = 3,
- shorts = FALSE)
- points(ef.frontier.ns$sd, ef.frontier.ns$er, col = "red")
- ################# QUESTAO 3 #################
- ## Determinando pesos do GMVP com posições curtas não permitidas ##
- A <- cbind(one.vec, diag(num_cols), -diag(num_cols))
- b <- c(1, zero.vec, -0.5*one.vec)
- gmvp.ns.mw <- solve.QP(Dmat = 2*sigma.mat, dvec = zero.vec,
- Amat = A, bvec = b, meq = 1)
- gmvp.ns.mw$solution
- points(sqrt(gmvp.ns.mw$value), t(gmvp.ns.mw$solution)%*%mu.vec,
- pch=16, col='orange', cex=2)
- ################# QUESTAO 4 #################
- ## Determinando pesos das ações no TP com posições curtas não permitidas ##
- tan.port.ns <- tangency.portfolio(er = mu.vec, cov.mat = sigma.mat,
- risk.free = risk.free, shorts = FALSE)
- tan.port.ns
- points(tan.port.ns$sd, tan.port.ns$er, col = "black", pch = 16, cex = 2)
- ################# QUESTAO 5 #################
- ## Determinando reta dos investimentos eficientes posições curtas não permitidas ##
- abline(a = risk.free, b = (tan.port.ns$er - risk.free)/tan.port.ns$sd, col = 'pink', lwd = 3)
- ################# QUESTAO 6 #################
- ## Determinando posição no grafico do port. do E2M ##
- points(portfolio$sd, portfolio$er, col="green", pch=16, cex=2)
- ################# QUESTAO 7 #################
- ## Obtendo os pesos das ações no portfolio no portfolio eficiente ##
- x = portfolio$sd
- y = (((tan.port.ns$er - risk.free)/tan.port.ns$sd) * x) + risk.free
- points(x, y, col = 'yellow', pch = 16, cex = 2)
- ################# QUESTAO 8 #################
- ## Obtendo os gráficos do retorno acumulado/drawdown ##
- charts.PerformanceSummary(getPortRet(), Rf = 0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement