Algo trading: implementando análises técnica e fundamentalista com Python
Dando continuação à sequência de tutoriais, hoje vamos focar em estratégias que embasam a tomada de decisão num sistema de trading algorítmico.
Segundo John J. Murphy, um dos principais autores sobre o assunto, análise técnica é o estudo dos movimentos do mercado, principalmente pelo uso de gráficos, com o propósito de prever futuras tendências no preço. É a lógica de investimento utilizada por traders grafistas, por exemplo.
Em contrapartida, a análise fundamentalista é a análise da situação financeira, econômica e mercadológica de uma empresa, um setor ou dado econômico, uma commodity ou uma moeda e suas expectativas e projeções para o futuro. É a filosofia de investimento do megainvestidor Warren Buffett.
Não se prendendo apenas à análise técnica — mais facilmente implementada, portanto mais comum em algo trading — meu objetivo é evidenciar que a análise fundamentalista é também perfeitamente capaz de integrar um sistema automatizado de tomada de decisão no mercado.
“A princípio toda estratégia de investimento, se é um processo sólido e bem definido, pode ser convertida em um algoritmo.” — Leda Braga, CEO Systematica Investments, durante painel na XP Expert 2020.
Disclaimer
O tutorial abaixo tem fins educativos apenas. Não constituem recomendação de investimento e devem ser utilizados por conta e risco do usuário.
Requerimentos
Python 3.8.6 instalado incluindo as bibliotecas pandas, numpy, TA-Lib, yfinance, quandl e MetaTrader5.
Versão desktop do MetaTrader5 sincronizada com a corretora desejada. No meu caso, a corretora utilizada foi a Rico.
Para passo-a-passo detalhado de instalação dos requerimentos, acesse a página do projeto no GitHub.
Ainda antes de começar, te convido a dar uma olhada no tutorial Crie seu primeiro robô trader com Python e MetaTrader5. Ele é menos complexo e te dará mais bagagem pra acompanhar esse segundo tutorial.
Com ajuda da automação, tornou-se fácil equipar-se com ferramentas de análise antes de determinar a compra ou venda efetiva de um ativo. Mesmo para o trader não tão sofisticado, hoje já é possível plotar em segundos um gráfico year-to-date de preço de MGLU3, a evolução do lucro líquido histórico da PETR3, ou mesmo acompanhar notícias macro (quase) em tempo real. Se SANB11 pagar dividendos, dá pra ficar sabendo também. Muitas vezes de forma gratuita, inclusive.
Na hora de manipular esses dados, estratégias de análise técnica podem ser facilmente modeladas através de ferramentas como o TradingView. Para o trader fundamentalista, há outras dezenas de opções de acesso à relatórios de research, projeções setoriais de preço ou a própria análise financeira em se tratando de uma empresa de capital aberto.
O mesmo vale para a tomada de decisão, ou, na prática, a execução de ordens de compra e venda. Ferramentas acessíveis para o público como o próprio MetaTrader5 permitem que, com poucos cliques, o usuário automatize o processo de compra e venda mediante a satisfação de um certo critério, também pré-definido pelo usuário — ex: comprar GGBR4 em R$20/ação, vender quando alcançar R$25/ação.
A realidade é que temos, no mínimo, boa parte dos ingredientes pra uma tomada de decisão sofisticada. O grande desafio é, obviamente, sistematizar tudo isso da forma mais simples possível. Então vamos lá!
Dados históricos
Vamos começar baixando a série histórica de preço do ativo em questão. Para fins desse tutorial iremos utilizar o ativo VALE3 como exemplo. O código abaixo utiliza o MetaTrader5 para fazer o download da série histórica de preço diário desde 01/01/2020, ou seja, aproximadamente de 1 ano pra cá. Esse período é mais que necessário pra nossa modelagem.
Estratégia de decisão
De forma a contemplar as análises técnica e fundamentalista, criaremos 2 robôs diferentes, a princípio independentes. Ao final do tutorial, consolidarei o código de forma que tenhamos um único robô que só irá tomar a decisão de compra ou venda se ela for suportada por ambas as filosofias técnica e fundamentalista. O intervalo de preços utilizado é diário.
Robô 1: Análise técnica (cruzamento de médias móveis simples)
Nosso robô de análise técnica será um seguidor de tendência. Dessa forma, utilizaremos o cruzamento de médias móveis simples como fator de embasamento para a tomada de decisão. Um sinal de compra será gerado quando a média móvel (“MM”) de 30 dias cruzar acima da MM de 120 dias. Analogamente, quando a MM de 30 dias cruzar abaixo da MM de 120 dias, um sinal de venda será gerado. Ambas as estratégias serão geradas através da biblioteca TA-Lib, mencionada no início do tutorial.
Robô 2: Análise fundamentalista (margem líquida + alavancagem + preço do minério de ferro)
Nosso robô de análise fundamentalista observará 3 métricas principais e de relação direta com o desempenho da Vale S.A., maior produtora de minério de ferro, pellets e níquel do mundo.
A margem líquida mede a capacidade de lucratividade da empresa ao passo que a alavancagem nos alerta sobre a quantidade de dívida em relação à capitalização total (dívida total + patrimônio líquido). Por fim, o preço da tonelada do minério de ferro nos direciona para o faturamento (receita líquida) da empresa, o que impacta diretamente sua geração de caixa. A geração de caixa é principalmente direcionada para repagamento de principal e juros da dívida, reinvestimento na própria empresa e pagamento de dividendos aos acionistas.
Um sinal de compra será gerado somente quando: (1) a margem líquida média dos últimos 3 trimestres fechados for superior à 10%, (2) a alavancagem medida pela razão entre a dívida total e capitalização total for inferior à 50%, e (3) o preço da tonelada do minério de ferro cair abaixo de $100. O racional fundamentalista aplicado é que, num cenário de queda do preço do minério de ferro, a queda no preço das ações da Vale S.A. pode cair mais que proporcionalmente à redução dos fluxos futuros, que apesar de dependerem do preço do minério, também dependem da solidez financeira da empresa.
Analogamente, o sinal de venda será gerado quando as métricas financeiras não mais apontarem para uma solidez financeira (i.e. queda na rentabilidade, aumento da alavancagem). Ou seja, quando: (1) a margem líquida média dos últimos 3 trimestres fechados for inferior à 5%, e (2) a alavancagem ultrapassar o patamar de 70%.
E finalmente… o robô 3!
Agora que temos dois robôs independentes, a ideia é combiná-los de forma que um sinal de compra ou venda só será gerado se validado por ambas as análises técnica e fundamentalista, o que chamaremos de robô 3. Nessa versão combinada incluo também o mecanismo de processamento automático dos sinais. Isto é, se um sinal de compra ou venda for gerado, a respectiva ordem será automaticamente executada através do MetaTrader5 por meio da conta da corretora sincronizada.
Conclusão
Ainda que de forma genérica, conseguimos entender a diferença entre as análises técnica e fundamentalista na prática, através de um robô 100% automatizado, do início (obtenção das informações financeiras) ao fim do processo (execução das ordens de compra ou venda).
Além do disclaimer acima, é importante ressaltar que os robôs criados nessa série de tutoriais se tratam de exemplos criados para fins didáticos e que, apesar de fazerem algum sentido do ponto de vista de mercado, não refletem exatamente a robustez exigida por algoritmos profissionais de trading. Isso não impede que você, que chegou até aqui, edite e/ou adicione novas funcionalidades ao código e usufrua ao máximo com base na sua experiência de mercado. ;-)
Se tiverem alguma dúvida, estou à disposição. E até a próxima!