Explicando a variância de um portfólio de investimentos

A variância de um portfólio de investimento mensura a volatilidade de uma cesta de ativos financeiros. É interessante conhecer a contribuição de cada ativo para a volatilidade total da carteira, portanto, no post de hoje iremos mostrar como construir um código em R para mensurar essa medida.

Portfólio de investimentos

Um portfólio de investimentos é constituído por um conjunto de dois ou mais ativos, cada qual possuindo um peso ou porcentagem em relação ao total do portfólio, escolhidos de forma discricionária ou com base em fundamentos financeiros ou estatísticos.

O portfólio e os ativos financeiros que o compõem são mensurados em termos de retornos financeiros, definidos de acordo com a seguinte equação:

Para os ativos individuais:

    $$R_i = \frac{P_t - P_{t-1}}{P_{t-1}}$$

E para o portfólio:

    $$R_p = \sum_{i=1}^n(W_iR_i)$$

Vemos que o retorno histórico do portfólio é dado com base nos retornos dos ativos ponderados pela suas proporções em relação ao total do portfólio (peso).

Vamos calcular o retorno histórico dos ativos do portfólio usando o R. Vamos definir quatro ações escolhidas de forma aleatória, durante o período de 01/2016 a 06/2022, coletando os dados através do Yahoo Finance, calculando os retornos individuais e em seguida construindo um portfolio Equal Weighted Portfolio (pesos iguais).


library(quantmod)
library(PerformanceAnalytics)
library(xts)
library(tidyverse)

</pre>
# Tickers das ações
symbols <- c("MGLU3.SA", "ABEV3.SA", "ITUB4.SA", "WEGE3.SA")

# Datas
start = "2016-01-01" # início
end = "2022-07-01" # fim

# Define o enviroment para salvar os objetos de preços
env <- new.env()

# Coleta os preços das ações
getSymbols(symbols, # tickers
src = 'yahoo', # fonte
from = start, # início
to = end, # fim
env = env, # env dos objetos
auto.assign = TRUE) # declara automaticamente

# Junta os dados dos preços
prices <- do.call(merge, lapply(env, Ad))

# Renomeia as colunas
colnames(prices) <- c(symbols)

# Transforma de diário para mensal
prices_monthly <- to.monthly(prices, indexAt = "first", OHLC = FALSE)

# Calcula os retornos
returns <-
na.omit(Return.calculate(prices_monthly, method = "discrete"))

# Define a alocação dos ativos (pesos EWP)
w = rep(1, length(symbols)) / length(symbols)

# Calcula os retornos do portfólio
return_port <- Return.portfolio(returns, weights = w)
<pre>

O retorno histórico possibilita o cálculo de diversos parâmetros, como no caso, da variância ou desvio padrão histórico do portfólio, representando uma medida de volatilidade.

Volatilidade do portfólio

Como dito, a volatilidade é definida de acordo com a variância ou desvio padrão do portfólio, entretanto, ao invés da fórmula usual que conhecemos do desvio padrão dos retornos históricos do ativo (vamos definir volatilidade apenas como o desvio padrão), dado por:

    $$\sigma_{i} = \sqrt{\frac{(E[(R_i - \mu)^2])}{T-1}}$$

Ela não representaria de fato a variância do portfólio. Isso ocorre devido ao fato de que temos que levar em consideração que temos um conjunto de diferentes ativos na carteira, e isso leva a crer que esses ativos podem representar uma relação linear positiva ou negativa entre eles, o que pode de fato reduzir a volatilidade da carteira. Para representar essa questão, portanto, deve-se adicionar a formula a correlação/covariância entre os ativos que compõem a carteira, bem como os seus pesos relativos no portfólio para representar a variância (volatilidade) do portfólio. Portanto, utiliza-se a seguinte equação

    $$\sigma_{p}=\sqrt{\sum_{j=1}^N(w_j^2 \sigma_j^2)+\sum_{j=1}^N\sum_{\substack {k=1 \\ k \neq j}}^N(w_j w_k \sigma_{jk})}$$

# Calcula a volatilidade do portfólio (desvio-padrão) -------------

## Na mão
covariance_matrix <- cov(returns) # matriz de covariância

sd_portfolio <- sqrt(t(w) %*% covariance_matrix %*% w) # desvio padrão do portfólio

# Usando função pronta
port_sd <- StdDev(returns,
weights = w)

Desta forma, temos a medida de volatilidade da carteira, que pode trazer informações valiosas, entretanto, seria também interessante saber a contribuição de cada ativo para a volatilidade total do portfólio.

Contribuição para a volatilidade

A contribuição para a volatilidade fornece uma decomposição ponderada da contribuição de cada elemento do portfólio para o desvio padrão de todo o portfólio.

Em termos formais, é definida pelo nome de contribuição marginal, que é basicamente a derivada parcial do desvio padrão do portfólio em relação aos pesos dos ativos. A interpretação da fórmula da contribuição marginal, entretanto, não é tão intuitiva, portanto, é necessário obter medidas que possibilitem analisar os componentes. Veremos portanto como calcular os componentes da contribuição e a porcentagem da contribuição.

1 - Contribuição Marginal

A contribuição marginal é calculada conforme:

    $$ MCR = \frac{\sigma_{jk} \times w}{\sigma_{p}}$$

É possível calcular no R da seguinte forma:

# Contribuição da volatilidade -----------------------

## Cálculo a mão

# Contribuição Marginal de cada ativo
marginal_contribution <- w %*% covariance_matrix / sd_portfolio[1, 1]

2 - Componentes da Contribuição

Os Componentes da Contribuição é calculada conforme:

     $$CR = MCR * w$$

É possível calcular no R da seguinte forma:

# Contribuição dos componentes
component_contribution <- marginal_contribution * w 

# A soma deve ser igual ao total do portfólio
components_summed <- rowSums(component_contribution)

3 - Porcentagem da Contribuição

A Porcentagem da Contribuição é calculada conforme:

    $$ PCR = CR / \sigma_{p} $$

É possível calcular no R da seguinte forma:

# Contribuição percentual dos componentes
component_percentages <- component_contribution / sd_portfolio[1, 1]

É possível calcular diretamente por meio da função StdDev do pacote {PortfolioAnalytics}, usando o argumento portfolio_method = "component".

## Cálculo com a função pronta ---------------------------

port_cont <- StdDev(retunrs,
weights = w,
portfolio_method = "component")

Visualizando os dados

O interessante dos resultados é a sua visualização para entender a dinâmica da contribuição do risco do portfólio. Portanto, iremos transformar os dados em tibble e em seguida, usaremos o {ggplot2} para visualizar os resultados.

## Visualização -------

# Transforma em tibble

cont_by_hand <-
tibble(symbols, w, as.vector(component_percentages)) %>%
rename(asset = symbols,
'Pesos dos Ativos' = w,
'Contribuição para a Volatilidade' = `as.vector(component_percentages)`)

# Visualiza

cont_by_hand %>%
pivot_longer(names_to = "type", values_to = "values", -asset) %>%
ggplot()+
aes(x = asset, y = values, fill = type)+
geom_col(position = "dodge")+
scale_y_continuous(labels = scales::percent)+
labs(title = "Contribuição para a Volatilidade",
subtitle = "Medido em termos de desvio-padrão - Período de 01/2016 até fim de 06/2022",
x = "",
y = "",
caption = "Elaborado por analisemacro.com.br")+
scale_fill_manual(values = c("#282f6b", "#b22200"),
name = "")+
theme_minimal(legend.position = "bottom")

______________________________________

Quer saber mais?

Veja nossa trilha de Finanças Quantitativas.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Análise do Censo Demográfico com o R

Como podemos analisar dados do Censo Demográfico para produzir pesquisas e implementar políticas públicas? Mostramos nesta postagem o resultado de uma breve análise dos dados preliminares do Censo Demográfico de 2022 usando o R.

Deploy de modelos com Python + Shinylive + GitHub gastando ZERO reais

Colocar modelos em produção pode ser um grande desafio. Lidar com custos monetários, infraestrutura operacional e complexidades de códigos e ferramentas pode acabar matando potenciais projetos. Uma solução que elimina todos estes obstáculos é a recém lançada Shinylive. Neste artigo mostramos um exemplo com um modelo de previsão para o preço do petróleo Brent.

Como automatizar tarefas repetitivas usando Python? Um exemplo para largar o Excel

Manter relatórios diários com dados e análises atualizados é um desafio, pois envolve várias etapas: coleta de dados, tratamento de informações, produção de análises e atualização de relatório. Para superar este desafio algumas ferramentas como Python + Quarto + GitHub podem ser usadas para automatizar tudo que for automatizável. Neste artigo mostramos um exemplo com dados do mercado financeiro.

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.