Como Utilizar Machine Learning para Prever Preços de Ações da Bolsa de Valores – O Estudo de Caso Completo.

Você gostaria de ganhar dinheiro com ações na Bolsa ? Já pensou como Machine Learning poderia te ajudar nessa empreitada?

O fato é que o mercado de ações é algo bem complexo,pois, existem diversos fatores que influenciam no preço dos ativos

Fatores estes que sao difíceis de prever, ou ainda, que estão fora do controle até mesmo de profissionais da área.

Esse assunto tem interessado muita gente e existem vários estudos que buscam criar estratégias vencedoras na bolsa.

Como por exemplo, robôs que automatizam as estratégias e operam de forma automática.

Nesse artigo vamos utilizar os preços de uma ação para criar um modelo que irá predizer o valor de fechamento desta.

O objetivo aqui é usar Machine Learning para predizer um valor futuro de uma ação baseado em seu histórico.

Resumo da ópera:

Se você já gostou do assunto desse artigo, não deixe de compartilhar com seus amigos para que cada vez mais pessoas aprendam sobre Machine Learning pode ser usado no mercado de ações.

Aproveite e assine nossa lista para ficar sempre atualizado com novas postagens.

Coloque o seu e-mail abaixo para receber gratuitamente as atualizações do blog!


Dados de Preços e Código

mercado-acoes Machine Learning

O Google Finance é um portal muito interessante onde são disponibilizadas diversas informações sobre Ações e mercados.

Na página de uma ação é possível consultar informações de preços, notícias, balanços e muito mais.

E o mais legal

É possível exportar dados de forma fácil e sem burocracia, tudo isso gratuitamente 🙂

Veja a página da PETR4, ação da PETROBRAS.

Google-finance Machine Learning

Para este artigo utilizei os dados históricos de preços da PETR4 (ações da petrobras) de janeiro de 2010 até abril de 2017.

São dados diários com valor de abertura, valor da máxima, valor da mínima, valor de fechamento e volume do dia.

Ou seja, são dados de valores diários da ação nesse período.

Exportei os dados utilizando o link Historical Prices a esquerda da pagina

Mas não se preocupe, você pode fazer download dos dados aqui

Para acompanhar o artigo segue o notebook com todos os scripts que usei nesse artigo, aqui 😉

Explorando o Dataset

explorando-dataset Machine Learning

Com os dados em mãos vamos visualizar e entender como está sua estrutura.

O primeiro a ser feito é usar o famoso Pandas para ler o arquivo de dados e já exibir a estrutura do arquivo

Dica: Caso você não tenha o pandas instalado, veja como instalar essa e outras ferramentas fundamentais para trabalhar com Big Data no artigo 10 Melhores Ferramentas e Bibliotecas para Trabalhar com Mineração de Dados e Big Data.

dataset-head-prevendo-precos-acoes Machine Learning

Como você pode ver, no dataset temos as colunas mencionadas acima.

Vamos converter a coluna Date para um formato de data propriamente dito (datetime), pois, esta informação está como do tipo string.

Para fazer isso, use o comando abaixo:

Pronto, o comando acima usa a função to_datetime do próprio pandas para converter os valores da coluna Date.

Para ver se funcionou corretamente utilize a função head() novamente:

A função describe do pandas, nos dar uma ótima visão da base de dados, veja:

dataset-head-pandas Machine Learning

Variação dos preços

Veja que temos um total de 1802 linhas, a média, desvio padrão e várias outras informações por colunas.

Como temos dados diários, é importante saber a variação entre o preço de abertura e fechamento do dia.

É comum vermos nos noticiários, coisas como: “Ação X teve 5% de alta no dia de hoje

Ou

Acao Y caiu 3% no dia de hoje

Essa alta ou queda podemos denominar de percentual de variação entre o preço de abertura e fechamento do dia.

O dataset não contém essa coluna, mas podemos gerá-la com a ajuda do pandas:

Pronto, criamos uma coluna chamada Variation que representa a diferença entre o preço de abertura e fechamento do dia.

Visualize usando o método head().

 

Visualizacão de Dados

Vamos agora plotar os dados em um gráfico para uma visualização mais geral.

Para isso iremos plotar o preço de fechamento da ação e a data, dessa forma podemos ver o histórico de preços da ação no período

Para isso usaremos a biblioteca Plotly, pois essa, contém pacotes para plotagem de dados de mercado financeiro além de ser bem elegante 🙂

Para instalar a biblioteca é bem facil, use o comando pip, veja:

Depois de instalar, Importe a biblioteca e habilite o modo offline

Em seguida use o código abaixo para plotar os valores da ação no período

bolsa-valores-valor-por-ano Machine Learning

O gráfico acima mostra o histórico de preço da ação no período da nossa base.

Podemos ver que de lá pra cá o preço da ação só caiu hein?

Mas isso não tem nenhuma relevância neste artigo.

No mercado de ações é bem comum plotar dados de preços (abertura, alta, mínima e fechamento) no padrão candlesticks.

Candlesticks?

Este formato representa os dados na forma de “vela”, onde o corpo, a cor e as pontas representam bem os valores.

No nosso artigo, como temos dados diários de preços, cada candle será referente a um dia

Para entender como é formado o gráfico de candlestick, veja o gráfico de 7 dias abaixo:

candlestick-7dias- Machine Learning

A vela é formada por um corpo e por traços, onde um traço longo para cima, significa uma alta significativa e o contrário nos traços longos para baixo.

O corpo é composto do valor de abertura e fechamento, a vela verde significa que o preço fechou positivo, ou seja, maior que o valor de fechamento do dia anterior.

E um corpo vermelho significa que o preço da ação fechou negativo com relação ao dia anterior.

O tamanho da vela significa variação do preço.

É bem simples interpretar um gráfico de candlesticks, aqui você encontra uma explicação mais completa.

Com o código abaixo plotamos um gráfico dos últimos 6 meses. Lembre-se: cada candle é referente a um dia.

bolsa-petr4-candlestick Machine Learning

A variação dos preços é algo interessante também de plotar, veja o gráfico abaixo e perceba como a preço dessa ação variou.

variacao-fechamento Machine Learning

O gráfico acima fica claro a variância dos preços no período acima.

Coloque o seu e-mail abaixo para receber gratuitamente as atualizações do blog!

Existe alguma correlação entre alguma variável e a classe ?

È legal olhar para o dado para ver se existe uma correlação das features com a classe.

Por exemplo, o preço de abertura é um valor que está próximo do preço de fechamento?

Existe uma correlação entre essas duas variáveis?

No gráfico abaixo plotamos os dados de abertura e fechamento no período de 100 dias atrás

preco-abertura-fechamento Machine Learning

Podemos ver que entre 13,00  até 14.50 os preços de abertura e fechamento estão distantes, mas de 15,00 em diante estes se aproximam mais.

Isso mostra que existem uma grande variação entre o preço de abertura e fechamento.

E o se plotarmos o preço de alta e o preço de fechamento ?

Obs: Os códigos para plotar os gráficos abaixo é o mesmo, só alterar o valor de x. Está tudo no notebook, aqui

correlacao-maxima-fechamento Machine Learning

Talvez possamos dizer o mesmo acima, a medida que o preço vai aumentando esse varia menos do preço de fechamento.

Veja o preço de mínima e o preço de fechamento.

correlacao-minima-fechamento Machine Learning

Aqui a variação é maior ainda.

E por fim, vamos analisar o volume e o preço de fechamento.

correlacao-volume-fechamento Machine Learning

O gráfico acima é interesse que mostra que os preços de fechamento mais altos estão mais concentrados em volumes “médios”, concorda?

Como funciona a Regressão Linear?

robo-bolsa-valores Machine Learning

Na área de Machine Learning Regressão Linear é algo bem comum.

Mas como isso funciona realmente?

É simples você vai ver.

Basicamente, a Regressão Linear é uma técnica que consiste em uma equação linear que usa valores de entrada para predizer valores de saída.

Essa equação utiliza coeficientes que são aplicados a valores de entrada para predizer as saídas.

Esses coeficientes, nesse artigo vou chamar de pesos, acho que facilita mais o entendimento ok?

Os pesos são aplicados aos valores de entrada, para a regressão linear temos pesos para cada valor de entrada.

Os pesos são importantes, pois, ditam como será o nível da regressão, se é algo mais complexo ou mais simples.

O objetivo é aplicar os pesos nos dados de entrada para tentar predizer um valor de saída mais próximo possível do valor real.

Os pesos são ajustados conforme o erro entre o valor real e o valor predito (vou falar mais sobre a função que calcula esse erro mais a frente).

Vejamos um exemplo..

Imagine que temos os dados de entrada (x1,x2,x3) e a saída (y) em {x1, x2, x3, y}

Os pesos vamos chamar de p0,p1,p2,p3

Teríamos a seguinte equação :

y = p0 + p1 * x1 + p2 * x2 + p3 * x3

A equação mostrada acima gera um valor de saída que quando plotado em um gráfico pode ser representada como uma linha reta  (lembra do linear ?).

Por exemplo:

Imagina que os valores de preços de uma dia da PETR4 seja:

Abertura= 12,30

Máxima = 12,35

Minima = 12,20

Fechamento = ?

Agora iremos tentar predizer um valor de fechamento com a equação mostrada acima:

Para os pesos temos os valores:

p0 = 1

p1 = 0,7

p2 = 0,06

p3 = 0,08

Aplicando os valores a equação:

y = p0 + p1 * x1 + p2 * x2 + p3 * x3

1 + 0,7 * 12,30 + 0,06 * 12,35 + 0,08 * 12,20

10,84 + 0,74 + 0,97 = 12,55

Após aplicar a equação nos dados de exemplo tivemos um resultado de predição 12.55

O próximo passo é verificar esse valor com o valor real, e calcular o erro disso.

Por exemplo, se o valor real do fechamento do dia for 12,33 temos que calcular o erro (entre o valor predito e o valor real) e ajustar os pesos novamente.

Esse processo é feito durante todo o processo de treinamento do algoritmo.

Agora que você entendeu como a predição é  feita podemos dizer que os valores preditos podem ser plotados em gráfico como uma reta simples. Veja:

precos-acoes-reta-simples Machine Learning

No gráfico acima, a linha azul seria nossa reta, ou seja, as saída da regressão linear.

Os pontos seriam os dados reais.

A distância entre os pontos e a reta são os erros de cada predição.

Coloque o seu e-mail abaixo para receber gratuitamente as atualizações do blog!


Gradient Descent

gradient-descendent Machine Learning

O que queremos é que os erros sejam minimizados, ou seja, queremos que nosso modelo erre menos possível

O Gradient Descent é a função usada para minimização do erro dos pesos do modelo

Como falado anteriormente os erros são calculados usando técnicas como Mean Squared Error.

Essa técnica calcula o erro médio quadrático entre o valor predito pelo modelo e o valor real.

O Gradient Descent utiliza todos os dados de treinamento de forma interativa para medir o valor dos pesos e fazer os ajustes para que estes errem menos possível

Esse processo é realizado utilizando todas instâncias do treino e os ajustes são feitos gradativamente até que o erro chega a zero.

Para usar essa função é preciso parametrizar a taxa de aprendizado. Essa determina qual o nível de aprendizado em qual iteração do algoritmo.

Vamos chamar esse parâmetro de alpha.

Vejamos um exemplo..

Como mostrado acima, nosso modelo utiliza a equação:

Y = p0 + p1 * x

Isso significa que temos o peso p0 + p1 multiplicado pelo valor de entrada (dados de treino).

Ok, agora como calcular o erro?

Imagine os seguintes valores:

p0= 1

p1 = 0.9

x1 =12,30 (o valor de entrada)

Y = 12,33 (valor real)

Agora vamos jogar isso na equação acima:

Y = 1 + 0.9 * 12.30

Y = 12,07

O valor predito foi 12,07, agora vamos calcular o erro:

erro = 12,07 – 12,33

erro = -0,26

Agora que sabemos o quanto é o erro de predição, temos que atualiza os valores dos pesos para tentar minimizar novos erros.

Update weights..

É isso que o Gradient Descent faz.

A seguinte equação será usada para atualização do peso p0 onde p0(+1) significa o novo valor de p0 e alpha significa o valor da taxa de aprendizado como falado anteriormente.

O erro é o valor obtido anteriormente.

Vamos definir alpha como 0.01

p0(+1) = p0 – alpha * error

Calculando..

p0(+1) = 1 – 0.01 * -0,26

p0(+1) = -0,25

Pronto, já temos o novo valor de p0

Vamos agora fazer o mesmo para p1.

A única diferença é que agora o valor de entrada é usado na equação, pois, o valor de p1 deve ter influência do valor de entrada.

p1(+1) = p1 – alpha * error * x1

p1(+1) = 0.9 – 0,01 * -0,26 * 12,30

p1(+1) = 0,93

Pronto, conseguimos realizar a primeira iteração do Gradient Descent.

Agora temos que atualiza os pesos p0 para -0,25 e p1 para 0,93.

O Gradient Descent repete esse processo para cada instância dos dados de treinamento até os pesos se ajustarem com o mínimo de erro.

A cada ciclo completo damos o nome de época.

Uma imagem vale mais que mil palavras…

gradient-descent-2 Machine Learning

A imagem acima ilustra bem o processo de convergência do Gradiente Descent.

Podemos observar que após várias épocas se consegue chegar no ponto mínimo de erro.

Treinando o modelo e fazendo Previsões

prevendo-precos-acoes-bolsa-valores Machine Learning

Agora que entendemos como a Regressão Linear funciona, vamos treinar o modelo

Queremos predizer o preço de fechamento de um dia da Petr4 certo?

Pois bem, vamos excluir da nossa base de treino a coluna com esses valores.

Para isso vou criar um novo dataframe que conterá somente as colunas necessárias para treinar o modelo

Ok, o dataframe treino só contém as seguintes colunas:

Perceba que não temos mais o preço de fechamento nesse dataframe, pois, é justamente isso que queremos predizer.

Vamos criar um dataframe simples que conterá somente o valor de fechamento, este será usado pelo modelo para ajustar os pesos lembra ?

Queremos um modelo que seja capaz de predizer um preço de fechamento para uma ação se for lhe passado os preços de abertura, alta, mínima e volume.

Mas, antes de fazer predições vamos entender como validar o modelo.

A forma mais eficiente de validar o modelo é com dados que este ainda não viu, ou seja, treina o modelo com uma parte do dado e testar este com outra parte do dado.

Split Dataset

A parte que será usada para treinar o modelo chamamos de treino e a parte que usaremos para testar chamamos de teste.

Dessa forma, o modelo é treinado com uma parte e testado com outra, como em uma situação real.

Usaremos o scikit-learn para fazer essa divisão dos dados para nós, com o método tran_test_split fica fácil, veja:

Não se assuste com o código acima, o que ele faz é dividir o dado em 75% dos dados aleatoriamente para treino e restante para teste. 🙂

O nome já fala por si só, o dataset X_treino recebe a porção de dados que iremos usar para treinar o modelo.

Este contém apenas os dados, sem as classes, veja:

As classes estão em y_treino, veja:

O dataset X_teste estão os dados que iremos usar para testar o modelo (dados que o modelo não conhece) veja:

E as classes deste estão em y_teste, imprima para visualizar.

Vamos criar o modelo, para isso crie um objeto do tipo LinearRegression da biblioteca Scikit-learn.

O meu objeto chama lr_model, agora vou usar o método fit() para treinar o modelo.

O método fit() imprime a saída do modelo treinado, mostrando as configurações definidas, nesse caso usamos as opções padrões.

Com o modelo treinado, podemos visualizar os pesos, lembra deles?

Use o comando abaixo:

Interessante observar que o peso associado a feature valor de abertura (OPEN) está negativo, isso mostra que a maioria dos valores de abertura estão muito acima do valor de fechamento.

Prevendo preços

Para predizer alguma coisa é fácil, use o método predict()

No exemplo abaixo vou usar o dataset X_teste , ou seja, vou passar a parte dos dados separados para teste para testar o modelo.

Veja, que os preços de fechamento foram preditos pelo modelo, (neste exemplo estou imprimindo apenas 10)

Compare os valores de fechamento preditos pelo modelo com os valores reais imprimindo o dataset y_teste(real) e o retorno do método predict() (predict (X_teste))

prevendo-precos-acoes-tabela-resultados

Coloque o seu e-mail abaixo para receber gratuitamente as atualizações do blog!


Validando o modelo

validacao_modelo Machine Learning

Imprimir os resultados é bom para bater o olho e ver a coisa funcionando.

Mas, para validar um modelo, precisamos de uma métrica.

Existem várias, nesse artigo irei utilizar a Root Mean Square Error. Esta é muito usada para medir as diferenças entre os valores reais e preditos pelo modelo.

Essa diferença é normalmente chamada de resíduos que são calculados a partir do desvio padrão dos erros de predição.

metrica-validacao-rmse Machine Learning

Como o RMSE tem a mesma variável que a unidade dependente, por exemplo, no nosso caso, se o valor de fechamento de um dia foi 12,25 e o modelo previu 12,35 teríamos uma diferença de 0,10 (centavos) retornados pelo RMSE.

Com isso poderíamos dizer  que o erro médio é de 10 centavos.

Vamos validar o modelo usando a RMSE, o código abaixo calcula isso, veja:

No código acima, passamos o valor real dos preços (y_teste), a função e o dataset de teste para função predict().

Após isso multiplicamos duas vezes por 0.5 para obter o RMSE.

O erro apresentado foi de 0.15, ou seja, tivemos 0.15 centavos de erro médio em nossas predições.

Nada mau hein 😉

Podemos melhorar o modelo ?

E se construíssemos outro modelo? Será que nossa regressão melhoraria?

Um modelo que use só o preço de abertura e a máxima do dia pode ser interessante para predizer o preço de fechamento?

Vamos testar.

Vou instânciar outra variável que será o novo modelo “lr_model2”.

Veja como ficou o novo treino:

Dividindo o dado…

Treinando o modelo…

Validando o modelo..

Nessa configuração tivemos um erro maior, o modelo se saiu pior na regressão

Tivemos um erro de 0.24, ou seja, um erro médio entre os valores preditos de 0,24.

Isso mostra que apenas as features de preço de abertura e máxima não é legal para predizer um valor de fechamento.

Você pode fazer outros testes, usando outras configurações para construir o modelo.

Conclusão

Na área de Big Data, Regressão Linear é uma técnica bastante usada e muito famosa por apresentar resultados interessantes.

Nesse artigo vimos como funciona a Regressão Linear através de exemplos simples.

Após isso, usamos uma base real de preços da ação da Petrobras (PETR4) para aplicar uma Regressão Linear usando Machine Learning.

Vimos que é possível usar essa técnica para tentar predizer valores de preços com um erro baixo.

Se você gostou desse artigo, não se esqueça de assinar nossa lista de e-mails para receber todo conteúdo de forma gratuita e também compartilhe com seus amigos!

Vamos criar uma comunidade de mineradores 🙂

Coloque o seu e-mail abaixo para receber gratuitamente as atualizações do blog!

  • Joni Santos

    Muito didático e design excepcional! Parabéns Rodrigo! Estou começando a ficar mais familiarizado com Python, vivo ainda no mundo R. Um grande abraço! Parabéns pelo trabalho de compartilhar conhecimento em português! Saudações da Aquarela Advanced Analytics do Sul 🙂

    • Rodrigo Santana Ferreira

      Grande Joni, tudo bem cara?

      Que bom que gostou do artigo. Venha para o mundo python, é legal quanto o R. 🙂

      Abraço e obrigado pelo comentário.

  • Samuel Zimmermann

    olá!
    parabéns pela postagem !
    sou um jovem aprendiz de python e não sei muito sobre Machine Learning
    mas se o fato de fazer regressão linear é Machine Learning então eu seu alguma coisa,
    sei alguns métodos numéricos.
    então minha pergunta é se não poderíamos pensar em ajuste de curva com método de mínimos quadrados?
    talvez conseguiríamos mais proximidade?
    grande abraço e parabéns o/ python 4ever!! !o/

    • Rodrigo Santana Ferreira

      Olá Samuel, tudo bem cara? obrigado pelo comentário.

      Respondendo a sua pergunta, Regressão Linear é sim Machine Learning amigo, você já sabe sim. 🙂

      Quanto ao ajuste da curva, se entendi bem o que você quis dizer, é possível ajustar a curva sim, para isso tem que otimizar o modelo para geração boa dos pesos.

      Grande abraço e conte com a gente para você aprender Machine Learning. Aqui no blog tem vários posts pra quem quer começar do zero. =)

      Um abraço.

      • Samuel Zimmermann

        Estudei todo o seu poste, depois de algumas dificuldade de iniciante, consegui ir até o final, ainda não consegui dominar a técnica, mas estive lendo nos pacotes no site do python e vi que a biblioteca sklearn tem outras formar de fazer regressões. mais um vez muito obrigado e parabéns pelo Artigo.
        poderiamos ter um contato? sou Licenciado em Matemática, mas gosto muito de matemática aplicada e modelagem deixo meu email aqui para podermos conversar mais… ssz.profmat@gmail.com
        att,
        Samuel

        • Rodrigo Santana Ferreira

          Olá Samuel, que bom que conseguiu ir até o final do post. Fico feliz de ter te ajudado amigo.

          Com certeza, é possível fazer regressão de outras formas sim, e é claro que podemos ter mais contato, tanto por aqui ou por e-mail.

          Um abraço, farei contato com você 🙂

  • Gustavo Vzfo

    Parabens!! Rodrigo muito bem explicado .
    Valeu
    Abraço!

    • Rodrigo Santana Ferreira

      Obrigado pelo comentário Gustavo.

      Que bom que gostou do artigo, tamo junto amigo. 🙂