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).
_____________________________________
Quer saber mais?
Veja nosso curso de Python para Investimentos.