Construindo seu primeiro portfólio de ativos no R - TC

TC School / Finanças e Programação

Construindo seu primeiro portfólio de ativos no R

20/10/2021 às 11:43

Lucca Carlini

No último texto da nossa série de introdução ao R, vimos como aplicaro Capital Pricing Asset Model a certos ativos. No texto de hoje, vamos ver como construir o primeiro portfólio de ativos no R e realizar as mais diversas operações com ele.

  • O que é um portfólio?
  • Iniciando a construção do portfólio
  • Juntando os dois data frames para calcular a performance do portfólio
  • Obtendo a tabela do CAPM para o portfólio pela função tq_performance
  • Calculando o Índice de Sharpe do portfólio no R
  • A evolução do patrimônio com o tempo
  • Conclusão

Boa leitura!

O que é um portfólio?

Um portfólio é um conjunto de ativos financeiros como ações, títulos públicos, commodities, fundos imobiliários, fundos de investimento e ETFs. Também é popularmente conhecido como “carteira” de investimentos. Vamos então aprender a construir o nosso primeiro portfólio e a testar as principais métricas de risco com o mesmo.

Preparação

Assim como no texto passado, vamos usaremos as bibliotecas tidyquant e PerformanceAnalytics, fundamentais para a construção e manipulação do portfólio.

Tidyquant

O tidyquant integra uma série de pacotes fundamentais para trabalharmos com dados financeiros: zoo, xts, quantmod, TTR, ggplot2 e PerformanceAnalytics.

PerformanceAnalytics

O pacote PerformanceAnalytics integra uma série de funções econométricas focadas em análise de risco. Com o pacote, podemos calcular o CAPM através de apenas uma função.

Instalando os pacotes necessários e importando as bibliotecas

Novamente, vamos usar a função install.packages() para instalar pacotes e a função library() para carregá-los:

> install.packages(“tidyquant”)

> install.packages(“PerformanceAnalytics”)

> library(tidyquant)

> library(“PerformanceAnalytics”)

Iniciando a construção do portfólio

Todo bom portfólio é diversificado em sua composição, tendo diversas classes de ativos. Para fins de simplificação, criarei um portfólio contendo duas classes de ativos: Ações e Fundos de Índice.

Para baixar os dados históricos destes ativos, usaremos a função tq.get() que puxa os dados do Yahoo Finance. 

A primeira coisa a se fazer é criar um vetor que armazena todos os ativos do portfólio em questão. Vamos então supor que o nosso portfólio será composto por:MGLU3, WEGE3,POSI3,WIZS3,VIIA3,TASA4, FESA4, SMALL11 e BOVA11.

Lembrando que no Yahoo Finance todos os tickers nacionais possuem “.SA” no fim.

acoes_v <- c(“MGLU3.SA”, “WEGE3.SA”, “POSI3.SA”, “WIZS3.SA”, “VIIA3.SA”,

             “FESA4.SA” , “TASA4.SA”, “SMAL11.SA”, “BOVA11.SA”) 

Agora, para constituir o portfólio precisaremos criar um vetor contendo o peso de cada uma de nossas posições.

Vamos supor que o nosso position sizing seria:

  • MGLU3 – 4%
  • WEGE3 – 6%
  • POSI3 – 13%
  • WIZS3 – 20%
  • VIIA3 – 5%
  • FESA4 – 7%
  • TASA4 – 25%
  • SMALL11 – 10%
  • BOVA11 – 10%

Construindo o vetor peso:

Vetor_peso <- c(0.04, 0.06, 0.13, 0.2, 0.05, 0.07, 0.25, 0.1, 0.1)

Note duas coisas importantes:

  1. A soma dos pesos precisa dar um (ou 100%)
  2. É necessário que a ação e seu peso correspondente estejam na mesma posição de seus respectivos vetores.

sum(Vetor_peso)

[1] 1

Vamos, então, baixar as ações presentes no vetor acima com a função tq_get(), baixarei os dados desde a data 01/01/2019 até o dia de hoje (Sys.Date), e as ações serão organizadas no data frame pelo seu ticker (symbol).

acoes_df <- tq_get(acoes_v,

from = “2019-01-01”,

to = Sys.Date(),

get = “stock.prices”) %>%

group_by(symbol)

Feito! Baixamos os retornos das ações e anexamos a um data frame. Precisamos agora dos retornos diários das ações para calcular os retornos acumulados. 

retorno acumulado do portfólio

Para calcular os retornos, usaremos a função tq_transmute():

ret_acoes <- acoes_df %>%

  tq_transmute(select = adjusted,

mutate_fun = periodReturn,

 period = ‘daily’,

col_rename = ‘ret’)

Agora, temos todo um data frame contendo os retornos diários das ações do nosso (futuro) portfólio:

portfólio de ações no r

Agora, que temos os retornos diários de todas as ações que queremos, vamos juntá-los num portfólio. Para isso, usaremos a função tq_portfolio() presente no tidyquant.

retornos_diarios_portfolio <- ret_acoes %>%

  tq_portfolio(assets_col  = symbol, 

returns_col = ret, 

weights     = Vetor_peso, 

col_rename  = “Ra”)

retornos_diarios_portfolio

portfolio de ações no programa r

Agora já temos o retorno diário do nosso portfólio desde 2019. Precisaremos agora compará-los com um benchmark. Vamos então comparar com o Ibovespa no período.

ibov_df <- tq_get(“^BVSP”,

from = “2019-01-01”,

to = Sys.Date(),

get = “stock.prices”) %>%

  group_by(symbol)

log_ret_ibov <- ibov_df %>%

  tq_transmute(select = adjusted,

mutate_fun = periodReturn,

period = ‘daily’,

col_rename = ‘Rm’)

Feito! Agora temos os retornos também do Ibovespa:

retorno ibovespa

Como podem ver, o nosso data frame possui 3 colunas, diferente do data frame do portfólio. Vamos então apagar a primeira coluna do data frame acima:

> retornos_diarios_ibov <- ret_ibov[,-1]

> retornos_diarios_ibov

Juntando os dois data frames para calcular a performance

Para juntar os dois data frames em um só, usaremos a função left_join() e juntamos ambos pela coluna em comum, “date”.

df_portfolio_perf <- left_join(retornos_diarios_portfolio, 

retornos_diarios_ibov,

by = “date”)

df_portfolio_perf

performance do portfolio

Obtendo a tabela do CAPM com o R pela função tq_performance

Vamos então obter a tabela do CAPM através da função tq_performance.

No primeiro argumento colocaremos nosso data frame df_portfolio_perf. No segundo o retorno dos ativos, no terceiro o retorno de mercado, e no quarto o retorno da taxa livre de risco. Note que todos são retornos diários.

tq_performance(df_portfolio_perf, Ri, Rm, performance_fun = table.CAPM)

modelo capm modelo r

Calculando o Índice de Sharpe do portfólio no R

Outra informação importante é sabermos o quanto de retorno excedente nosso portfólio entregou por unidade de risco que “tomou”. Para isso, usaremos o índice de Sharpe, que mede exatamente o quão atraente é o retorno ajustado ao risco do portfólio. 

tq_performance(df_portfolio_perf, Ra = Ri, Rb = NULL, performance_fun = SharpeRatio)

indice sharpe r

Calculando o retorno anualizado do portfólio no R

Outra coisa útil é calcular o retorno anualizado do portfólio, para isso usaremos o argumento table.AnnualizedReturns na função tq_performance. Como esse argumento por vezes nos dá warnings, apagaremos a primeira linha do nosso data frame (retornos zerados) e criaremos um data frame de teste para calcular os retornos anualizados:

teste <- df_portfolio_perf[-1,]
tq_performance(teste, Ra = Ri, Rb = NULL, performance_fun = table.AnnualizedReturns)

retorno do portfólio em ações

Feito! A função também nos dá um índice de Sharpe anualizado (assumi a taxa livre de risco como sendo zero).

A evolução do patrimônio com o tempo

Outro exercício interessante é calcular a evolução patrimonial do portfólio com o tempo, para isso, vamos supor que nosso patrimônio inicial era de R$ 100.000.

Primeiro, vamos novamente baixar os retornos das ações e anexar ao data frame “ret_acoes”:

ret_acoes <- acoes_df %>%

  tq_transmute(select = adjusted,

               mutate_fun = periodReturn,

               period = ‘daily’,

               col_rename = ‘ret’)

*Faremos isso porque precisaremos da coluna “symbols” de volta.

Agora o principal, para calcular a evolução patrimonial precisaremos utilizar o argumento “wealth.index = TRUE” na função tq_portfolio().

retorno_port <- ret_acoes %>%

  tq_portfolio(assets_col   = symbol, 

               returns_col  = ret, 

               weights      = Vetor_peso, 

               col_rename   = “crescimento.portfolio”,

               wealth.index = TRUE) %>%

  mutate(crescimento.portfolio = crescimento.portfolio * 100000)

Visualizando a evolução do patrimônio com o tempo

Para fazer o gráfico com o ggplot, colocaremos obviamente a data no eixo x e o valor atualizado do aporte no eixo y:

ggplot(data = retorno_port, aes(x = date, y = crescimento.portfolio)) +

  geom_line(size = 1) +

  labs(title = “Evolução de R$ 100.000 investidos no portfólio com o tempo”,

       caption = “Dados do Yahoo Finance”,

       x = “”, y = “PL”)

investir na bolsa

Conclusão

Note que o nosso portfólio obteve um retorno fantástico, não só gerando alfa, mas tendo uma rentabilidade de quase 200% sobre o patrimônio investido inicialmente. Ainda sim, não podemos dizer que este portfólio é otimizado. No próximo texto, aprenderemos a otimizar um portfólio de ativos. 

Baixe nosso app grátis! No TC você acompanha as principais notícias e cotações do mercado em tempo real, além de ter acesso a canais exclusivos para interagir com os melhores profissionais.

Estude e conheça! Aprenda com quem realmente entende de investimentos. Tire dúvidas, troque ideias, experiências e construa uma grande rede de networking com investidores de todo Brasil.

A gente também está no Instagram,YouTube e no TikTok. Acompanhe!

Referências

Dancho, M. (2021). Performance Analysis with tidyquant. Retrieved 15 October 2021, from https://cran.r-project.org/web/packages/tidyquant/vignettes/TQ05-performance-analysis-with-tidyquant.html

Lucca Carlini

Estudante de Economia na UFPE.

Disclaimer: Este material é produzido e distribuído somente com os propósitos de informar e educar, e representa o estado do mercado na data da publicação, sendo que as informações estão sujeitas a mudanças sem aviso prévio. Este material não constitui declaração de fato ou recomendação de investimento ou para comprar, reter ou vender quaisquer títulos ou valores mobiliários. O usuário não deve utilizar as informações disponibilizadas como substitutas de suas habilidades, julgamento e experiência ao tomar decisões de investimento ou negócio. Essas informações não devem ser interpretadas como análise ou recomendação de investimentos e não há garantia de que o conteúdo apresentado será uma estratégia efetiva para os seus investimentos e, tampouco, que as informações poderão ser aplicadas em quaisquer condições de mercados. Investidores não devem substituir esses materiais por serviços de aconselhamento, acompanhamento ou recomendação de profissionais certificados e habilitados para tal função. Antes de investir, por favor considere cuidadosamente a sua tolerância ou a sua habilidade para riscos. A administradora não conduz auditoria nem assume qualquer responsabilidade de diligência (due diligence) ou de verificação independente de qualquer informação disponibilizada neste espaço. Administradora: TradersNews Informação & Educação Ltda. Todos os direitos reservados.

TradersClub

O app essencial para investidores do mercado financeiro brasileiro.

Uma comunidade com milhares de investidores, ferramentas e serviços que vão ajudar você a investir melhor!

TradersClub