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

Estimando a volatilidade da taxa de câmbio

O que é Volatilidade? Como podemos calcular essa métrica? Este artigo apresenta uma breve introdução à volatilidade, descreve como podemos calcular a volatilidade utilizando Modelos de Volatilidade Condicional e demonstra a aplicação prática dessa abordagem para estimar a volatilidade da taxa de câmbio BRL/USD por meio da linguagem de programação Python.

Como analisar o Núcleo de Inflação no Brasil usando Python?

O Python se destaca como uma ferramenta robusta para análise de dados, permitindo a aplicação de uma ampla gama de técnicas em dados econômico-financeiros. Neste exercício, destacamos como a linguagem oferece uma facilidade muito grande na coleta de dados dos núcleos do IPCA diretamente do site do Banco Central, na manipulação eficiente desses dados e na construção de gráficos que facilitam a compreensão dos indicadores.

Propensity Score com Múltiplas Variáveis no R

O escore de propensão é provavelmente a maneira mais comum de agregar múltiplas variáveis de correspondência em um único valor que pode ser correspondido, ou seja, muito útil para a realização de pareamento.

O escore de propensão é a probabilidade estimada de que uma determinada observação teria sido tratada. A correspondência de escore de propensão muitas vezes significa selecionar um conjunto de observações de controle correspondidas com valores semelhantes do escore de propensão.

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.