Predição de ações na bolsa de valores com Python e Facebook Prophet
Tags: python, stocks, datascience, machinelearning
Published: 2022-03-24 03:46:45


## Predição de ações na bolsa de valores com Python e Facebook Prophet

Usando Machine Learning para projetar valores futuros.

![(Crédito: B3/Divulgação)](https://cdn-images-1.medium.com/max/3400/1*kf5IyvHytnUizG6viM2AMQ.jpeg)

Em meio a pandemia da COVID 19 e a crise econômica muitas pessoas (inclusive eu) começaram a despertar o interesse por investir em renda variável na bolsa de valores, quantidade de pessoas essa que cresceu exponencialmente nos últimos 3 anos, e hoje em 2022 a B₃(BM&FBOVESPA) contabiliza a marca de [5 milhões de contas físicas cadastradas](https://www.b3.com.br/pt_br/noticias/5-milhoes-de-contas-de-investidores.htm).

![Evolução de quantidade de pessoas físicas cadastradas na B3. Fonte: B3](https://cdn-images-1.medium.com/max/2000/1*d4_yBWc0IhrBQ9JrYPG83Q.png)

## O que é bolsa de valores?

A bolsa de valores é um ambiente de negociação onde investidores podem **negociar **seus títulos emitidos por empresas, sejam elas com capitais públicos, mistos ou privados. Esse processo é intermediado com auxílio de correspondentes de negociações através de corretoras.

Operar nesse mercado sem conhecimento prévio pode ser bastante complexo, principalmente porque no papel de acionista é extremamente importante realizar o acompanhamento, fazer análises fundamentalistas sobre a empresa e o momento, para somente após isso decidir aonde colocará o seu suado dinheiro.

## Cenário

Atualmente machine learning (e até mesmo redes neurais) tem entrado nos “trend topics” de investimento, pois investidores buscam automatizar não todo, mas parte do processo, pois é uma área que estuda a capacidade de aprendizado de um computador sobre conjuntos de dados e vem sendo muito utilizado para construção de robôs operacionais na área de investimentos.

Em minhas recentes pesquisas sobre o assunto encontrei alguns modelos de implementação utilizando a [SciKit Learn](https://scikit-learn.org/stable/index.html) (biblioteca para aprendizado de máquina em python) com métodos de regressão que buscam predizer valores de ações na bolsa.

O problema de todas as implementações e o maior erro em minha opinião é que, na verdade, não estão predizendo nada, deixe me explicar.

A maior parte dos exemplos faz a divisão dos dados de uma ação em treinamento e teste limitando a um simples aprendizado para “predições” de dados históricos. E quando falamos em predição de valores na bolsa, também temos em mente a projeção para datas futuras, pois queremos saber qual o valor que terá uma determinada ação em um determinado dia, o que não é abordado.

Em busca de uma solução para o problema encontrei o Prophet, uma biblioteca criada pelo Facebook com implementações em R e Python para fornecer previsões automatizadas, e é com ela que trabalharemos.

## **Pré processamento**

Como requisito, precisaremos das bibliotecas listadas abaixo, as instruções de instalação das mesmas podem ser encontradas nos links.

* [Pandas](https://pandas.pydata.org/): Manipulação de dataframes.

* [Pandas T.A](https://github.com/twopirllc/pandas-ta): Biblioteca Pandas para análise técnica.

* [Yahoo Query](https://pypi.org/project/yahooquery/): Busca de dados do mercado financeiro.

* [Plotly](https://plotly.com/): Visualização de gráficos.

* [Prophet](https://facebook.github.io/prophet/): Automação preditiva.

No primeiro passo, realizaremos a importação das bibliotecas necessárias.
{% gist https://gist.github.com/LucasDiogo96/893357e239d47c0513f860c6c861e898.js %}
Após então, utilizaremos o [yahooquery ](https://github.com/dpguthrie/yahooquery)que é uma biblioteca excelente para realizar extrações de dados do mercado financeiro do site [Yahoo Finance](https://finance.yahoo.com/) e nos devolve informações extremamente úteis com rapidez e facilidade. Realizaremos uma busca dos dados de pregão de uma determinada ação na bolsa de valores e após isso o devido pré processamento.
{% gist https://gist.github.com/LucasDiogo96/1d3e59b72fc1570ef6d26af450034944.js %}
**Linha 1: **A informação que está sendo atribuída a variável symbol é a identificação do ativo. Você irá achar esse código acessando o [Yahoo Finance](https://finance.yahoo.com/).

![Yahoo Finance: [https://finance.yahoo.com/](https://finance.yahoo.com/)](https://cdn-images-1.medium.com/max/2000/1*cNbkcI2UkATyKhoojAeK_g.png)

**Linha 8. **Realização da busca referente ao ativo em um período determinado, no caso escolhido foi 48 meses.

**Linha 10. **Esse dataframe possui dois índices, o primeiro é o código do ativo e o segundo a data do pregão, removeremos o primeiro.

**Linha 14. **Aqui copiamos o índex de data para uma coluna no nosso dataframe e por fim reindexamos novamente.

**Linha 20. **Cópia das features de interesse para um novo dataframe.

**Linha 23. **Existem diversas análises técnicas que podemos fazer para acompanhar o valor de uma ação, no nosso caso optaremos pela **Exponential Move Avarage (EMA) **utilizando 21 dias como amostra.

Exponential Move Avarage ou também conhecido por média móvel, é semelhante à média móvel simples (SMA), que mede a direção da tendência ao longo de um período. No entanto, enquanto a SMA simplesmente calcula uma média dos dados de preços, a EMA aplica mais peso aos dados mais atuais. Devido ao seu cálculo exclusivo, a EMA seguirá os preços mais de perto do que uma SMA.

Esse cálculo é feito pelo Pandas TA que é a biblioteca escolhida por conter a maioria das análises técnicas implementadas.

Após o pré processamento, este será o nosso dataframe com o qual trabalharemos.

Para obter uma melhor visualização, realizamos a plotagem da informação dos nossos dados em gráfico.
{% gist https://gist.github.com/LucasDiogo96/5d0051de2ad4444b168db4e4ec805b11.js %}
Aqui podemos observar mais nitidamente o desempenho do valor da ação temporalmente.

## Processamento

Nessa segunda etapa prepararemos nosso modelo utilizando técnicas de Machine Learning para predizer os valores de ações com base em uma projeção de x dias.
{% gist https://gist.github.com/LucasDiogo96/032518556e7a49c0c7b741c16edfd70b.js %}
**Linha 2. **Seleciona features que vão compor o treinamento do modelo.

**Linha 7. **Instanciado o Prophet com parâmetro baseado em cálculo diário.

**Linha 14. **Treinamento no modelo com base no dataframe. Note que estamos usando todos os dados e não particionando-os, pois a ideia é que utilizemos todo como treinamento, e a projeção como teste.

**Linha 16.** Removemos os finais de semana da nossa projeção, pois não há pregões nesses dias e pode interferir no resultado.

Se acompanharmos no console enquanto o nosso modelo é treinado, podemos visualizar algumas informações úteis como o número de iterações realizadas no aprendizado.

![Treinamento visualizado no console.](https://cdn-images-1.medium.com/max/2028/1*9RpeYKZjzYLHszBdyFSZWg.png)

**Linha 20. **Criação da projeção para os próximos 30 dias após a última data de pregão do dataset.

**Linha 23. **Nesse momento, o modelo irá tentar predizer os valores com base no que aprendeu previamente no seu treinamento e irá nos retornar o valor do ativo projetado para o tempo estipulado.

Para entendermos melhor, iremos plotar os resultados em um gráfico.
{% gist https://gist.github.com/LucasDiogo96/9e894d1838ca2180cb543f6cdf3b3899.js %}
Após isso conduziremos uma breve análise.

![Gráfico da regressão realizada onde os pontos em preto são os dados já observados e a linha azul é a predição.](https://cdn-images-1.medium.com/max/2000/1*AjTtNzM29F-9Sxz-0YhnNA.png)

Se olharmos atentamente ao gráfico veremos que nos próximos 30 dias não possuímos nenhuma comparação de valor atual, mas sim somente a linha de predição e é exatamente aqui que está contido a informação de valores futuros.

![Valores projetados](https://cdn-images-1.medium.com/max/2000/1*TzozqBpxRswl7Mo17lExVQ.png)

A variável forecast possui os dados da predição, utilizaremos ela para filtrar por registros com a data maiores que a atual a nossa projeção para um dataframe.
{% gist https://gist.github.com/LucasDiogo96/6356bad4d25983b13c1c97315f102728.js %}
Aqui está o resultado:

Como removemos os finais de semana, sobraram na nossa projeção 20 dias úteis com o respectivo valor de fechamento.

## Validação

Para avaliar o desempenho do nosso modelo é preciso elaborar algumas validações e destacar algumas métricas de assertividade.

A validação cruzada é uma técnica usada com frequência no machine learning para avaliar a variabilidade de um conjunto de dados e a confiabilidade dos modelos treinado com esses dados.

O Prophet inclui uma funcionalidade para validação cruzada de séries temporais para medir o erro de previsão usando dados históricos. Isso é feito selecionando pontos de corte no histórico, e para cada um deles ajustando o modelo usando dados somente até aquele ponto de corte. Assim, você pode entender se o modelo é suscetível a variações nos dados.

Executando o código abaixo obteremos o resultado da cross-validation e das métricas de desempenho do modelo.
{% gist https://gist.github.com/LucasDiogo96/344478bf4c0bd87ed3b3aa792a0d3332.js %}
E esses são os resultados de desempenho do nosso modelo.

![Execução da validação cruzada](https://cdn-images-1.medium.com/max/2000/1*njc4iDgrFG2iSqwv_Jd3ww.png)

As métricas geradas podem também ser visualizas em gráfico.

![](https://cdn-images-1.medium.com/max/2000/1*M0UCsfHKpzfMNQhTmnWNDA.png)

O código completo pode ser encontrado no meu Github:
[**GitHub — LucasDiogo96/Stock-Market-Prediction**](https://github.com/LucasDiogo96/Stock-Market-Prediction)

O valor de mercado de uma ação na bolsa de valores também pode ser afetado por fatores externos ao de uma análise, como uma decisão política ou uma pandemia como foi o ano de 2020.

Da mesma forma, com o avanço constante na área de aprendizado de máquina, estamos munidos de cada vez mais ferramentas e técnicas para automatizar análises que nos ajudem a garantir um bom desempenho como acionistas.

Hora de ficar rico, até a próxima!

![Time is money](https://cdn-images-1.medium.com/max/2000/1*LCJmeYc_63MaZA7CkbcaEQ.gif)

## Referências:

**O que é bolsa de valores e como funciona:** [https://www.btgpactualdigital.com/como-investir/artigos/investimentos/tudo-sobre-bolsa-de-valores](https://www.btgpactualdigital.com/como-investir/artigos/investimentos/tudo-sobre-bolsa-de-valores)

**5 milhões de contas de investidores:** [https://www.b3.com.br/pt_br/noticias/5-milhoes-de-contas-de-investidores.htm](https://www.b3.com.br/pt_br/noticias/5-milhoes-de-contas-de-investidores.htm)

**Exponential Moving Average:** [https://www.fidelity.com/learning-center/trading-investing/technical-analysis/technical-indicator-guide/ema](https://www.fidelity.com/learning-center/trading-investing/technical-analysis/technical-indicator-guide/ema)

**Cross-validation: evaluating estimator performance:** [https://scikit-learn.org/stable/modules/cross_validation.html](https://scikit-learn.org/stable/modules/cross_validation.html)

**B3 atinge 5 milhões de contas de investidores em renda variável em janeiro:** [https://www.b3.com.br/pt_br/noticias/5-milhoes-de-contas-de-investidores.htm](https://www.b3.com.br/pt_br/noticias/5-milhoes-de-contas-de-investidores.htm)