Carregando os retornos (fonte economática):
retornos <- read_excel("Retornos_lista_2.xlsx")
summary(retornos[,-1])
## RADL3 VALE3 VIVT3
## Min. :-0.1283478 Min. :-0.245236 Min. :-0.123589
## 1st Qu.:-0.0108766 1st Qu.:-0.011914 1st Qu.:-0.008732
## Median : 0.0003805 Median : 0.001653 Median : 0.000000
## Mean : 0.0009523 Mean : 0.002224 Mean : 0.000636
## 3rd Qu.: 0.0122921 3rd Qu.: 0.016129 3rd Qu.: 0.010060
## Max. : 0.0924855 Max. : 0.213579 Max. : 0.123216
## WEGE3 YDUQ3
## Min. :-0.206198 Min. :-0.2517442
## 1st Qu.:-0.010805 1st Qu.:-0.0165485
## Median : 0.001775 Median : 0.0008683
## Mean : 0.001802 Mean : 0.0016413
## 3rd Qu.: 0.013349 3rd Qu.: 0.0192366
## Max. : 0.138945 Max. : 0.2373646
Separando os Portfólios - Estimação e Backtest:
retornos_estim <- retornos %>% dplyr::filter(Data >= "2016-01-01" & Data <= "2019-12-31")
retornos_backtest <- retornos %>% dplyr::filter(Data >= "2020-01-01" & Data <= "2021-12-31")
Criando variáveis para armazenar os retornos individuais dos ativos:
retornos_RADL3 <- xts(retornos_estim$RADL3, retornos_estim$Data)
retornos_VALE3 <- xts(retornos_estim$VALE3, retornos_estim$Data)
retornos_VIVT3 <- xts(retornos_estim$VIVT3, retornos_estim$Data)
retornos_WEGE3 <- xts(retornos_estim$WEGE3, retornos_estim$Data)
retornos_YDUQ3 <- xts(retornos_estim$YDUQ3, retornos_estim$Data)
gspec <- ugarchspec(mean.model=list(
armaOrder=c(2,1)), variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
distribution="std")
gfit <- ugarchfit(gspec, retornos_RADL3)
forc = ugarchforecast(gfit, n.ahead=21)
RADL3 <- forc@forecast$sigmaFor[21]
gspec <- ugarchspec(mean.model=list(
armaOrder=c(2,1)), variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
distribution="std")
gfit <- ugarchfit(gspec, retornos_VALE3)
forc = ugarchforecast(gfit, n.ahead=21)
VALE3 <- forc@forecast$sigmaFor[21]
gspec <- ugarchspec(mean.model=list(
armaOrder=c(2,1)), variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
distribution="std")
gfit <- ugarchfit(gspec, retornos_VIVT3)
forc = ugarchforecast(gfit, n.ahead=21)
VIVT3 <- forc@forecast$sigmaFor[21]
gspec <- ugarchspec(mean.model=list(
armaOrder=c(2,1)), variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
distribution="std")
gfit <- ugarchfit(gspec, retornos_WEGE3)
forc = ugarchforecast(gfit, n.ahead=21)
WEGE3 <- forc@forecast$sigmaFor[21]
gspec <- ugarchspec(mean.model=list(
armaOrder=c(2,1)), variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
distribution="std")
gfit <- ugarchfit(gspec, retornos_YDUQ3)
forc = ugarchforecast(gfit, n.ahead=21)
YDUQ3 <- forc@forecast$sigmaFor[21]
var_estimada <- (cbind(RADL3, VALE3, VIVT3, WEGE3, YDUQ3))^2
var_estimada
## RADL3 VALE3 VIVT3 WEGE3 YDUQ3
## [1,] 0.0002945013 0.0003283096 0.0002328512 0.0002842183 0.0007840874
retornos_backtest_ts <- xts(retornos_backtest[,-1], retornos_backtest$Data)
Pesos_Ingênuo <- rep(1/5,5)
Retorno_Ingênuo <- Return.portfolio(retornos_backtest_ts, Pesos_Ingênuo, rebalance_on = c("quarters"))
names(Retorno_Ingênuo) <- "Portfólio Ingênuo"
var <- var_estimada
wVT <- (1/var)^4/sum((1/var)^4)
Pesos_wVT <- as.vector(wVT)
names(Pesos_wVT) <- colnames(wVT)
Pesos_wVT
## RADL3 VALE3 VIVT3 WEGE3 YDUQ3
## 0.18591100 0.12037029 0.47570716 0.21431161 0.00369995
Retorno_wVT <- Return.portfolio(retornos_backtest_ts, Pesos_wVT, rebalance_on = c("quarters"))
names(Retorno_wVT) <- "Portfólio Volatility Timing"
Vamos substituir a diagonal na matriz de covariâncias com as novas variâncias estimadas utilizando GARCH Assume-se que as covariâncias entre os ativos serão as mesmas.
cov_m <- cov(retornos_estim[,-1])
diag(cov_m) <- var_estimada
Pesos_PMV <- inv(cov(retornos_estim[,-1])) %*% rep(1,5)
Pesos_PMV <- t(Pesos_PMV/sum(Pesos_PMV))
Pesos_PMV <- as.vector(Pesos_PMV)
names(Pesos_PMV) <- colnames(wVT)
Pesos_PMV
## RADL3 VALE3 VIVT3 WEGE3 YDUQ3
## 0.25403628 0.14146684 0.32297150 0.25430254 0.02722284
Retorno_PMV <- Return.portfolio(retornos_backtest_ts, Pesos_PMV, rebalance_on = c("quarters"))
names(Retorno_PMV) <- "Portfólio VM"
table.AnnualizedReturns(Backtest, scale = 252, Rf = (1+0.0488)^(1/252)-1)
## Portfólio.Volatility.Timing Portfólio.Ingênuo
## Annualized Return 0.2787 0.3130
## Annualized Std Dev 0.3099 0.3414
## Annualized Sharpe (Rf=4.77%) 0.7074 0.7381
## Portfólio.VM
## Annualized Return 0.3343
## Annualized Std Dev 0.3162
## Annualized Sharpe (Rf=4.77%) 0.8611
As estratégias de Volatility Timing e de Variância Mínima geraram um retorno absoluto semelhante ao Portfólio Ingênuo, embora o retorno ajustado ao risco tenha sido significativamente melhor no Porfólio de Variância Mínima, sendo o portfólio de Volatility Timing com os piores indicadores, inferiores inclusive ao Portfólio Ingênuo.
Risco do Portfólio
risco_ingênuo <- (t(Pesos_Ingênuo)%*%cov(retornos_backtest[,-1])%*%Pesos_Ingênuo)^0.5
risco_ingênuo
## [,1]
## [1,] 0.02201466
cont_marginal_ingênuo <- Pesos_Ingênuo %*% cov(retornos_backtest[,-1]) / as.numeric(risco_ingênuo)
cont_marginal_ingênuo
## RADL3 VALE3 VIVT3 WEGE3 YDUQ3
## [1,] 0.01636975 0.02099873 0.01429566 0.02474529 0.03366387
cont_individual_ingênuo <- cont_marginal_ingênuo * Pesos_Ingênuo
cont_individual_ingênuo
## RADL3 VALE3 VIVT3 WEGE3 YDUQ3
## [1,] 0.00327395 0.004199745 0.002859132 0.004949058 0.006732773
Fazendo a soma para checar:
sum(cont_individual_ingênuo)
## [1] 0.02201466
risco_VT <- (t(Pesos_wVT)%*%cov(retornos_backtest[,-1])%*%Pesos_wVT)^0.5
risco_VT
## [,1]
## [1,] 0.01958363
cont_marginal_VT <- Pesos_wVT %*% cov(retornos_backtest[,-1]) / as.numeric(risco_VT)
cont_marginal_VT
## RADL3 VALE3 VIVT3 WEGE3 YDUQ3
## [1,] 0.01608328 0.01897323 0.01915269 0.02387854 0.02195613
cont_individual_VT <- cont_marginal_VT * Pesos_wVT
cont_individual_VT
## RADL3 VALE3 VIVT3 WEGE3 YDUQ3
## [1,] 0.002990058 0.002283813 0.009111069 0.005117449 8.123661e-05
Fazendo a soma para chegar:
sum(cont_individual_VT)
## [1] 0.01958363
risco_PMV <- (t(Pesos_PMV)%*%cov(retornos_backtest[,-1])%*%Pesos_PMV)^0.5
risco_PMV
## [,1]
## [1,] 0.01998546
cont_marginal_PMV <- Pesos_PMV %*% cov(retornos_backtest[,-1]) / as.numeric(risco_PMV)
cont_marginal_PMV
## RADL3 VALE3 VIVT3 WEGE3 YDUQ3
## [1,] 0.01789978 0.01938922 0.01639256 0.02651184 0.02420689
cont_individual_PMV <- cont_marginal_PMV * Pesos_PMV
cont_individual_PMV
## RADL3 VALE3 VIVT3 WEGE3 YDUQ3
## [1,] 0.004547193 0.002742932 0.005294331 0.006742027 0.0006589802
Fazendo a soma para chegar:
sum(cont_individual_PMV)
## [1] 0.01998546
Juntando as séries temporais dos retornos:
retornos_ts <- cbind(retornos_RADL3, retornos_VALE3, retornos_VIVT3, retornos_WEGE3, retornos_YDUQ3)
Mport <- portfolio.spec( assets = colnames(retornos_ts))
Mport <- add.constraint( portfolio=Mport, type='box', min = 0, max=1 )
ObjSpec = add.objective( portfolio = Mport , type="risk",name="CVaR",
arguments=list(p=0.95,clean="boudt"), enabled=TRUE)
ObjSpec <- add.constraint(portfolio=ObjSpec, type="weight_sum",
min_sum=0.99, max_sum=1.01)
set.seed(15)
out <- optimize.portfolio(R=retornos_ts, portfolio=ObjSpec,
optimize_method="DEoptim", search_size=2000,
traceDE=5, itermax=50, trace=TRUE)
## Iteration: 5 bestvalit: 0.024095 bestmemit: 0.236785 0.183478 0.230577 0.297097 0.042974
## Iteration: 10 bestvalit: 0.024095 bestmemit: 0.236785 0.183478 0.230577 0.297097 0.042974
## Iteration: 15 bestvalit: 0.024020 bestmemit: 0.262000 0.108000 0.322000 0.216000 0.084916
## Iteration: 20 bestvalit: 0.023866 bestmemit: 0.316000 0.134000 0.280000 0.176000 0.086000
## Iteration: 25 bestvalit: 0.023866 bestmemit: 0.316000 0.134000 0.280000 0.176000 0.086000
## [1] 0.316 0.134 0.280 0.176 0.086
print(out)
## ***********************************
## PortfolioAnalytics Optimization
## ***********************************
##
## Call:
## optimize.portfolio(R = retornos_ts, portfolio = ObjSpec, optimize_method = "DEoptim",
## search_size = 2000, trace = TRUE, traceDE = 5, itermax = 50)
##
## Optimal Weights:
## retornos_RADL3 retornos_VALE3 retornos_VIVT3 retornos_WEGE3 retornos_YDUQ3
## 0.316 0.134 0.280 0.176 0.086
##
## Objective Measures:
## CVaR
## 0.02387
out$weights
## retornos_RADL3 retornos_VALE3 retornos_VIVT3 retornos_WEGE3 retornos_YDUQ3
## 0.316 0.134 0.280 0.176 0.086
Agora, em posse dos pesos, podemos comparar o desempenho do portfólio:
Pesos_CVaR <- out$weights
names(Pesos_CVaR) <- colnames(wVT)
Retorno_CVaR <- Return.portfolio(retornos_backtest_ts, Pesos_CVaR, rebalance_on = c("quarters"))
## Warning in Return.portfolio.geometric(R = R, weights = weights, wealth.index =
## wealth.index, : The weights for one or more periods do not sum up to 1: assuming
## a return of 0 for the residual weights
names(Retorno_CVaR) <- "Portfólio CVaR"
table.AnnualizedReturns(Backtest, scale = 252, Rf = (1+0.0488)^(1/252)-1)
## Portfólio.Volatility.Timing Portfólio.Ingênuo
## Annualized Return 0.2787 0.3130
## Annualized Std Dev 0.3099 0.3414
## Annualized Sharpe (Rf=4.77%) 0.7074 0.7381
## Portfólio.VM Portfólio.CVaR
## Annualized Return 0.3343 0.2827
## Annualized Std Dev 0.3162 0.3112
## Annualized Sharpe (Rf=4.77%) 0.8611 0.7166
Para nossa amostra, que é bastante restrita, a otimização por CVaR não trouxe grandes benefícios em termos de retorno ajustado ao risco, sendo inclusive pior do que os demais portfólios.
Utilizando de um índice da Bloomberg que mede padrões ESG e selecionaram-se os seguintes ativos:
BRDT3 - 88 pontos BRFS3 - 81 pontos BTOW3 - 80 pontos CIEL3 - 87 pontos ELET3 - 90 pontos
Empresas com poucos padrões ESG:
MGLU3 - 14 pontos MRFG3 - 24 pontos TAEE11 - 9 pontos BPAC11 - 18 pontos BRAP3 - 6 pontos
A pontuação vai de 0 a 100, quanto maior a pontuação melhores os padrões de ESG da firma.
Semelhante aos primeiros 3 exercícios, trazemos os retornos do economática
retornos_Q3 <- read_excel("Retornos_lista_2_ESG_economat.xlsx")
summary(retornos_Q3[,-1])
## BRDT3 BRFS3 BTOW3
## Min. :-0.152931 Min. :-1.975e-01 Min. :-0.169724
## 1st Qu.:-0.014065 1st Qu.:-1.509e-02 1st Qu.:-0.019511
## Median : 0.000000 Median :-1.530e-03 Median :-0.001179
## Mean : 0.001239 Mean : 4.948e-05 Mean : 0.002052
## 3rd Qu.: 0.015265 3rd Qu.: 1.410e-02 3rd Qu.: 0.023484
## Max. : 0.167184 Max. : 1.628e-01 Max. : 0.273953
## CIEL3 ELET3 MGLU3
## Min. :-0.211765 Min. :-0.1950515 Min. :-0.2107707
## 1st Qu.:-0.020752 1st Qu.:-0.0173416 1st Qu.:-0.0144187
## Median :-0.004124 Median : 0.0001359 Median : 0.0007565
## Mean :-0.001246 Mean : 0.0020422 Mean : 0.0030623
## 3rd Qu.: 0.014960 3rd Qu.: 0.0207499 3rd Qu.: 0.0185819
## Max. : 0.234568 Max. : 0.2071812 Max. : 0.2352941
## MRFG3 TAEE11 BPAC11
## Min. :-0.23890 Min. :-0.0786989 Min. :-0.2686332
## 1st Qu.:-0.01549 1st Qu.:-0.0072086 1st Qu.:-0.0114616
## Median : 0.00000 Median : 0.0005211 Median : 0.0006509
## Mean : 0.00166 Mean : 0.0012527 Mean : 0.0029749
## 3rd Qu.: 0.01655 3rd Qu.: 0.0087619 3rd Qu.: 0.0170821
## Max. : 0.25204 Max. : 0.0637119 Max. : 0.2789409
## BRAP3
## Min. :-0.251553
## 1st Qu.:-0.009820
## Median : 0.001173
## Mean : 0.001657
## 3rd Qu.: 0.014496
## Max. : 0.170168
retornos_estim_ESG <- retornos_Q3 %>% select(Data, BRDT3, BRFS3, BTOW3, CIEL3, ELET3) %>% dplyr::filter(Data >= "2016-01-01" & Data <= "2020-06-30")
retornos_estim_nao_ESG <- retornos_Q3 %>% select(Data, MGLU3, MRFG3, TAEE11, BPAC11, BRAP3) %>% dplyr::filter(Data >= "2016-01-01" & Data <= "2020-06-30")
retornos_backtest_ESG <- retornos_Q3 %>% select(Data, BRDT3, BRFS3, BTOW3, CIEL3, ELET3) %>% dplyr::filter(Data >= "2020-07-01" & Data <= "2021-12-31")
retornos_backtest_nao_ESG <- retornos_Q3 %>% select(Data, MGLU3, MRFG3, TAEE11, BPAC11, BRAP3) %>% dplyr::filter(Data >= "2020-07-01" & Data <= "2021-12-31")
Fazemos os cálculos para ativos ESG e ativos não ESG e plotamos os retornos e tabela de resultados utilizando o Portfolio Analytics
Primeiro, o portfólio ESG
var_ESG <- diag(cov(retornos_estim_ESG[,-1]))
wVT_ESG <- (1/var_ESG)^4/sum((1/var_ESG)^4)
Pesos_wVT_ESG <- as.vector(wVT_ESG)
names(Pesos_wVT_ESG) <- names(wVT_ESG)
Pesos_wVT_ESG
## BRDT3 BRFS3 BTOW3 CIEL3 ELET3
## 0.46988194 0.30411803 0.05128786 0.13031099 0.04440119
Retorno_wVT_ESG <- Return.portfolio(xts(retornos_backtest_ESG[,-1],retornos_backtest_ESG$Data), Pesos_wVT_ESG, rebalance_on = c("quarters"))
names(Retorno_wVT_ESG) <- "Portfólio Volatility Timing ESG"
var_nao_ESG <- diag(cov(retornos_estim_nao_ESG[,-1]))
wVT_nao_ESG <- (1/var_nao_ESG)^4/sum((1/var_nao_ESG)^4)
Pesos_wVT_nao_ESG <- as.vector(wVT_nao_ESG)
names(Pesos_wVT_nao_ESG) <- names(wVT_nao_ESG)
Pesos_wVT_nao_ESG
## MGLU3 MRFG3 TAEE11 BPAC11 BRAP3
## 0.0007094066 0.0006590154 0.9942876617 0.0005961118 0.0037478045
Retorno_wVT_nao_ESG <- Return.portfolio(xts(retornos_backtest_nao_ESG[,-1],retornos_backtest_nao_ESG$Data), Pesos_wVT_nao_ESG, rebalance_on = c("quarters"))
names(Retorno_wVT_nao_ESG) <- "Portfólio Volatility Timing Não ESG"
O retorno dos portfólios:
Nesse primeiro momento, o portfólio não ESG superou com bastante folga os demais ativos.
Primeiro para ativos ESG
retornos_ts_ESG <- cbind(retornos_BRDT3, retornos_BRFS3, retornos_BTOW3, retornos_CIEL3, retornos_ELET3)
Mport <- portfolio.spec( assets = colnames(retornos_ts_ESG))
Mport <- add.constraint( portfolio=Mport, type='box', min = 0, max=1 )
ObjSpec <- add.objective(portfolio=ObjSpec, type="risk_budget_objective",
name="CVaR", max_prisk=0.35,
arguments=list(p=0.95, clean="boudt"))
ObjSpec <- add.constraint(portfolio=ObjSpec, type="weight_sum",
min_sum=0.99, max_sum=1.01)
set.seed(15)
out <- optimize.portfolio(R=retornos_ts_ESG, portfolio=ObjSpec,
optimize_method="DEoptim", search_size=2000,
traceDE=5, itermax=50, trace=TRUE)
## Iteration: 5 bestvalit: 0.062567 bestmemit: 0.328000 0.134000 0.212000 0.328000 0.000000
## Iteration: 10 bestvalit: 0.061926 bestmemit: 0.196115 0.086786 0.242936 0.388000 0.079782
## Iteration: 15 bestvalit: 0.061926 bestmemit: 0.196115 0.086786 0.242936 0.388000 0.079782
## [1] 0.19611527 0.08678622 0.24293592 0.38800000 0.07978212
out$weights
## retornos_BRDT3 retornos_BRFS3 retornos_BTOW3 retornos_CIEL3 retornos_ELET3
## 0.19611527 0.08678622 0.24293592 0.38800000 0.07978212
Agora, em posse dos pesos, calculamos os retornos dos portfólios:
Pesos_CVaR_ESG <- out$weights
names(Pesos_CVaR_ESG) <- c("BRDT3", "BRFS3", "BTOW3", "CIEL3", "ELET3")
Retorno_CVaR_ESG <- Return.portfolio(xts(retornos_backtest_ESG[,-1],retornos_backtest_ESG$Data), Pesos_CVaR_ESG, rebalance_on = c("quarters"))
## Warning in Return.portfolio.geometric(R = R, weights = weights, wealth.index =
## wealth.index, : The weights for one or more periods do not sum up to 1: assuming
## a return of 0 for the residual weights
names(Retorno_CVaR_ESG) <- "Portfólio CVaR ESG"
Repetindo todo o processo, código ocultado para simplificação:
retornos_ts_nao_ESG <- cbind(retornos_MGLU3, retornos_MRFG3, retornos_TAEE11, retornos_BPAC11, retornos_BRAP3)
Mport <- portfolio.spec( assets = colnames(retornos_ts_nao_ESG))
Mport <- add.constraint( portfolio=Mport, type='box', min = 0, max=1 )
ObjSpec <- add.objective(portfolio=ObjSpec, type="risk_budget_objective",
name="CVaR", max_prisk=0.35,
arguments=list(p=0.95, clean="boudt"))
ObjSpec <- add.constraint(portfolio=ObjSpec, type="weight_sum",
min_sum=0.99, max_sum=1.01)
set.seed(15)
out <- optimize.portfolio(R=retornos_ts_nao_ESG, portfolio=ObjSpec,
optimize_method="DEoptim", search_size=2000,
traceDE=5, itermax=50, trace=TRUE)
## Iteration: 5 bestvalit: 0.042325 bestmemit: 0.235591 0.002000 0.512000 0.014000 0.230434
## Iteration: 10 bestvalit: 0.041991 bestmemit: 0.178000 0.064000 0.574000 0.002000 0.176000
## Iteration: 15 bestvalit: 0.041991 bestmemit: 0.178000 0.064000 0.574000 0.002000 0.176000
## Iteration: 20 bestvalit: 0.041773 bestmemit: 0.227539 0.013078 0.528177 0.006263 0.216681
## Iteration: 25 bestvalit: 0.041773 bestmemit: 0.227539 0.013078 0.528177 0.006263 0.216681
## [1] 0.227538768 0.013077593 0.528176803 0.006263268 0.216681143
out$weights
## retornos_MGLU3 retornos_MRFG3 retornos_TAEE11 retornos_BPAC11 retornos_BRAP3
## 0.227538768 0.013077593 0.528176803 0.006263268 0.216681143
Finalmente, calculando o retorno e plotando o gráfico:
Pesos_CVaR_nao_ESG <- out$weights
names(Pesos_CVaR_nao_ESG) <- c("MGLU3", "MRFG3", "TAEE11", "BPAC11", "BRAP3")
Retorno_CVaR_nao_ESG <- Return.portfolio(xts(retornos_backtest_nao_ESG[,-1],retornos_backtest_nao_ESG$Data), Pesos_CVaR_nao_ESG, rebalance_on = c("quarters"))
## Warning in Return.portfolio.geometric(R = R, weights = weights, wealth.index =
## wealth.index, : The weights for one or more periods do not sum up to 1: assuming
## a return of 0 for the residual weights
names(Retorno_CVaR_nao_ESG) <- "Portfólio CVaR Não ESG"
O retorno dos portfólios:
Em uma primeira análise e provavelmente cheia de viéses, principalmente o de seleção de ativos, os considerados ESG underperformaram os ativos não-ESG de forma significativa. Assim, pode-se concluir, somente com os dados utilizados, que não é considerado como um critério quantitativamente interessante na seleção de ativos para compor o portfólio, quando analisado de forma isolada.
Tem-se como aproximação de risco a volatilidade dos retornos dos ativos financeiros líquidos negociados em bolsa. Assim, utilizaria-se da volatilidade para prever em qual estado o índice Ibovespa iria se encontrar, permitindo a venda a descoberto de uma cesta de ativos em momentos de maior volatilidade (e possivelmente correção nos preços) e também a compra em momentos de menor volatilidade (e provavelmente maiores retornos).
Respondendo a questão considerando que se trata da disciplina em si, embora meus desafios e dificuldades sejam bastante similares entre as avaliações, leituras e exercícios.
Acredito que um dos pontos de dificuldade que foram se resolvendo com o tempo era a falta de costume em lidar com as ferramentas presentes no R para a facilitação das análises e também da análise dos resultados por si só. Parte da teoria de finanças que foi aplicada eu desconhecia ou possuía algum conhecimento superficial do que se tratava, não conseguindo exercer uma aplicação prática.
Uma possível análise adicional que poderia ser feita é sobre como melhor estimar os retornos esperandos, tendo em vista que são muito relevantes em algumas das técnicas de otimização. Além disso, estratégias que começam com vários ativos e terminam na seleção de 10 a 15 deles também seriam válidas, embora mais difíceis de serem feitas.