Carregando os retornos (fonte economática):
retornos <- read_excel("Retornos_lista_1.xlsx")
Separando os Portfólios:
portfolio_1 <- retornos %>% select(Data, RADL3, RENT3, SANB11, SBSP3, SULA11, TIMS3, TOTS3) %>% dplyr::filter(Data >= "2020-01-01" & Data <= "2020-12-31")
portfolio_2 <- retornos %>% select(Data, TOTS3, UGPA3, USIM5, VALE3, VIVT3, WEGE3, YDUQ3) %>% dplyr::filter(Data >= "2020-01-01" & Data <= "2020-12-31")
er_portfolio_1 <- colMeans(portfolio_1[,-1])
barplot(er_portfolio_1)
er_portfolio_2 <- colMeans(portfolio_2[,-1])
barplot(er_portfolio_2)
cov_portfolio_1 <- cov(portfolio_1[,-1])
cov_portfolio_2 <- cov(portfolio_2[,-1])
cor(portfolio_1[,-1])
## RADL3 RENT3 SANB11 SBSP3 SULA11 TIMS3 TOTS3
## RADL3 1.0000000 0.4641709 0.3550447 0.3078389 0.4447711 0.4388609 0.4227747
## RENT3 0.4641709 1.0000000 0.5918910 0.5621843 0.6936409 0.4922572 0.6301302
## SANB11 0.3550447 0.5918910 1.0000000 0.5958579 0.5865947 0.5284372 0.4564747
## SBSP3 0.3078389 0.5621843 0.5958579 1.0000000 0.5608830 0.5883516 0.5546180
## SULA11 0.4447711 0.6936409 0.5865947 0.5608830 1.0000000 0.5022101 0.5688253
## TIMS3 0.4388609 0.4922572 0.5284372 0.5883516 0.5022101 1.0000000 0.4424766
## TOTS3 0.4227747 0.6301302 0.4564747 0.5546180 0.5688253 0.4424766 1.0000000
cor(portfolio_2[,-1])
## TOTS3 UGPA3 USIM5 VALE3 VIVT3 WEGE3 YDUQ3
## TOTS3 1.0000000 0.5693357 0.5110237 0.5055977 0.3424556 0.5811683 0.4924619
## UGPA3 0.5693357 1.0000000 0.6092341 0.6375674 0.5411667 0.4688973 0.5694562
## USIM5 0.5110237 0.6092341 1.0000000 0.6552936 0.3050041 0.3890319 0.4781248
## VALE3 0.5055977 0.6375674 0.6552936 1.0000000 0.4392942 0.3790580 0.3738296
## VIVT3 0.3424556 0.5411667 0.3050041 0.4392942 1.0000000 0.2913505 0.3417128
## WEGE3 0.5811683 0.4688973 0.3890319 0.3790580 0.2913505 1.0000000 0.4228763
## YDUQ3 0.4924619 0.5694562 0.4781248 0.3738296 0.3417128 0.4228763 1.0000000
Assim, obtemos todos os parâmetros necessários para a estimação. Percebemos uma certa descorrelação entre os ativos e, em função das datas, retornos esperados não tão exagerados (Ibovespa não teve valorização expressiva em 2018).
Taxa livre de risco será de 3,5% a.a.
risk_free <- (1+0.035)^(1/252) - 1
Pesos dos portfólios e plotagem da fronteira - Portfólio 1:
Pesos_PMV_1 <- inv(cov_portfolio_1) %*% rep(1,7)
Pesos_PMV_1 <- Pesos_PMV_1/sum(Pesos_PMV_1)
Pesos_PMV_1
## [,1]
## RADL3 0.53317911
## RENT3 -0.19288857
## SANB11 0.12548442
## SBSP3 0.06649908
## SULA11 0.13222382
## TIMS3 0.23996248
## TOTS3 0.09553966
Pesos_PT_1 <- inv(cov_portfolio_1) %*% (er_portfolio_1 - risk_free)
Pesos_PT_1 <- Pesos_PT_1/sum(Pesos_PT_1)
Pesos_PT_1
## [,1]
## RADL3 3.508075
## RENT3 23.295461
## SANB11 2.840828
## SBSP3 -17.895604
## SULA11 -29.312965
## TIMS3 1.996643
## TOTS3 16.567561
## Risco Retorno
## RADL3 41.39976 0.08256269
## RENT3 74.69482 0.26366111
## SANB11 56.90083 0.05112432
## SBSP3 59.24377 -0.04117636
## SULA11 54.93407 -0.03471532
## TIMS3 47.06568 0.03310326
## TOTS3 59.91318 0.19091377
Pesos dos portfólios e plotagem da fronteira - Portfólio 1:
Pesos_PMV_2 <- inv(cov_portfolio_2) %*% rep(1,7)
Pesos_PMV_2 <- Pesos_PMV_2/sum(Pesos_PMV_2)
Pesos_PMV_2
## [,1]
## TOTS3 0.09851024
## UGPA3 -0.23195207
## USIM5 0.02617738
## VALE3 0.21691478
## VIVT3 0.63198349
## WEGE3 0.20744799
## YDUQ3 0.05091819
Pesos_PT_2 <- inv(cov_portfolio_2) %*% (er_portfolio_2 - risk_free)
Pesos_PT_2 <- Pesos_PT_2/sum(Pesos_PT_2)
Pesos_PT_2
## [,1]
## TOTS3 -0.10882453
## UGPA3 -0.51338784
## USIM5 0.25287615
## VALE3 0.72959653
## VIVT3 -0.05996756
## WEGE3 1.07799641
## YDUQ3 -0.37828916
## Risco Retorno
## TOTS3 59.91318 0.19091377
## UGPA3 72.80982 0.08207192
## USIM5 74.45687 0.28617312
## VALE3 55.16606 0.27473582
## VIVT3 42.26350 0.04959583
## WEGE3 57.63268 0.38449341
## YDUQ3 76.28204 -0.02427811
Data = timeSeries(ts(portfolio_1[,-1], frequency=12, start=c(2019,1)))
(ndm=dim(Data))
## [1] 249 7
Spec = portfolioSpec() #Novo portf´olio
setTargetReturn(Spec) = mean(colMeans(Data,na.rm=T))
#barplot(colMeans(Data))
setRiskFreeRate(Spec) = risk_free
setNFrontierPoints(Spec) = 50 # padrão 50
Constraints = "LongOnly"
PMV=minvariancePortfolio(Data, Spec, Constraints)
PT=tangencyPortfolio(Data, Spec, Constraints)
## RADL3 RENT3 SANB11 SBSP3 SULA11 TIMS3 TOTS3
## 0.53086353 0.00000000 0.08543060 0.05148291 0.04582307 0.25040363 0.03599625
## RADL3 RENT3 SANB11 SBSP3 SULA11 TIMS3 TOTS3
## 0.0000000 0.5833228 0.0000000 0.0000000 0.0000000 0.0000000 0.4166772
## Risco Retorno
## RADL3 41.39976 0.08256269
## RENT3 74.69482 0.26366111
## SANB11 56.90083 0.05112432
## SBSP3 59.24377 -0.04117636
## SULA11 54.93407 -0.03471532
## TIMS3 47.06568 0.03310326
## TOTS3 59.91318 0.19091377
Data = timeSeries(ts(portfolio_2[,-1], frequency=12, start=c(2019,1)))
(ndm=dim(Data))
## [1] 249 7
Spec = portfolioSpec() #Novo portf´olio
setTargetReturn(Spec) = mean(colMeans(Data,na.rm=T))
#barplot(colMeans(Data))
setRiskFreeRate(Spec) = risk_free
setNFrontierPoints(Spec) = 50 # padrão 50
Constraints = "NULL"
PMV=minvariancePortfolio(Data, Spec, Constraints)
PT=tangencyPortfolio(Data, Spec, Constraints)
## TOTS3 UGPA3 USIM5 VALE3 VIVT3 WEGE3 YDUQ3
## 0.06705039 0.00000000 0.00000000 0.14480122 0.58593002 0.20221838 0.00000000
## TOTS3 UGPA3 USIM5 VALE3 VIVT3 WEGE3 YDUQ3
## 0.0000000 0.0000000 0.0000000 0.3405208 0.0000000 0.6594792 0.0000000
Data = timeSeries(ts(portfolio_2[,-1], frequency=12, start=c(2019,1)))
(ndm=dim(Data))
## [1] 249 7
Spec = portfolioSpec() #Novo portf´olio
setTargetReturn(Spec) = mean(colMeans(Data,na.rm=T))
#barplot(colMeans(Data))
setRiskFreeRate(Spec) = risk_free
setNFrontierPoints(Spec) = 50 # padrão 50
Constraints = "NULL"
PMV=minvariancePortfolio(Data, Spec, Constraints)
PT=tangencyPortfolio(Data, Spec, Constraints)
Pesos_PMV_2_LO <- getWeights(PMV)
Pesos_PMV_2_LO
## TOTS3 UGPA3 USIM5 VALE3 VIVT3 WEGE3 YDUQ3
## 0.06705039 0.00000000 0.00000000 0.14480122 0.58593002 0.20221838 0.00000000
Pesos_PT_2_LO <- getWeights(PT)
Pesos_PT_2_LO
## TOTS3 UGPA3 USIM5 VALE3 VIVT3 WEGE3 YDUQ3
## 0.0000000 0.0000000 0.0000000 0.3405208 0.0000000 0.6594792 0.0000000
npf <- 60
wm <- -2
w <- sort(unique(c(0, 1, seq(wm,abs(wm), length.out=(npf-2))))) #para FE wm=-2
fe <- matrix(rep(0, 7*length(w)), nrow = length(w), ncol=7, byrow=TRUE)
colnames(fe) <- colnames(portfolio_2[,-1])
for (i in 1:7) fe[,i]=w*Pesos_PMV_2_LO[i]+(1-w)*Pesos_PT_2_LO[i] # carteiras da FE
RetEsp=rep(0,length(w)) #retorno de FE
DesPad=RetEsp #risco na FE
for (j in 1:length(w)){ RetEsp[j]=fe[j,]%*%er_portfolio_2 # retorno esperado
DesPad[j]=((t(fe[j,])%*%cov_portfolio_2%*%fe[j,])^.5)*sqrt(252) } # risco
ISharpe=(RetEsp-risk_free)/DesPad #Ind. Sharpe
dcef=c(which(w==1),which(w==0)) #PVM e PT
pvmpt=cbind(DesPad[dcef],RetEsp[dcef])
cef=RetEsp>=RetEsp[which(DesPad==min(DesPad))]
fem=data.frame(round(cbind(w,fe,DesPad,RetEsp,ISharpe),3)[cef,]) #FE
slim=c(.95*min(DesPad,na.rm=T),max(diag(cov_portfolio_2)^.5,DesPad,na.rm=T)*1.1)
rlim=c(.95*min(RetEsp,er_portfolio_2),max(RetEsp,er_portfolio_2)*1.1)
riscoretorig=data.frame(Risco=((diag(cov_portfolio_2)^.5)*sqrt(252)),Retorno=er_portfolio_2)
riscoretorig*100
## Risco Retorno
## TOTS3 59.91318 0.19091377
## UGPA3 72.80982 0.08207192
## USIM5 74.45687 0.28617312
## VALE3 55.16606 0.27473582
## VIVT3 42.26350 0.04959583
## WEGE3 57.63268 0.38449341
## YDUQ3 76.28204 -0.02427811
plot(DesPad,RetEsp,xlim=slim,ylim=rlim,main="")
lines(DesPad[cef],RetEsp[cef],lwd=3,col="red")
points(riscoretorig, pch =19, col = 1:7)
text(riscoretorig, colnames(portfolio_2), col= 1:7, cex = .8)
matpoints(DesPad[dcef],RetEsp[dcef], pch =22, col = c(3,4))
text(DesPad[dcef],RetEsp[dcef], c("PVM","PT"), col= 3:4, cex = 1.5)
grid()
Para estimar o beta, utilizaremos uma regressão linear utilizando fatores disponíveis no NEFIN
fatores <- read_excel("fatores_nefin_lista1.xlsx")
fatores <- fatores %>% select(Data, Risk_free, Rm_minus_Rf, HML, SMB, WML) %>% dplyr::filter(Data >= "2020-01-01" & Data <= "2020-12-31")
dados_capm_p1 <- as.data.frame(matrix(, nrow = ncol(portfolio_1[,-1]), ncol = 2))
retorno_ativos <- portfolio_1[,-1]
for (i in 1:ncol(retorno_ativos)) {
#Criando um data frame de variáveis temporárias para armazenar retornos
temp <- data.frame(retorno_ativos[,i],fatores$Risk_free, fatores$Rm_minus_Rf)
#Nomeando essas variáveis
names(temp) <- c("Ra","Rf","Rm")
#Com base nos nomes, estimando MQO
linear_model <- lm(I(temp$Ra - temp$Rf) ~ temp$Rm)
#Salvando variáveis
#armazenando os dados
dados_capm_p1[i, 1] <- names(retorno_ativos)[i]
dados_capm_p1[i,2] <- as.numeric(linear_model$coefficients[2])
}
names(dados_capm_p1) <- c("Ativo", "Beta")
## Ativo Beta
## 1 RADL3 0.5118771
## 2 RENT3 1.3058580
## 3 SANB11 1.0864964
## 4 SBSP3 1.0774220
## 5 SULA11 0.9900499
## 6 TIMS3 0.7411569
## 7 TOTS3 0.9854144
## 8 TOTS3 0.9854144
## 9 UGPA3 1.4378060
## 10 USIM5 1.2930576
## 11 VALE3 1.0009915
## 12 VIVT3 0.5557220
## 13 WEGE3 0.8496157
## 14 YDUQ3 1.1622679
apply(portfolio_1[,-1], 2, sd) * sqrt(252)
## RADL3 RENT3 SANB11 SBSP3 SULA11 TIMS3 TOTS3
## 0.4139976 0.7469482 0.5690083 0.5924377 0.5493407 0.4706568 0.5991318
apply(portfolio_2[,-1], 2, sd) * sqrt(252)
## TOTS3 UGPA3 USIM5 VALE3 VIVT3 WEGE3 YDUQ3
## 0.5991318 0.7280982 0.7445687 0.5516606 0.4226350 0.5763268 0.7628204
apply(portfolio_1[,-1], 2, sd) / er_portfolio_1
## RADL3 RENT3 SANB11 SBSP3 SULA11 TIMS3 TOTS3
## 31.58739 17.84613 70.11175 -90.63469 -99.68282 89.56396 19.76901
apply(portfolio_2[,-1], 2, sd) / er_portfolio_2
## TOTS3 UGPA3 USIM5 VALE3 VIVT3 WEGE3
## 19.769005 55.884976 16.389875 12.649006 53.680930 9.442341
## YDUQ3
## -197.927988
Primeiro Portfólio
downside_risk <- vector(length = 7)
for(i in 2:8){
ativo <- portfolio_1[[i]]
ativo <- ativo[fatores$Rm_minus_Rf > 0]
downside_risk[i - 1] <- mean(ativo)*100
}
names(downside_risk) <- names(portfolio_1[,-1])
downside_risk
## RADL3 RENT3 SANB11 SBSP3 SULA11 TIMS3 TOTS3
## 0.9430688 2.1907969 2.0524554 1.6618283 1.5743545 1.3056556 1.5486446
Segundo Portfólio
downside_risk <- vector(length = 7)
for(i in 2:8){
ativo <- portfolio_2[[i]]
ativo <- ativo[fatores$Rm_minus_Rf > 0]
downside_risk[i - 1] <- mean(ativo)*100
}
names(downside_risk) <- names(portfolio_2[,-1])
downside_risk
## TOTS3 UGPA3 USIM5 VALE3 VIVT3 WEGE3 YDUQ3
## 1.5486446 2.1657826 2.5029532 1.6967632 0.9658318 1.7969947 2.0201452
Primeiro Portfólio
cvar <- vector(length = 8)
for(i in 2:8){
cvar[i - 1] <- CVaR(portfolio_1[[i]])*100
}
names(cvar) <- names(portfolio_1[,-1])
cvar
## RADL3 RENT3 SANB11 SBSP3 SULA11 TIMS3 TOTS3
## -7.635913 -6.511857 -7.747692 -8.588800 -11.312959 -9.004000 -9.737782
## <NA>
## 0.000000
Segundo Portfólio
cvar <- vector(length = 8)
for(i in 2:8){
cvar[i - 1] <- CVaR(portfolio_2[[i]])*100
}
names(cvar) <- names(portfolio_2[,-1])
cvar
## TOTS3 UGPA3 USIM5 VALE3 VIVT3 WEGE3 YDUQ3
## -9.737782 -9.116554 -10.431116 -3.849780 -5.484349 -11.992311 -8.212164
## <NA>
## 0.000000
PMV
sum(dados_capm_p1[,-1] * Pesos_PMV_1)
## [1] 0.6319272
sum(dados_capm_p2[,-1] * Pesos_PMV_2)
## [1] 0.6011888
PT
sum(dados_capm_p1[,-1] * Pesos_PT_1)
## [1] 4.806141
sum(dados_capm_p2[,-1] * Pesos_PT_2)
## [1] 0.654798
PMV Long Only
sum(dados_capm_p1[,-1] * Pesos_PMV_1_LO)
## [1] 0.6864525
sum(dados_capm_p2[,-1] * Pesos_PMV_2_LO)
## [1] 0.7084393
PT Long Only
sum(dados_capm_p1[,-1] * Pesos_PT_1_LO)
## [1] 1.172336
sum(dados_capm_p2[,-1] * Pesos_PT_2_LO)
## [1] 0.9011623
Como prêmio de risco utilizaremos a taxa EMBI+ somada a meta de inflação do BACEN: 2.45% + 4,25% = 6,7%
PMV_1
dados_capm_p1[,-1] * 0.067 + 0.035
## [1] 0.06929576 0.12249249 0.10779526 0.10718727 0.10133334 0.08465751 0.10102276
sum(Pesos_PMV_1 * ((dados_capm_p1[,-1] * 0.067 + 0.035)))
## [1] 0.07733912
PMV_2
dados_capm_p2[,-1] * 0.067 + 0.035
## [1] 0.10102276 0.13133300 0.12163486 0.10206643 0.07223338 0.09192425 0.11287195
sum(Pesos_PMV_2 * ((dados_capm_p2[,-1] * 0.067 + 0.035)))
## [1] 0.07527965
PT_1
dados_capm_p1[,-1] * 0.067 + 0.035
## [1] 0.06929576 0.12249249 0.10779526 0.10718727 0.10133334 0.08465751 0.10102276
sum(Pesos_PT_1 * ((dados_capm_p1[,-1] * 0.067 + 0.035)))
## [1] 0.3570115
PT_2
dados_capm_p2[,-1] * 0.067 + 0.035
## [1] 0.10102276 0.13133300 0.12163486 0.10206643 0.07223338 0.09192425 0.11287195
sum(Pesos_PT_2 * ((dados_capm_p2[,-1] * 0.067 + 0.035)))
## [1] 0.07887146
PMV_1_LO
dados_capm_p1[,-1] * 0.067 + 0.035
## [1] 0.06929576 0.12249249 0.10779526 0.10718727 0.10133334 0.08465751 0.10102276
sum(Pesos_PMV_1_LO * ((dados_capm_p1[,-1] * 0.067 + 0.035)))
## [1] 0.08099232
PMV_2_LO
dados_capm_p2[,-1] * 0.067 + 0.035
## [1] 0.10102276 0.13133300 0.12163486 0.10206643 0.07223338 0.09192425 0.11287195
sum(Pesos_PMV_2_LO * ((dados_capm_p2[,-1] * 0.067 + 0.035)))
## [1] 0.08246543
PT_1_LO
dados_capm_p1[,-1] * 0.067 + 0.035
## [1] 0.06929576 0.12249249 0.10779526 0.10718727 0.10133334 0.08465751 0.10102276
sum(Pesos_PT_1_LO * ((dados_capm_p1[,-1] * 0.067 + 0.035)))
## [1] 0.1135465
PT_2_LO
dados_capm_p2[,-1] * 0.067 + 0.035
## [1] 0.10102276 0.13133300 0.12163486 0.10206643 0.07223338 0.09192425 0.11287195
sum(Pesos_PT_2_LO * ((dados_capm_p2[,-1] * 0.067 + 0.035)))
## [1] 0.09537787
## [1] 249 7
Pesos_PMV_1_Q9 <- getWeights(PMV)
Pesos_PMV_1_Q9
## RADL3 RENT3 SANB11 SBSP3 SULA11 TIMS3 TOTS3
## 0.40000000 0.00000000 0.10031582 0.03862677 0.07913068 0.31548491 0.06644183
Pesos_PT_1_Q9 <- getWeights(PT)
Pesos_PT_1_Q9
## RADL3 RENT3 SANB11 SBSP3 SULA11 TIMS3 TOTS3
## 0.2 0.4 0.0 0.0 0.0 0.0 0.4
npf <- 60
wm <- -2
w <- sort(unique(c(0, 1, seq(wm,abs(wm), length.out=(npf-2))))) #para FE wm=-2
fe <- matrix(rep(0, 7*length(w)), nrow = length(w), ncol=7, byrow=TRUE)
colnames(fe) <- colnames(portfolio_1[,-1])
for (i in 1:7) fe[,i]=w*Pesos_PMV_1_Q9[i]+(1-w)*Pesos_PT_1_Q9[i] # carteiras da FE
RetEsp=rep(0,length(w)) #retorno de FE
DesPad=RetEsp #risco na FE
for (j in 1:length(w)){ RetEsp[j]=fe[j,]%*%er_portfolio_1 # retorno esperado
DesPad[j]=((t(fe[j,])%*%cov_portfolio_1%*%fe[j,])^.5)*sqrt(252) } # risco
ISharpe=(RetEsp-risk_free)/DesPad #Ind. Sharpe
dcef=c(which(w==1),which(w==0)) #PVM e PT
pvmpt=cbind(DesPad[dcef],RetEsp[dcef])
cef=RetEsp>=RetEsp[which(DesPad==min(DesPad))]
fem=data.frame(round(cbind(w,fe,DesPad,RetEsp,ISharpe),3)[cef,]) #FE
slim=c(.95*min(DesPad,na.rm=T),max(diag(cov_portfolio_1)^.5,DesPad,na.rm=T)*1.1)
rlim=c(.95*min(RetEsp,er_portfolio_1),max(RetEsp,er_portfolio_1)*1.1)
riscoretorig=data.frame(Risco=((diag(cov_portfolio_1)^.5)*sqrt(252)),Retorno=er_portfolio_1)
riscoretorig*100
## Risco Retorno
## RADL3 41.39976 0.08256269
## RENT3 74.69482 0.26366111
## SANB11 56.90083 0.05112432
## SBSP3 59.24377 -0.04117636
## SULA11 54.93407 -0.03471532
## TIMS3 47.06568 0.03310326
## TOTS3 59.91318 0.19091377
plot(DesPad,RetEsp,xlim=slim,ylim=rlim,main="")
lines(DesPad[cef],RetEsp[cef],lwd=3,col="red")
points(riscoretorig, pch =19, col = 1:7)
text(riscoretorig, colnames(portfolio_1), col= 1:7, cex = .8)
matpoints(DesPad[dcef],RetEsp[dcef], pch =22, col = c(3,4))
text(DesPad[dcef],RetEsp[dcef], c("PVM","PT"), col= 3:4, cex = 1.5)
grid()
Data = timeSeries(ts(portfolio_2[,-1], frequency=12, start=c(2019,1)))
(ndm=dim(Data))
## [1] 249 7
Spec = portfolioSpec() #Novo portf´olio
setTargetReturn(Spec) = mean(colMeans(Data,na.rm=T))
#barplot(colMeans(Data))
setRiskFreeRate(Spec) = risk_free
setNFrontierPoints(Spec) = 50 # padrão 50
Constraints = c( "maxW = c(0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4)", "maxsumW[1:7] = 1.1")
PMV=minvariancePortfolio(Data, Spec, Constraints)
PT=tangencyPortfolio(Data, Spec, Constraints)
Pesos_PMV_2_Q9 <- getWeights(PMV)
Pesos_PMV_2_Q9
## TOTS3 UGPA3 USIM5 VALE3 VIVT3 WEGE3 YDUQ3
## 0.09029531 0.00000000 0.00000000 0.23735093 0.40000000 0.24798636 0.02436741
Pesos_PT_2_Q9 <- getWeights(PT)
Pesos_PT_2_Q9
## TOTS3 UGPA3 USIM5 VALE3 VIVT3 WEGE3 YDUQ3
## 0.03305052 0.00000000 0.14193132 0.40000000 0.02501816 0.40000000 0.00000000
w <- sort(unique(c(0, 1, seq(wm,abs(wm), length.out=(npf-2))))) #para FE wm=-2
fe <- matrix(rep(0, 7*length(w)), nrow = length(w), ncol=7, byrow=TRUE)
colnames(fe) <- colnames(portfolio_2[,-1])
for (i in 1:7) fe[,i]=w*Pesos_PMV_2_Q9[i]+(1-w)*Pesos_PT_2_Q9[i] # carteiras da FE
RetEsp=rep(0,length(w)) #retorno de FE
DesPad=RetEsp #risco na FE
for (j in 1:length(w)){ RetEsp[j]=fe[j,]%*%er_portfolio_2 # retorno esperado
DesPad[j]=((t(fe[j,])%*%cov_portfolio_2%*%fe[j,])^.5)*sqrt(252) } # risco
ISharpe=(RetEsp-risk_free)/DesPad #Ind. Sharpe
dcef=c(which(w==1),which(w==0)) #PVM e PT
pvmpt=cbind(DesPad[dcef],RetEsp[dcef])
cef=RetEsp>=RetEsp[which(DesPad==min(DesPad))]
fem=data.frame(round(cbind(w,fe,DesPad,RetEsp,ISharpe),3)[cef,]) #FE
slim=c(.95*min(DesPad,na.rm=T),max(diag(cov_portfolio_2)^.5,DesPad,na.rm=T)*1.1)
rlim=c(.95*min(RetEsp,er_portfolio_2),max(RetEsp,er_portfolio_2)*1.1)
riscoretorig=data.frame(Risco=((diag(cov_portfolio_2)^.5)*sqrt(252)),Retorno=er_portfolio_2)
riscoretorig*100
## Risco Retorno
## TOTS3 59.91318 0.19091377
## UGPA3 72.80982 0.08207192
## USIM5 74.45687 0.28617312
## VALE3 55.16606 0.27473582
## VIVT3 42.26350 0.04959583
## WEGE3 57.63268 0.38449341
## YDUQ3 76.28204 -0.02427811
plot(DesPad,RetEsp,xlim=slim,ylim=rlim,main="")
lines(DesPad[cef],RetEsp[cef],lwd=3,col="red")
points(riscoretorig, pch =19, col = 1:7)
text(riscoretorig, colnames(portfolio_2), col= 1:7, cex = .8)
matpoints(DesPad[dcef],RetEsp[dcef], pch =22, col = c(3,4))
text(DesPad[dcef],RetEsp[dcef], c("PVM","PT"), col= 3:4, cex = 1.5)
grid()
Pegando a série de retornos para o backtest
retornos_teste_1 <- retornos %>% select(Data, RADL3, RENT3, SANB11, SBSP3, SULA11, TIMS3, TOTS3) %>% dplyr::filter(Data >= "2021-01-01" & Data <= "2021-12-31")
R_teste <- xts(retornos_teste_1[,-1], retornos_teste_1$Data)
Portfólio Ingênuo
Pesos_Ingênuo <- matrix(rep(1/7,7), nrow = 20, ncol = 7)
Retorno_Ingênuo <- Return.portfolio(R_teste, as.ts(Pesos_Ingênuo), rebalance_on = c("weeks"))
names(Retorno_Ingênuo) <- "Portfólio Ingênuo"
Portfólio de VM
var <- diag(cov_portfolio_1)
wVT <- (1/var)^4/sum((1/var)^4)
Pesos_wVT <- matrix(wVT, nrow = 20, ncol = 7)
Retorno_wVT <- Return.portfolio(R_teste, as.ts(Pesos_wVT), rebalance_on = c("months"))
names(Retorno_wVT) <- "Portfólio Volatility Timing"
Portfólio de MV
Pesos_PMV_1 <- matrix( Pesos_PMV_1, nrow = 20, ncol = 7)
Retorno_PMV_1 <- Return.portfolio(R_teste, as.ts(Pesos_PMV_1), rebalance_on = c("months"))
names(Retorno_PMV_1) <- "Portfólio VM"
Retornos_backtest <- cbind(Retorno_wVT, Retorno_Ingênuo, Retorno_PMV_1)
table.AnnualizedReturns(Retornos_backtest)
## Portfólio.Volatility.Timing Portfólio.Ingênuo
## Annualized Return -0.1924 -0.0918
## Annualized Std Dev 0.2371 0.2456
## Annualized Sharpe (Rf=0%) -0.8115 -0.3737
## Portfólio.VM
## Annualized Return -0.0915
## Annualized Std Dev 0.2471
## Annualized Sharpe (Rf=0%) -0.3702