Category

mercado financeiro

Análise de performance com Tidyquant

By | mercado financeiro

O pacote Tidyquant foi criado com o objetivo de reunir os principais pacotes de análise quantitativa financeira do R em um formato tidy.  No post de hoje, apresentamos o pacote e realizamos um exemplo de análise com ações da Ibovespa.

Introdução ao Tidyquant

O pacote {tidyquant} funciona como um wrapper das funções do principais pacotes do R para análises quantitativas, isto é, ele reutiliza as funções já prontas, realizando mudanças no output para o formato do tidyverse.

Dentre os pacotes que são reunidos, encontram-se:

  • zoo: pacote criado com a finalidade de criar objetos indexados ao tempo, além de fornecer funções para a manipulação de séries no tempo.
  • xts: pacote que funciona como uma extensão do objeto 'ts' do R e também do zoo. Oferece funções para facilitar a manipulação de dados.
  • quantmod: oferece funções para coleta, tratamento e modelagem de séries financeiras. Criado com base nos objetos zoo e xts.
  • TTR: Acrônimo de "Technical Trading Rules". Criado com o objetivo de criar indicadores técnicos e facilitar a criação de janelas móveis. Também criado com base em objetos zoo e xts.
  • PerformanceAnalytics: criado para facilitar a utilização de ferramentas análises econométricas e de performance em séries financeiras. Também utiliza de objetos zoo e xts.
  • Entre outros pacotes que podem ser checados na documentação do pacote.

Todos os pacotes acima foram criados no formato zoo/xts, portanto, apesar de integráveis entre eles, não são diretamente integráveis com o universo do tidyverse, dessa forma, funções como select(), filter(), group_by(), entre outras, não podem ser utilizadas com os objetos criados/utilizados por esses pacotes.

Por isso, criou-se em torno do tidyquant, uma série de funções que possibilitou utilizar todas as funções dos universo zoo/xts, em conjunto com o tidyverse. Dentre as principais funções wrapers do tidyquant, podemos citar:

  • tq_get(): wrapers das funções de coleta de dados financeiros e econômicos - quantmod (Yahoo) , quandl (Nasdaq Data Link), alphavantager (Alpha Vantage), riing (Tiingo) e Rblpapi (Bloomberg).
  • tq_transmute e tq_mutate(): Cria e transforma as colunas já existentes de um data frame com base em uma função dos pacotes utilizados para cálculos e manipulação de dados do formato zoo e xts. O resultado é sempre um objeto tbl/data.frame.
  • tq_performance() e tq_portfolio(): Baseadas nas funções de cálculos de performance e criação de portfolio de ativos financeiros.

Abaixo, iremos seguir um workflow contendo todas essas funções, utilizando os pacotes reunidos no tidyquant.

Coleta de dados de preços

Para a coleta de preços, é possível utilizar o tq_get() para obter dados dos preços de ações e de índices através do yahoo finance, bem como também de informações disponibilizadas pelo Nasdaq Link, como por exemplo taxas de juros.

No código abaixo, capturamos os dados de três ações do Ibovespa, do próprio índice, e também da taxa de retorno do CDI mensal.

Cálculo e Manipulação

Para transformar as colunas, utilizamos a função tq_transmute() como wraper de diversas funções, podemos utilizar a função tq_mutate_fun_options() para obter uma lista de quais funções podemos utilizar.

Para conhecer sobre todas as funções, é recomendado utilizar o helper do Rstudio com ? na função.

Uma vez que tenhamos compreendido as funções, calculamos os excessos de retornos mensais das ações selecionadas e da Ibovespa, isto é, subtraímos os retornos dos ativos pelo retorno da taxa de juros livre de risco.

No código abaixo, utilizamos group_by() para juntar os tickers das ações (visto que estamos lidando com um data frame em formato long) e aplicar o cálculo de função periodReturn() do {quantmod} dentro do argumento mutate_fun. Veja que os argumentos da função podem ser utilizados dentro de tq_transmute(), como por exemplo, period = "monthly", referenciando que a função deve transformar os dados em mensais.

Quando não há mais de uma categoria do data frame, como no caso do objeto ibov_price, não é necessário a utilização de group_by().

Análise de Performance

Para realizar uma analise de performance dos dados, utilizamos a função tq_performance(). Assim, como as funções anteriores, é possível saber os wrapers dessa função através de tq_performance_fun_options().

Como exemplo, é possível calcular uma tabela de valores anualizados dos ativos.

Bem como os valores do CAPM das ações.

Com tq_portfolio(), podemos construir os retornos de um portfolio das três ações acima. Escolhemos os pesos dentro do objeto w para cada ativo.

Com a função tq_portfolio(), selecionamos as colunas de retornos, ativos e o vetor de pesos, e escolhemos wealth.index = TRUE, para que seja retornado o gross returns (retorno bruto acumulado) para obter a riqueza criada pelo portfolio no período.

Em seguida, plotamos os valores do portfolio.

_____________________________________

Se interessou? Veja mais nos nossos cursos de Finanças Quantitativas

Criando indicadores fundamentalistas com Python

By | mercado financeiro

A Análise Fundamentalista adota a hipótese de que há um valor intrínseco para cada ação, isto considerando o desempenho econômico e financeiro da empresa. No post de hoje iremos tratar de como buscar dados e construir indicadores fundamentais para esse tipo de avaliação utilizando o Python.

A análise fundamentalista foca em projetar o desempenho futuro de uma empresa, baseado nas informações de demonstrativos financeiros da empresas e especialmente através dos fundamentos (indicadores) das mesmas.

Existem diversos fundamentos que podem ser construídos através dos demonstrativos da empresa, com cada indicador representando uma informação relevante para o analista.

Para construir esses indicadores, obviamente, deve-se ter em mãos os dados dos demonstrativos das empresas. Podemos obtê-los parcialmente através do site Investing.com e realizando a importação para o Python com a biblioteca investpy.

Uma vez carregado as bibliotecas, iremos importar os dados e as informações da empresa.

Vamos realizar uma análise de indicadores da empresa ITAUSA, com base no ticker ITS4. O ticker é necessário para que seja possível importar as informações da empresa, no caso, os demonstrativos: Demonstração de resultado (receitas e lucro); Balanço Patrimonial (ativos, passivos e patrimônio líquido) e Demonstração de fluxo de caixa.


Para importar as receitas e o lucro, utilizamos a função get_stock_financial_summary, com o argumento stock referenciando o ticker, country para o país (Brazil), summary_type para o tipo do demonstrativo (income_statement) e o período, podendo ser anual (annual) ou trimestral (quarterly).

Buscamos os dados trimestrais. Do período importado, apenas 4 períodos anteriores do atual são importados, mas o que é o suficiente para obtermos uma análise sobre a empresa.

Abaixo, importamos os dados da DRE em itsa_dre.

Realizamos o mesmo procedimento para o balanço patrimonial, alterando o argumento summary_type para "balance_sheet".

Apesar de não utilizarmos posteriormente, é possível importar também a demonstração de fluxo de caixa.
Temos então diversas informações sobre o desempenho da empresa. Com os dados, é possível criar os indicadores.

Return on Equity (ROE)

O retorno sobre o patrimônio mede a rentabilidade sobre o capital da empresa, ou seja, a eficiência da empresa em utilizar os seus recursos próprios.

 

A sua fórmula segue como:

 

     $$ROE = \frac{Lucro Líquido}{Patrimônio Líquido}$$

Esse indicador é importante para entender a taxa de crescimento da empresa. Abaixo, realizamos o cálculo do indicador com os dados da ITSA4.

Return on Asset (ROA)

Retorno sobre os ativos mede a rentabilidade da empresa em relação aos seus ativos, ou seja, o se ela consegue usar eficientemente os seus ativos para gerar lucro.

 

A sua fórmula segue como:

     $$ROA = \frac{Lucro Líquido}{Ativos Totais}$$

Diferente do ROE, a ROA exprime o quão alavancada uma empresa está, isto porque os ativos totais incluem a quantidade de capital emprestado para executar suas operações.

Análise de ações

Para analisar uma empresa, é possível  relacionar o seu valor com o preço da ação negociado.

Antes de criar os indicadores desse tipo de medida, devemos buscar os dados do número de ações em circulação da empresa. Realizamos esse procedimento com a função get_stock_information, com o ticker, o país e com o argumento as_json = False (para retornar um data frame).

Das informações coletadas, iremos utilizar somente a coluna "Shares Outstanding".

 Agora temos informações suficientes para calcular três indicadores importantes para a análise de ações.

Lucro por ação

O LPA mede a rentabilidade por cada ação que possui em circulação. Quanto maior o LPA da empresa, maior o seu valor (investidores irão pagar mais pela ação).

 

A sua fórmula segue como:

 

    $$LPA = \frac{Lucro Líquido}{Acoes em circulação}$$

 

O LPA é necessário também para calcular o P/L da empresa que abordaremos a seguir.

Preço / Lucro

O P/L é utilizado para avaliar se o preço das ações de uma empresa está caro ou barato. Teoricamente, indica o número de anos que um investidor demoraria para recuperar o capital investido.

    $$P/L = \frac{Preço de mercado da ação}{Lucro por ação (LPA)}$$

 

No código, primeiro devemos importar os dados da cotação da ITSA4 para realizar o cálculo do P/L. O primeiro passo deste processo é definir as datas de inicio e fim com base nas datas capturadas pelos demonstrativos importados anteriormente, com isso, a ideia é que obtemos uma maior automação.

Para definir essas datas, pegamos o primeiro e último valor do índice do data frame itsa_dre. Em seguida, utilizamos o método strftime para transformar em string e definir o formar de dia/mês/ano (a função get_stock_historical_data só aceita a data neste formato).

Uma vez definidos as datas de inicio e de fim, utilizamos a função get_stock_historical_data para buscar a cotação do ativo.

Para realizar o cálculo, é necessário utilizar os preços de fechamentos, contidos da coluna "Close". Realiza-se a junção com o data frame do LPA, completa-se os dados faltantes (os preços são diários, causando problemas com a coluna do LPA). E por fim, retira-se os dados faltantes restantes.

Ao final do código, renomeamos as colunas e calculamos o P/L.

_____________________________________

Se interessou? Veja mais nos nossos cursos de Finanças Quantitativas

Médias Móveis Simples para Trading com o Python

By | mercado financeiro

A estratégia de trading por Médias Móveis Simples é um método bem conhecido, isto por conta da sua facilidade de construção. No post de hoje abordaremos a estratégia, realizando a sua construção no Python.

O que é Média Móvel?

Média Móvel é um cálculo estatístico que permite obter a média de uma amostra a medida que "novos" dados são inseridos, substituindo os dados mais "antigos". É comum a sua utilização em séries temporais com o objetivo de deixar a série mais "suavizada", permitindo estabelecer pontos de tendência.

Em séries temporais financeiras, principalmente de preços de ações, é notável entender que a MM de períodos curtos (curto prazo) são mais voláteis daquelas comparadas a períodos longos (longo prazo). E o interessante é que elas estabelecem uma relação entre si.

Uma média móvel crescente indica que a ação está em tendência de alta, enquanto uma média móvel decrescente indica que está em tendência de baixa. Da mesma forma, um impulso ascendente é confirmado com um cruzamento de alta, que ocorre quando uma média móvel de curto prazo cruza acima de uma média móvel de longo prazo. Por outro lado, o momento descendente é confirmado com um cruzamento de baixa, que ocorre quando uma média móvel de curto prazo cruza abaixo de uma média móvel de longo prazo.

Estratégia

Através das regras citadas, podemos construir um código em Python realizando a estratégia para a compra e venda de ações. Aqui, utilizaremos os dados do preço de fechamento da ITUB4 no período de 2019-01-01 até 2022-07-11.

Após importar a série com a biblioteca pandas_datareader, utilizando a função get_data_yahoo, selecionamos apenas a coluna Close. Em seguida, definimos as janelas das MMs - para a de curto prazo, escolhemos 42 dias, e para a de longo prazo, 252 dias.

Para criar as média móveis, selecionamos os dados do preço de fechamento, aplicamos o método rolling (que permite criar uma janela móvel) com o número de dias como argumento e em seguida, utilizamos mean() para criar a média móvel.

Com as MMs criadas, devemos criar as posições de compra e venda com base em uma condição estabelecida. Veja que podemos realizar o procedimento aplicando np.where com a condição:

  • Comprado (=+1)  se MM de curto prazo estiver acima da MM de longo prazo
  • Vendido (=-1) se MM de curto prazo estiver abaixo da MM de longo prazo

Com a estratégia criada, podemos enfim calcular o retorno do método a partir das posições. Primeiro calculamos o retorno logaritmo. Em seguida, multiplicamos o retorno pela posição (para saber quando estamos comprados e vendidos a partir do sinal da posição)

Por fim, calculamos o retorno acumulado.

Estratégia com vectorbt

Outra forma interessante de construir a estratégia é a partir da biblioteca vectorbt.

Pegamos os dados de fechamento novamente, entretanto, em formato de series. Para criar as médias móveis, utilizamos os métodos MA.run() com a série de preço e os dias da MM.

Para aplicar as regras, utilizamos ma_above, para avisar que quando fast_ma estiver acima de slow_ma é um call de entrada, e ma_below para o contrário.

Para aplicar os sinais na série de preços, utilizamos o método Portfolio.from_signals() colocando dentro a série de preço, a entrada e a saída.

Por fim, visualizamos graficamente a estratégia. O interessante é que ao invés de se manter posicionado em venda quando a linha de curto prazo está abaixo da de longo, o algoritmo realiza o lucro/prejuízo, mantendo o valor do retorno constate no período, ao invés de se manter vendido no ativo. Só há movimentação no retorno quando ocorre novamente a compra.

Abaixo, temos três gráficos construídos por padrão com o método plot().show(). O primeiro indica os momentos de compra e venda com base na série do preço da ação. O segundo indica os pontos de mudança do Profit and Loss. O terceiro indica o retorno acumulado da estratégia comparado com o retorno acumulado do ativo sem estratégia (se tivesse mantido comprado desde o começo).

_____________________________________

Se interessou? Veja mais nos nossos cursos de Finanças Quantitativas

Filtro de Kalman e Beta de Mercado

By | mercado financeiro

O Filtro de Kalman é onipresente em problemas de controle de engenharia, incluindo orientação e navegação, análise de trajetória de naves espaciais e fabricação, entretanto, também é amplamente utilizado em finanças quantitativas. Neste post de hoje, trataremos de introduzir o Filtro de Kalman de forma intuitiva aplicando um exemplo de estimação do Beta de Mercado utilizando o algoritmo no Python.

O filtro de Kalman é um algoritmo que usa observações com ruídos de um sistema ao longo do tempo para estimar os parâmetros do sistema (alguns dos quais não são observáveis) e prever observações futuras. A cada passo de tempo, ele faz uma previsão, recebe uma medição e se atualiza com base na comparação entre a previsão e a medição. Esse algoritmo faz parte de um sistema de espaço de estados.

A premissa geral de um modelo de espaço de estados é que temos um conjunto de estados que evoluem no tempo (como a razão de hedge entre dois pares cointegrados de ações), mas nossas observações desses estados contêm ruído estatístico (como ruído de microestrutura de mercado) , e, portanto, não podemos observar diretamente os estados "verdadeiros".

O objetivo do modelo de espaço de estados é inferir informações sobre os estados, dadas as observações, à medida que novas informações chegam. Ou seja, utiliza-se de um algoritmo recursivo que permite usar uma série temporal observável para estimar uma série não observável, chamada de variável de estado, sendo construído na forma de estado-espaço.

Na imagem, temos de forma ilustrada o processo do algoritmo de Kalman.

Produzido por Fernando da Silva

Usualmente, existem três tipos de inferência que nós estamos interessado quando considerado modelos de espaço estado:

  • Previsão - Prevê os valores valores subsequentes do estado
  • Filtragem - Estimação dos valores atuais do estado através das observações passadas e atuais do estado
  • Suavização - Estimação dos valores passados ​​do estado de acordo com as observações

Não iremos discutir os aspectos matemáticos do algoritmo, visto que é complexo e exige a demonstração de diversas equações. Seguiremos apenas na parte intuitiva, e que será suficiente para entender a estimação do Beta a partir do Filtro de Kalman.

O interessante do Filtro de Kalman é a sua possibilidade de ser utilizado para estimar valores através de uma regressão. Como o Filtro de Kalman é recursivo, ou seja, é baseado na repetição e atualização dos valores para estimar uma variação desconhecida, podemos utilizá-lo para estimar o Beta de Mercado móvel de uma ação, visto que o Beta varia ao longo do tempo.

Visto que o valores de Beta variam ao longo de tempo, é normal utilizar-se de regressões móveis, como forma de obter o valor do Beta de uma ação no período mais recente. Por definição, neste processo, o usuário deve escolher o período da janela do cálculo. Pelo Filtro de Kalman, isso não é necessário, visto que utiliza-se da última observação apenas para estimar o valores desconhecidos no estado atual, e o próprio algoritmo atualiza as mudanças estruturais dos dados ao longo do tempo. Isso é extremamente útil para alguns tipos de estratégias de trading que necessitam dos melhores valores mais recentes.

Agora, seguiremos para a demonstração com um código de construção do Beta através da biblioteca pykalman.

Utilizaremos o pandas_datareader para a importação dos preços e o pandas e numpy para cálculo dos retornos da ação e do retorno de mercado com  a finalidade de calcular o beta pelo Filtro da Kalman.

No código abaixo tratamos de importar os dados da ITUB4 e calcular os seus retornos diários no período de 2019 a 07/2022. Realizamos o mesmo processo para o Ibovespa.

Por fim, devemos definir como iremos calcular o Filtro de Kalman utilizando a classe KalmanFilter, definindo os valores do parâmetros iniciais do algoritmo. Para entender mais sobre como são definidos os argumento da função, veja a documentação da biblioteca.

Por fim, procedemos com o cálculo dos valores, com o método filter(). O resultado será o estado dos valores do coeficiente da regressão e seu intercepto, bem com o estado das covariâncias.

Abaixo, podemos visualizar o Beta estimado ao longo do tempo.

Interessante notar as mudanças ao longo do tempo do coeficiente, corroborando para a utilização em estratégias que necessitam de valores dinâmicos do Beta.

__________________________________________________

Quer saber mais?

Veja nossos cursos da trilha de Finanças Quantitativas.

_________________________________________________

A estratégia de long & short

By | mercado financeiro

Long-short refere-se a uma estratégia em que se possui uma posição comprada e uma vendida, normalmente no mercado de ações. O objetivo desta estratégia é buscar uma posição em se tenha uma imunidade dos movimentos do mercado, ou seja, é considerada neutra em relação ao mercado. No post de hoje, realizamos um exercício de uma estratégia long & short utilizando o Beta de mercado para a construção e ordenação de portfolios. O exercício é criado a partir de ações brasileiras e utilizando o R para a sua construção.

O objetivo da estratégia, é encontrar os ativos ou portfolio que devem ser escolhidos como aqueles que vão estar em uma posição comprado ou vendida. Há inúmeras formas de realizar esse procedimento, e uma delas é através da separação de ações que possuem betas de mercado elevados e aqueles que possuem betas baixos. O objetivo geral então é realizar um sistema de classificação através de um fator de mercado ou estatística para ranquear os portfolios que estarão comprados ou vendidos.

No caso da estratégia com Betas de Mercados, Betas elevados tendem a serem mais voláteis que o movimento de mercado, enquanto beta baixos tendem a representar menos volatilidade. Neste exercício, trataremos de construir portfolios com betas elevados, de forma a ter uma posição comprada, e também betas pequenos, de forma a ter uma posição vendida. A diferença entre os retornos de ambos resultará no resultado da estratégia long & short.

Trataremos de utilizar 5 ações escolhidas sem nenhum critério. Utilizamos o período de 2011-01-01 até 2022-07-01, transformando preços das ações em retornos mensais. Os pesos dos ativos em cada portfolio foi baseado na Capitalização de Mercado da ação, e para deixar o exercício mais simples e com o foco na estratégia, foi utilizado o valor da Capitalização do dia de 2022-07-18 constante durante todo o período.

O primeiro passo será importar os pacotes necessários.

Como nosso objetivo é criar os betas de mercado mensais, trataremos de realizar a importação dos preços de fechamento das ações, bem como os dados da Ibovespa e do CDI, este com o propósito de calcular o excesso de retorno das ações e do mercado.

Os preços das ações e do Ibovespa foram retirados com a função tq_get do {tidyquant}, enquanto a série do CDI foi retirado com o pacote {rbcb} através do código 4391.

Após a importação, calculamos os retornos mensais utilizando a função tq_transmute do pacote {tidyquant} em conjunto com a função periodReturn do pacote {quantmod}. Abaixo, realizamos o tratamento dos dados e calculamos os excessos de retorno.

Com os excessos de retornos em mãos, podemos calcular os betas mensais através de uma função de janela móvel. Abaixo, vemos no gráfico o resultado dos betas em uma janela de 48 meses.

Em seguida, importamos os dados da Capitalização de Mercado através do site do Yahoo Finance e realizamos os seus devidos tratamentos.

Antes de classificar os portfolios, devemos defasar os valores do beta. Esse procedimento é necessário devido ao tempo da informação contida no Beta. O beta é calculado apenas em sua totalidade com os valores no fim do mês, portanto, não há a informação sobre o seu valor durante o período presente do retornos das ações, o valor conhecido é apenas aquele do período anterior.

Agora podemos classificar os portfolios baseados no valor da mediana dos Betas encontrados. Aqueles que estão abaixo da mediana, se encontram no portfolio com betas baixos (beta low), ao contrário, tem-se os betas altos (beta high). Por fim, calcula-se os retornos dos portfolios "high" e "low" com base nos pesos da Capitalização de Mercado de cada ação através da função weighted.mean().

Visualizamos o comportamento dos retornos mensais de ambos os portfolios no gráfico abaixo.

 

Abaixo, calculamos o resultado a estratégia long & short por meio da diferença entre os portfolios em posição comprada e vendida.

Com os resultados completos, visualizamos os retornos anuais dos portfolios.


Para averiguar a performance, também podemos calcular o retorno acumulados do portfolios.

 

__________________________________________________

Quer saber mais?

Veja nossos cursos da trilha de Finanças Quantitativas e veja o vídeo comentado com o código no Clube AM.

_________________________________________________

Referências

Tidy Finance with R by Christoph Scheuch, Stefan Voigt and Patrick Weiss.

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente