O objetivo da Teoria Moderna de Carteira (TMC) é maximizar o retorno de uma carteira de ativos e, ao mesmo tempo, minimizar o seu risco. Geralmente, sabemos que os maiores retornos vêm acompanhados dos maiores riscos e, portanto, os objetivos de maximizar o retorno, minimizando o risco, são antagônicos. Afinal, por que um investidor se colocaria em uma posição mais arriscada sem qualquer recompensa ou prêmio de risco? Não faria sentido. Verificaremos que aqui, assim como e em muitos aplicações estatísticas nas finanças, o risco é muitas vezes medido por meio de desvio-padrão de retornos, seja o do ativo ou da carteira.
Este tutorial busca apresentar uma “suave” introdução à Teoria Moderna de Carteira. Os únicos conhecimentos estatísticos necessários para a compreensão do modelo são a média, a variância e a covariância. Nada mais, nada menos.
Prêmio de Risco se refere à diferença entre o retorno esperado de um ativo de risco, como uma ação, e aquele de um investimento que podemos basicamente considerar sem risco, ou seja, o retorno ao final do período é de algum modo conhecido ao início deste, como aplicações em CDI ou Letras do Tesouro. Se não houver prémio de risco, não é razoável investir qualquer ativo que não aquele livre de risco.
Suponha que existam N ativos com retornos (variáveis aleatórias) em um determinado período \(\small R_i, i = 1,2, \dots, N\), e \(\small \textbf{R} = (R_1,R_2, \dots, R_N)^T.\)
Os retornos e riscos estimados são, respectivamente:
\[ \begin{aligned} r_i &= E(R_i) \\ \sigma_i &= Var(R_i) \\ Cov(\textbf R )&= \Sigma = (\sigma_{ij})_{1 \leq i,j \leq N} \\ \end{aligned} \]
Assim, podemos montar uma carteira consistindo de N ativos de tal modo que o seu retorno é
\[R_c = \omega_1 R_1 + \dots + \omega_N R_N = \omega^T \textbf R\]
onde \(\small R_c\) é o retorno da carteira e \(\small \omega_i\) é o peso do i-ésimo ativo da carteira, com
\[\sum_{i=1}^N \omega_i = 1\]
Em outras palavras, a carteira é uma combinação linear dos vários ativos considerados. Sem dúvida, a questão principal é: como escolher \(\small \textbf w = (\omega_1 + \dots + \omega_N)^T\) de tal forma que os retornos esperados sejam maximizados enquanto minimizamos o risco?
Um ponto técnico a ser colocado aqui é que, enquanto \(\small \sum_{i=1}^N \omega_i = 1\), não há restrições nos \(\small \omega_i\) individuais, como não negatividade. Na verdade, um \(\small \omega_i\) negativo implica uma posição curta no i-ésimo ativo, ou seja, uma venda curta. Isso está em constraste com uma posição longa, ou seja, comprar o i-ésimo ativo. Neste tutorial, só vamos considerar pesos positivos.
Manter uma posição longa em um ativo específico significa simplesmente comprar este ativo. Por outro lado, a venda a descoberto (curta) é onde se vende um ativo sem possuí-lo em primeiro lugar. O ativo, por exemplo, uma ação, é emprestado por um corretor ou por outro cliente da corretora. Em um momento posterior, uma ação deve então ser comprada de volta do mercado e, em seguida, devolvida ao credor. Isso fecha a posição curta, e a ideia é que se alguém for capaz de vender as ações emprestadas a um preço mais alto e devolvê-la a um preço mais baixo, há lucro no negócio.
As seguintes expressões calculam o retorno esperado e a variância (amostral) de uma carteira
\[ \begin{aligned} E(R_c) &= \sum_i \omega_i \, E(R_i) = \textbf w^T E(\textbf R) \\ \\ Var(R_c) &= \sum_i \omega_i^2 \,\sigma_i^2 \, + \, \sum_{i \neq j} \omega_i \, \omega_j \, \sigma_{ij} \end{aligned} \]
onde \(\small \sigma_{ij}\) é a covariância entre o i-ésimo e o j-ésimo ativo.
A variância da carteira também pode ser descrita como
\[Var(R_c) = \sum_i \sum_j \omega_i \, \omega_j \, \sigma_i \, = \textbf w^T \Sigma \, \textbf w\]
Para obtermos os preços diários usaremos a função getSymbols() do pacote quantmod. Isso retorna um objeto com o preço de abertura, o preço de fechamento, o preço ajustado, o maior preço, o menor preço e o volume diário para cada ativo. Para isolarmos o preço ajustado, usamos a função map() do pacote purrr e aplicamos a função Ad(get(.)) aos preços importados. Isso vai obter (get()) o preço ajustado de cada uma de nossas séries de preços individuais. Se quiséssemos o preço de fechamento, poderíamos utilizar Cl(get(.)). O ‘.’ se refere ao nosso objeto inicial, devido ao emprego do operador pipe %>%.
Se pararmos neste ponto já teremos os preços diários para os ativos, mas o formato não seria ótimo, pois teríamos uma lista de objetos da classe xts. Isso ocorre porque a função map() retorna uma lista por padrão. A função reduce(merge) irá mesclar as listas em um único objeto xts. A função merge() procura o índice de data compartilhado pelos objetos e usa este índice para alinhar os dados.
library(tidyverse)
library(tidyquant)
## Seleciona as ações
acoes <- c('EMBR3.SA', 'ABEV3.SA', 'ITUB4.SA', 'PETR3.SA')
## Período da análise
inicio <- '2015-01-01'
fim <- as.character(Sys.Date() - 1) # Ontem
precos <-
getSymbols(acoes,
src = 'yahoo', # Busca os dados no sítio 'Yahoo Finance'
from = inicio,
to = fim,
auto.assign = TRUE,
warnings = FALSE) %>%
map(~Ad(get(.))) %>%
reduce(merge) %>%
`colnames<-`(acoes) # Altera os nomes das colunas para os símbolos das ações
retornos_mensais_dplyr <-
precos %>%
to.monthly(indexAt = "lastof", OHLC = FALSE) %>%
# converte o 'index' para uma coluna 'data' em um data frame
data.frame(data = index(.)) %>%
# agora, remove o index, uma vez que virou nome de linha (row names)
remove_rownames() %>%
# pivot_longer() é a versão mais recente de gather()
pivot_longer(-data, names_to = 'ativo', values_to = 'preco') %>%
# agrupa os dados por ativo
group_by(ativo) %>%
# calcula os retornos logarítimicos e adiciona a coluna 'retorno'
mutate(retorno = (log(preco) - log(lag(preco)))) %>%
# remove os preços, por desnecessários
select(-preco) %>%
# pivot_wider() é a versão mais recente de spread()
pivot_wider(names_from = ativo, values_from = retorno) %>%
# seleciona apenas as datas e retornos de todos os ativos em 'simbolos'
select(data, all_of(acoes))
retornos_mensais_dplyr <-
retornos_mensais_dplyr %>%
na.omit()
retornos_mensais_dplyr
(covariancia <- cov(retornos_mensais_dplyr[, 2:ncol(retornos_mensais_dplyr)]))
## EMBR3.SA ABEV3.SA ITUB4.SA PETR3.SA
## EMBR3.SA 0.015635038 0.002147361 0.002645668 0.003763784
## ABEV3.SA 0.002147361 0.005080619 0.002837890 0.003775467
## ITUB4.SA 0.002645668 0.002837890 0.008267930 0.009346770
## PETR3.SA 0.003763784 0.003775467 0.009346770 0.021142074
Consideremos, por simplicidade, uma carteira com ativos distribuídos igualmente, ou seja, todos os pesos (participação na carteira) são iguais.
(pesos <- rep(1/length(acoes), length(acoes)))
## [1] 0.25 0.25 0.25 0.25
Neste caso, podemos calcular o retorno esperado e o desvio-padrão da carteira como acima:
retornos_medios <- colMeans(retornos_mensais_dplyr[, 2:ncol(retornos_mensais_dplyr)])
retornos_medios
## EMBR3.SA ABEV3.SA ITUB4.SA PETR3.SA
## -0.0020865207 0.0004324177 0.0080585072 0.0207407751
retorno_carteira <- t(pesos) %*% retornos_medios
dp_carteira <- sqrt(t(pesos) %*% covariancia %*% pesos)
glue::glue('Retorno esperado da carteira = {round(retorno_carteira *100, 4)}%, ','\n', 'Desvio-padrão = {round(dp_carteira*100, 4)}%')
## Retorno esperado da carteira = 0.6786%,
## Desvio-padrão = 7.8724%
Como ilustração, poderíamos, também, utilizar o pacote PerformanceAnalytics para calcular o desvio-padrão da carteira. Antes, é necessário converter o objeto da classe tibble em ts.
dp_carteira_PA <- PerformanceAnalytics::StdDev(as.ts(retornos_mensais_dplyr[,2:ncol(retornos_mensais_dplyr)]),
weights = pesos)
glue::glue('Desvio-padrão = {round(dp_carteira_PA*100, 4)}%')
## Desvio-padrão = 7.8724%
Todos nós sabemos que “não devemos colocar todos os ovos em uma só cesta” e, ao mesmo tempo, termos uma carteira diversificada. Intuitivamente, sabemos que, se colocarmos todo nosso dinheiro em uma única ação, estamos apostando muito nesse único ativo. Entretanto, a aversão à perda ditaria que preferimos minimizar o risco de perder tudo em uma única ação.
Nesse sentido, o que a diversificação faz com uma carteira é buscar tornar o risco da carteira o mínimo possível. Embora o retorno médio de uma carteira dependa da média de retorno dos ativos individuais e de seus respectivos pesos, o risco da carteira depende tanto do risco dos ativos individuais quanto das relações de cada ativo com os demais, em termos de correlações. Isso significa que colocar uma mistura certa de pesos e ativos reduz o risco da carteira - uma ideia fundamental na teoria da carteira. A diversificação, por meio do investimento em múltiplos ativos, reduz os riscos.
Vamos considerar dois exemplos.
Suponha que há dois ativos com retornos \(\small R_1\) e \(\small R_2\), com a mesma média e variãncia:
\[ \begin{aligned} E(R_1) &= E(R_2) = \mu \\ Var(R_1) &= Var(R_2) = \sigma^2 \end{aligned} \]
Além disso, \(\small R_1\) e \(\small R_2\) são não-correlacionados, isto é, \(\small \rho_{12} = 0.\)
Investir 100% em qualquer dos dois ativos daria o mesmo resultado em termos de retorno e risco. Agora, considere uma carteira com uma combinação dos dois ativos. Seja \(\small \omega\) o peso (ou a proporção) para \(\small R_1\). Então, o peso de \(\small R_2\) seria necessariamente \(\small 1- \omega\). Nesta carteira teríamos
\[E(R_c) = \omega \, E(R_1) + (1-\omega) \, E(R_2) = \omega \mu + (1-\omega) \mu = \mu\]
Ou seja, neste caso simples o retorno da carteira não depende dos pesos. No entanto, uma vez que os ativos são não-correlacionados, teríamos
\[ Var(R_c) = \omega^2 \, Var(R_1) + (1-\omega)^2 \, Var(R_2) - Cov(R_1, \, R_2)\]
onde \(\small Cov(R_1, \, R_2) = 0\), o que torna
\[ Var(R_c) = (\omega^2 + (1-\omega)^2 ) \, \sigma^2\]
Para qualquer valor \(\small 0 < \omega < 1\) teríamos \(\small Var(R_c) < \sigma^2\), sendo o mínimo valor obtido quando \(\small \omega = \frac 1 2\) e \(\small Var(R_c) = \frac {\sigma^2} {2}\).
Consideremos um cenário parecido, mas agora os ativos são correlacionados, ou seja, \(\small -1 \le \rho_{12} \le 1\) e \(\small \rho_{12} \neq 0\)
Se fizermos \(\small \omega = \frac 1 2\), isto é, o mesmo peso para os dois ativos, já sabemos que o retorno da carteira será igual a \(\small \mu\). Lembrando que, neste caso, \(\small Cov(R_1, \,R_2) = \rho_{12}\, \sigma^2\), o cálculo da variância da carteira dá:
\[Var(R_c) = \frac 1 2 \,(1+\rho_{12})\, \sigma^2\]
Note que, para qualquer valor \(\small -1 \le \rho_{12} \le 1\), \(\small Var(R_c) \le \sigma^2\).
Especificamente, \(\small \forall \rho_{12} < 0, \, Var(R_c) < \frac 1 2 \,\sigma^2\) e \(\small \forall \rho_{12} > 0, \, Var(R_c) > \frac 1 2 \,\sigma^2\), isto é, o risco da carteira diminui quando temos ativos negativamente correlacionados.
Como vimos, o objetivo é selecionar uma carteira com o máximo retorno esperado, \(E(R_c)\), para o mínimo risco \(Var(R_c)\). Iniciamos com N = 2, isto é, uma carteira com apenas dois ativos. Neste caso, teríamos
\[ \begin{aligned} E(R_c) &= \omega_1 E(R_1) + \omega_2 E(R_2)\\ Var(R_c) &= \omega_1^2 \sigma_1^2 + \omega_2^2 \sigma_2^2 + 2\omega_1 \omega_2 \rho_{12} \sigma_1 \sigma_2\\ \omega_1 + \omega_2 &= 1, \, \omega_2 = 1-\omega_1 \end{aligned} \]
Se considerarmos que \(\omega\) é o peso de \(R_1\), então temos \(1 - \omega\) como o peso de \(R_2\), e podemos simplificar a expressão acima.
\[ \begin{aligned} E(R_c) &= \omega \mu_1 + (1-\omega) \mu_2\\ Var(R_c) &= \omega^2 \sigma_1^2 + (1-\omega)^2 \sigma_2^2 + 2\omega (1-\omega) \rho_{12} \sigma_1 \sigma_2\\ \end{aligned} \]
Note que \(\small \mu_1, \mu_2, \sigma_1, \sigma_2 \; \text e \; \rho_{12}\) são considerados constantes e conhecidos, mas foram calculados a partir de dados históricos, na esperança que isso venha a se manter no futuro.
Buscamos, agora, descobrir o valor de \(\small \omega\) para que \(E(R_c)\) seja maximizado, enquanto \(\small Var(R_c)\) seja minimizado.
Vejamos um exemplo:
# retornos esperados, desvios-padrão e correlação de dois ativos
mu1 <- 0.2
mu2 <- 0.1
sigma1 <- 0.1
sigma2 <- 0.05
rho12 <- 0.25
# calcula retorno e risco em função de w
calc_retorno <- function(w){
return(w*mu1 + (1-w)*mu2)
}
calc_risco <- function(w){
return(w^2*sigma1^2 + (1-w)^2*sigma2^2 + 2*w*(1-w)*rho12*sigma1*sigma2)
}
# os pesos variam entre -1 e 1; aqui também consideramos posições curtas para ilustração
pesos <- seq(-1, 1, by = 0.01)
retornos <- NULL
riscos <- NULL
for(w in pesos){
retornos <- c(retornos, calc_retorno(w))
riscos <- c(riscos, calc_risco(w))
}
plot(riscos, retornos, col = 'blue', type = 'line',
xlab = "Risco da Carteira",
ylab = "Retorno da Carteira",
main = "Relação Retorno-Risco")
Observe a figura acima.
Naturalmente, para um dado risco que aceitamos assumir, gostaríamos de obter o maior retorno possível. Portanto, qualquer combinação de risco-retorno que pertença à metade superior do gráfico repesenta uma carteira válida, em comparação com a metade inferior. Em particular, cada combinação na metade superior do gráfico é considerada como uma carteira eficiente. Neste ponto, também podemos querer saber qual é a carteira ou peso que propicia os menores riscos. Esta carteira também é conhecida como a carteira de mínima variância.
Carteiras eficientes estão na fronteira eficiente, a metade superior do nosso gráfico. Por definição, a fronteira eficiente consiste em carteiras de tal forma que, para cada uma dessas carteiras e seus respectivos retornos, não há outras carteiras que possuam menor risco para um determinado retorno (neste sentido, eficiente). A carteira de mínima variância é um caso especial de uma carteira eficiente - nenhuma outra carteira possui um risco menor do que ela, e está localizada no ponto mais à esquerda do gráfico.
peso_min_risco <- pesos[which(riscos == min(riscos))]
retorno_min_risco <- mean(calc_retorno(peso_min_risco))
ind_eficiente <- which(retornos >= retorno_min_risco)
ind_ineficiente <- which(retornos < retorno_min_risco)
plot(riscos[ind_eficiente], retornos[ind_eficiente], col = 'blue', type = 'line',
xlab = "Risco da Carteira",
ylab = "Retorno da Carteira",
main = "A fronteira Eficiente",
ylim = c(0,0.2), xlim = c(0.002, 0.01))
lines(riscos[ind_ineficiente], retornos[ind_ineficiente], lty = "dotted", col = 'red')
abline(h = retorno_min_risco)
text(x = 0.0032, y = retorno_min_risco-0.01, "Carteira de Min-Variância")
text(x = 0.006, y = 0.15, "fronteira eficiente")
No exemplo acima, chegamos à carteira de mínima variância fazendo alguns cálculos simples. Um método mais robusto seria chegar a ela de forma analítica, tratando o problema como um problema de otimização, minimizando \(\small Var(R_c)\). Isso pode ser feito por meio de um cálculo de derivadas, como a seguir:
\[ \begin{aligned} Var(R_c) &= \omega^2 \sigma_1^2 + (1-\omega)^2 \sigma_2^2 + 2 \omega(1- \omega) \rho_{12}\sigma_1 \sigma_2\\ \\ \frac {d \, Var(R_c)}{d \omega} &= 2\omega \sigma_1^2 - 2 (1-\omega) \sigma_2^2 + 2 (1-2\omega) \rho_{12} \sigma_1 \sigma_2\\ \end{aligned} \] Se \(\rho _{12} < 1\) (o que acontece quase sempre!), então
\[\frac {d^2 \, Var(R_c)}{d \omega^2} = 2 \sigma_1^2 + 2 \sigma_2^2 - 4 \rho_{12}\sigma_1 \sigma_2 \; \ge \; 2 \sigma_1^2 + 2 \sigma_2^2 - 4 \sigma_1 \sigma_2 = 2(\sigma_1 - \sigma_2)^2 \ge 0\]
Como a derivada segunda é sempre positiva, a solução de \(\frac {d \, Var(R_c)}{d \omega}\) minimiza \(\small Var(R_c)\).
A solução é
\[\omega \equiv \omega_{minvar} = \frac {\sigma_2^2 - \rho_{12} \sigma_1 \sigma_2}{\sigma_1^2 + \sigma_2^2 - 2 \rho_{12} \sigma_1 \sigma_2}\] e
\[1 - \omega_{minvar} = \frac {\sigma_1^2 - \rho_{12} \sigma_1 \sigma_2}{\sigma_1^2 + \sigma_2^2 - 2 \rho_{12} \sigma_1 \sigma_2}\]
É sempre possível não investir todo o capital em ativos de risco, e podemos incluir ativos livres de risco como parte de nossa estratégia de investimento. Em particular, poderíamos ter \(\small \omega_1 + \omega_2 < 1\), e \(\small 1 - \omega_1 - \omega_2\) sendo a porção não investida em ativos de risco (ações, por exemplo), mas em vez disso aplicada em ativos livres de risco. O resultado natural é uma redução da variância da carteira e, quase certamente, a redução do retorno.
Como apontado acima, os ativos livres de risco são simplesmente ativos que são geralmente considerados 100% seguros (ainda que isso seja apenas uma expectativa), como dinheiro em uma conta remunerada, Títulos do Tesouro ou Fundos de Renda Fixa.
Consideremos uma constante \(R_f\) como o retorno do ativo livre de risco. Neste caso, \(\small E(R_f) = \mu_{rf}\) é, normalmente, pequena em comparação com os \(R_i\), mas pode ser bastante útil para controlar a variância da carteira, por meio do ajuste do valor \(\small 1 - \omega_1 - \omega_2\). Note, também, que todos os ativos de risco são não-correlacionados com \(\small R_f\).
Consideremos a combinação de apenas um ativo de risco com o ativo livre de risco, chamado a partir de agora de renda fixa. Seja \(\small \omega\) o peso do ativo de risco, com retorno \(\small \mu_R\) e variância \(\small \sigma_R^2\). Essa carteira teria os seguintes parãmetros:
\[ \begin{aligned} E(R_c) = \mu_c &= \omega \mu_R + (1-\omega) \mu_{rf}\\ Var(R_c) = \sigma_c^2 &= \omega^2 \sigma_R^2 \; \Rightarrow \; \sigma_c = \omega \sigma_R \end{aligned} \]
Note que a variância da carteira é uma simples função de \(\small \omega\), isto é, resolvendo diretamente a equação \(\small \sigma_c^2 = \omega^2 \sigma_R^2\) temos \(\small \omega = \frac {\sigma_c}{\sigma_R}\). Isso nos permite escrever a seguinte relação entre o retorno da carteira (\(\small \mu_c\)) e o desvio-padrão (\(\small \sigma_c\)):
\[\mu_c = \mu_{rf} + \frac {\mu_R - \mu_{rf}}{\sigma_R} \sigma_c\]
# retornos esperados, desvios-padrão e renda-fixa
mu_R <- 0.2
mu_rf <- 0.04
sigma_R <- 0.1
# calcula retorno e risco em função de w
cal_ret_carteira <- function(w){
return(w*mu_R + (1-w)*mu_rf)
}
cal_pf_sd <- function(w){ # desvio-padrão
return(w*sigma_R)
}
pesos <- seq(0, 1, by = 0.01)
retornos <- NULL
riscos <- NULL
for(w in pesos){
retornos <- c(retornos, cal_ret_carteira(w))
riscos <- c(riscos, cal_pf_sd(w))
}
plot(riscos, retornos, type = 'line', col = 'blue',
xlab = "Desvio-padrão",
ylab = "Retorno",
main = "Relação Retorno-Risco")
Seja \(\small \omega_1\) e \(\small \omega_2\) os pesos dos dois ativos de risco e \(\small \omega_{rf}\) o peso da renda-fixa. Como há dois ativos de risco, devemos, também considerar o coeficiente de correlação linear \(\small \rho_{12}\). A carteira, nesse caso, teria os seguintes valores:
\[ \begin{aligned} \mu_c &= \omega_1 \mu_{R_1} + \omega_2 \mu_{R_2} + (1-\omega_1 - \omega_2) \mu_{rf}\\ \sigma_c^2 &= \omega_1^2 \sigma_1^2 + \omega_2^2 \sigma_2^2 + 2 \omega_1 \omega_2 \rho_{12} \sigma_1 \sigma_2 \\ \omega_{rf} &= 1- \omega_1 - \omega_2 \end{aligned} \]
Podemos escrever a equação para o retorno da carteira como:
\[\mu_c = (1-\omega_{rf})(\bar \omega_1 \, \mu_1 + \bar \omega_2 \, \mu_2) + \omega_{rf} \, \mu_{rf}\] onde
\[ \begin{aligned} \bar \omega_1 &= \frac {\omega_1}{1-\omega_{rf}}\\ \bar \omega_2 &= \frac {\omega_2}{1-\omega_{rf}}\\ \\ \bar \omega_1 &+ \bar \omega_2 = 1 \end{aligned} \]
Com esse enfoque, podemos considerar a seleção da carteira mixta como um problema de duas etapas. Primeiro, construímos uma carteira baseada apenas em ativos de risco (por exemplo, apenas escolhendo \(\small \omega_1 \; \text e \; \omega_2\)). Em seguida, incluímos a renda fixa escolhendo \(\small \omega_{rf}\). Assim, ganhamos uma ferramenta interessante no controle do risco que assumimos, pela inclusão do ativo livre de risco - uma vez que sua inclusão sempre diminui o risco de carteira, independentemente dos ativos de risco que escolhermos.
Observe, também, que uma vez concluída a primeira etapa, estamos efetivamente lidando com um ativo de risco e um ativo livre de risco novamente, com o “ativo de risco único” sendo uma combinação de dois ativos de risco, com pesos \(\bar \omega_1 \; \text e \; \bar \omega_2\).