Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
1,478
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 3.86 KB | None | 0 0
  1. #install.packages(c("readxl", "quadprog"))
  2. source("portfolio.R")
  3. library("quadprog")
  4. library("readxl")
  5. library(PerformanceAnalytics)
  6.  
  7. #Calcula o retorno simples de 1 ativo
  8. getRts <- function(aux.quotes){
  9.   idx <- 2:length(aux.quotes)
  10.   return((aux.quotes[idx] - aux.quotes[idx-1])/ aux.quotes[idx-1])
  11. }
  12.  
  13. #Calcula o retorno continuamente composto de 1 ativo
  14. getRtcc <- function(aux.quotes){
  15.   return(log(1 + getRts(aux.quotes)))
  16. }
  17.  
  18. close.df <- as.data.frame(read_xlsx("close.xlsx", col_names = TRUE))
  19. row_names <- close.df[,1]
  20. close.df <- close.df[,2:ncol(close.df)]
  21. rownames(close.df) <- as.Date(row_names, origin = "1970-01-01")
  22. weights.vec = c(0.19434, 0.13030, 0.09964, 0.06222, 0.03914, 0.02704,
  23.                   0.02509, 0.02502, 0.01907, 0.01783, 0.00960, 0.00914)
  24. risk.free <- 0
  25.  
  26. ret.df <- apply(close.df, 2, getRtcc)
  27. mu.vec <- apply(ret.df, 2, mean)
  28. sig.vec <- apply(ret.df, 2, sd)
  29. sigma.mat <- cov(ret.df)
  30. num_rows <- nrow(ret.df)
  31. num_cols <- ncol(ret.df)
  32. one.vec <- rep(1, num_cols)
  33. zero.vec <- rep(0, num_cols)
  34.  
  35. getPortRet <- function(){
  36.  
  37.   ret <- rep(0, num_rows)
  38.  
  39.   for(i in 1:num_cols){
  40.     ret <- ret + weights.vec[i]*ret.df[,i]
  41.   }
  42.  
  43.  
  44.   return(ret)
  45. }
  46.  
  47. portfolio <- getPortfolio(er = mu.vec, cov.mat = sigma.mat, weights = weights.vec)
  48.  
  49. gmvp.portfolio <- globalMin.portfolio(er = mu.vec, cov.mat = sigma.mat)
  50. gmvp.portfolio
  51.  
  52. tan.portfolio <- tangency.portfolio(er = mu.vec, cov.mat = sigma.mat, risk.free = risk.free, shorts = TRUE)
  53. tan.portfolio
  54.  
  55. ################# QUESTAO 1 #################
  56. ## Traçando a fronteira da bala de Markowitz com posições curtas permitidas ##
  57.  
  58. ef.frontier.s <- efficient.frontier(er = mu.vec, cov.mat = sigma.mat,
  59.                                     nport = 100, alpha.min = -2, alpha.max = 3,
  60.                                     shorts = TRUE)
  61. plot(ef.frontier.s, col = "blue")
  62.  
  63. ################# QUESTAO 2 #################
  64. ## Traçando a fronteira da bala de Markowitz com posições curtas não permitidas ##
  65.  
  66. ef.frontier.ns <- efficient.frontier(er = mu.vec, cov.mat = sigma.mat,
  67.                                      nport = 100, alpha.min = -2, alpha.max = 3,
  68.                                      shorts = FALSE)
  69. points(ef.frontier.ns$sd, ef.frontier.ns$er, col = "red")
  70.  
  71. ################# QUESTAO 3 #################
  72. ## Determinando pesos do GMVP com posições curtas não permitidas ##
  73.  
  74. A <- cbind(one.vec, diag(num_cols), -diag(num_cols))
  75. b <- c(1, zero.vec, -0.5*one.vec)
  76. gmvp.ns.mw <- solve.QP(Dmat = 2*sigma.mat, dvec = zero.vec,
  77.                       Amat = A, bvec = b, meq = 1)
  78. gmvp.ns.mw$solution
  79. points(sqrt(gmvp.ns.mw$value), t(gmvp.ns.mw$solution)%*%mu.vec,
  80.        pch=16, col='orange', cex=2)
  81.  
  82. ################# QUESTAO 4 #################
  83. ## Determinando pesos das ações no TP com posições curtas não permitidas ##
  84.  
  85. tan.port.ns <- tangency.portfolio(er = mu.vec, cov.mat = sigma.mat,
  86.                                   risk.free = risk.free, shorts = FALSE)
  87. tan.port.ns
  88. points(tan.port.ns$sd, tan.port.ns$er, col = "black", pch = 16, cex = 2)
  89. ################# QUESTAO 5 #################
  90. ## Determinando reta dos investimentos eficientes posições curtas não permitidas ##
  91.  
  92. abline(a = risk.free, b = (tan.port.ns$er - risk.free)/tan.port.ns$sd, col = 'pink', lwd = 3)
  93.  
  94. ################# QUESTAO 6 #################
  95. ## Determinando posição no grafico do port. do E2M ##
  96.  
  97. points(portfolio$sd, portfolio$er, col="green", pch=16, cex=2)
  98.  
  99. ################# QUESTAO 7 #################
  100. ##  Obtendo os pesos das ações no portfolio no portfolio eficiente ##
  101.  
  102. x = portfolio$sd
  103. y = (((tan.port.ns$er - risk.free)/tan.port.ns$sd) * x) + risk.free
  104. points(x, y, col = 'yellow', pch = 16, cex = 2)
  105.  
  106. ################# QUESTAO 8 #################
  107. ## Obtendo os gráficos do retorno acumulado/drawdown ##
  108.  
  109. charts.PerformanceSummary(getPortRet(), Rf = 0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement