Escolar Documentos
Profissional Documentos
Cultura Documentos
O fato é que o mercado de ações é algo bem complexo,pois, existem diversos fatores que
in uenciam no preço dos ativos
Fatores estes que sao difíceis de prever, ou ainda, que estão fora do controle até mesmo de
pro ssionais 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:
Explorando o Dataset
Visualização de Dados
Gradient Descent
Validando o modelo
Conclusão
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 car sempre atualizado com novas postagens.
[epico_capture_sc id=”1002″]
Dados de Preços e Código
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
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.
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
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.
import pandas as pd
dataset = pd.read_csv('petr4_1_2010_11_2017.csv')
dataset.head()
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.
dataset['Date'] = pd.to_datetime(dataset['Date'])
Pronto, o comando acima usa a função to_datetime do próprio pandas para converter os valores
da coluna Date.
dataset.head()
A função describe do pandas, nos dar uma ótima visão da base de dados, veja:
dataset.describe()
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
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:
dataset['Variation'] = dataset['Close'].sub(dataset['Open'])
Pronto, criamos uma coluna chamada Variation que representa a diferença entre o preço de
abertura e fechamento do dia.
dataset.head()
Visualizacão de Dados
Vamos agora plotar os dados em um grá co 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 nanceiro além de ser bem elegante
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á co de candlestick, veja o grá co de 7 dias abaixo:
A vela é formada por um corpo e por traços, onde um traço longo para cima, signi ca uma alta
signi cativa e o contrário nos traços longos para baixo.
O corpo é composto do valor de abertura e fechamento, a vela verde signi ca que o preço
fechou positivo, ou seja, maior que o valor de fechamento do dia anterior.
E um corpo vermelho signi ca que o preço da ação fechou negativo com relação ao dia
anterior.
É bem simples interpretar um grá co de candlesticks, aqui você encontra uma explicação mais
completa.
Com o código abaixo plotamos um grá co dos últimos 6 meses. Lembre-se: cada candle é
referente a um dia.
A variação dos preços é algo interessante também de plotar, veja o grá co abaixo e perceba
como a preço dessa ação variou.
import matplotlib.dates as mdates
import datetime as dt
x = dataset['Date']
y = dataset['Variation']
plt.plot_date(x,y, color='r',fmt="r-")
plt.xticks(rotation=30)
plt.show()
Por exemplo, o preço de abertura é um valor que está próximo do preço de fechamento?
No grá co abaixo plotamos os dados de abertura e fechamento no período de 100 dias atrás
x = treino.Open[:100]
y = treino.Close[:100]
plt.scatter(x,y,color='b')
plt.xlabel('preco de abertura')
plt.ylabel('preco de fechamento')
plt.axis([min(x),max(x),min(y),max(y)])
plt.autoscale('False')
plt.show()
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.
Obs: Os códigos para plotar os grá cos abaixo é o mesmo, só alterar o valor de x. Está tudo no
notebook, aqui
Talvez possamos dizer o mesmo acima, a medida que o preço vai aumentando esse varia menos
do preço de fechamento.
O grá co acima é interesse que mostra que os preços de fechamento mais altos estão mais
concentrados em volumes “médios”, concorda?
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 coe cientes que são aplicados a valores de entrada para predizer as saídas.
Esses coe cientes, 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}
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á co pode ser
representada como uma linha reta (lembra do linear ?).
Por exemplo:
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:
p0 = 1
p1 = 0,7
p2 = 0,06
p3 = 0,08
y = p0 + p1 * x1 + p2 * x2 + p3 * x3
Após aplicar a equação nos dados de exemplo tivemos um resultado de predição 12.55
O próximo passo é veri car 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á co como uma reta simples. Veja:
No grá co acima, a linha azul seria nossa reta, ou seja, as saída da regressão linear.
Gradient Descent
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.
Vejamos um exemplo..
Como mostrado acima, nosso modelo utiliza a equação:
Y = p0 + p1 * x
Isso signi ca que temos o peso p0 + p1 multiplicado pelo valor de entrada (dados de treino).
p0= 1
p1 = 0.9
Y = 1 + 0.9 * 12.30
Y = 12,07
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) signi ca o novo valor de
p0 e alpha signi ca o valor da taxa de aprendizado como falado anteriormente.
Calculando..
p0(+1) = -0,25
A única diferença é que agora o valor de entrada é usado na equação, pois, o valor de p1 deve
ter in uência do valor de entrada.
p1(+1) = 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.
Podemos observar que após várias épocas se consegue chegar no ponto mínimo de erro.
Agora que entendemos como a Regressão Linear funciona, vamos treinar o modelo
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
features = ['Open','High','Low','Volume']
treino = treino[features]
treino.head(10)
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 ?
y = dataset['Close']
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.
A forma mais e ciente 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 ca 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.
X_treino.head()
y_treino.head()
O dataset X_teste estão os dados que iremos usar para testar o modelo (dados que o modelo não
conhece) veja:
X_teste.head()
Vamos criar o modelo, para isso crie um objeto do tipo LinearRegression da biblioteca Scikit-
learn.
lr_model = LinearRegression()
O meu objeto chama lr_model, agora vou usar o método t() para treinar o modelo.
lr_model. t(X_treino,y_treino)
O método t() imprime a saída do modelo treinado, mostrando as con gurações de nidas, nesse
caso usamos as opções padrões.
Lr_model.coef_
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.
lr_model.predict(X_teste)[:10]
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))
[epico_capture_sc id=”1002″]
Validando o modelo
Imprimir os resultados é bom para bater o olho e ver a coisa funcionando.
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.
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.
Vamos validar o modelo usando a RMSE, o código abaixo calcula isso, veja:
RMSE = mean_squared_error(y_teste, lr_model.predict(X_teste))**0.5
RMSE
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.
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.
lr_model2 = LinearRegression()
features = ['Open','High']
treino2 = treino[features]
treino2.head()
Dividindo o dado…
Treinando o modelo…
lr_model2. t(X_treino,y_treino)
Validando o modelo..
Nessa con guraçã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 con guraçõ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!
[epico_capture_sc id=”1002″]
Artigos Relacionados
CONCEITOS E FUNDAMENTOS CONCEITOS E FUNDAMENTOS DESTAQUES
DESTAQUES
Prevendo a Demanda de
Alugueis de Bicicletas com
Machine Learning
Ver mais
Hey,
o que você achou deste conteúdo? Conte nos comentários.
Muito didático e design excepcional! Parabéns Rodrigo! Estou começando a car 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
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/
Estudei todo o seu poste, depois de algumas di culdade de iniciante, consegui ir até o nal, 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
Olá Samuel, que bom que conseguiu ir até o nal 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 , junho 30, 2017 às 8:17 pm
Olá Luiz, tudo bem? pelo que entendi do erro, você tentou executar o arquivo de notebook? para usar o script
notebook você precisa da ferramenta jupyter. Nesse e-book ensinamos como instalar essa ferramenta, da uma
olhada, forte abraço. https://minerandodados.kpages.online/ferramentas-datascience
Você sabe dizer pq aqui no meu notebook não aparece o link “historical price” para fazer download? No demais, foi bem
explicativo.
Olá Carlos, tudo bem? Também veri quei e parece que o portal do google nance não está mais disponível. Você
pode obter os dados usando o Yahoo Finance, veja esse link
https:// nance.yahoo.com/quote/PETR4.SA/history?p=PETR4.SA
Forte Abraço!
Obrigado Rodrigo! Parabéns pelo trabalho, melhor page de Data Science que conheço.
Opa, obrigado Carlos, que bom que está gostando do nosso conteúdo. Forte Abraço!
Olá Octavio, tudo bem? que bom que gostou do artigo. Também veri quei e parece que o portal do google
nance não está mais disponível. Você pode obter os dados usando o Yahoo Finance, veja esse link
https:// nance.yahoo.com/quote/PETR4.SA/history?p=PETR4.SA
Forte Abraço!
Excelente artigo, Rodrigo gostaria de saber se vc, nao teria algum curso (em vídeo), ou alguns materiais que possa me
indicar, para aprofunde mais no assunto, pois estou querendo usar o assunto como tema do meu TCC.
Cristhian Miguel , março 21, 2018 às 1:03 am
Oi Cristhian, me parece que ao ler o arquivo algumas colunas foram lidas como string.
Ao dar o comando dataset.info() o que é retornado? Este comando mostra os tipos das colunas.
Tenta ler o arquivo forçando o tipo correto:
dataset = pd.read_csv(‘petr4_1_2010_11_2017.csv’, dtype=
{‘Open’: oat,’High’: oat,’Low’: oat,’Close’: oat,’Volume’:int})
Acredito que isso vai resolver.
Um Abraço!
Olá Rodrigo, primeiramente gostaria de agradecer por compartilhar, o conteúdo está muito bem produzido,
parabéns.
Quanto a esse trecho: “Se você quer predizer os valores dos próximos 10 dias, vc precisa treinar o seu algoritmo
para que este consiga predizer T+ 10 por exemplo.”
Poderia ser mais claro? dando algum exemplo de como isso pode ser feito?
Desde já muito obrigado.
Claro, o que quis dizer é que se você quer predizer o valor de fechamento de uma ação ou do índice nos 10 dias
seguintes, você precisar treinar o algoritmo para que este aprenda predizer 10 “fechamentos a diante”
Essa não é uma forma muito comum de trabalhar, pois, acredito que seu modelo não teria muita acurácia para
predizer o valor de fechamento de 10 saídas para a frente.
O que é muito usado é você usar um algoritmo de classi cação para predizer se o dia seguinte será de ALTA ou
NÃOALTA.
Para fazer isso você tem que treinar seus dados da seguinte forma:
ABERTURA, MÁXIMA, MINIMA, FECHAMENTO, SAÍDA
dia1: 10.30 10,50 10,38 10,49 ALTA ( dia 2)
dia2: 10:49 10:55 10:45 10:58 NÃOALTA (dia 3)
Da forma acima, seu algoritmo vai aprender a classi car se o dia seguinte será de ALTA ou NÃO ALTA.
Ai no X_teste você vai passar os dados de hoje para predizer o resultado de AMANHÃ, entendeu?
Forte Abraço.
Felipe Moreira Jorge , maio 1, 2018 às 11:22 am
Ótimo artigo!
Olá, Rodrigo
Esse estudo poderia virar um robô pra já comprar as ações de acordo com esses preços?
Em que plataforma rodaria? MT5?
Ou é só pra te dar a previsão do que vai acontecer, tendo que fazer a compra e a venda na mão.
Abraço
Bom dia Rodrigo, você sabe como obter os dados dos mercados futuros da Bovespa, para commodities agrícolas
comercializadas (Soja, Boi Gordo, etc).
Certo. Essa bloomberg é uma base de dados paga tal como a Thomson Reuters?
Eu vi que tem um pacote no R para extrair os dados dela, contudo não estou conseguindo usar.
Att
Olá
Rodrigo, muito legal o artigo, principalmente para mim que sou apenas um entusiasta no assunto…. Tenho uma dúvida qual
técnica utilizou para estimar o “peso”/coe ciente inicial da regressão antes de iniciar o aprendizado??? No seu exemplo seria
os valores de p0=1 p1=0,7 p2=0,06 p3=0,08….. Abs e sucesso!!!
Olá Rodrigo!
Gostaria primeiramente de parabenizá-lo pelo artigo, material muito bom e extremamente bem explicado!
Mas estou tendo um pequeno problema na hora de importar o Histórico de preços pelo Google Finance, aparece uma
mensagem de erro.
Gostaria de saber se o Google ainda disponibiliza esses dados? e como eu faço para importa-lo?
Curti bastante o post, porém, não faz muito sentido pra mim a usabilidade desse método. Por exemplo, quando o mercado tá
aberto a única informação 100% que você tem é o preço de abertura. O máximo, mínimo, e o volume são desconhecidos até
boa parte do pregão (talvez até o nalzinho dele).. Ao meu ver, seria interessante testar essa estratégia, porém utilizando
somente o preço de abertura como input e colocar o output como preço de fechamento esperado.. Apesar de que seria
praticamente impossível calcular os pesos baseando-se apenas no preço de abertura.. O que acha ? Obrigado pelo post !
Olá Thiago tudo bem? Nesse artigo usei os dados de uma forma didática para mostrar o uso da Regressão
Linear. Com certeza em um cenário real, você entraria com os dados de abertura para predizer o fechamento
sim, seria uma estratégia válida. Como você mesmo disse, com poucas features de entrada, o desempenho da
regressão pode não ser dos melhores. É interessante compor o seu modelo com outras features também, como
técnicas de análise técnica por exemplo.
Obrigado pelo comentário, forte abraço!
Evandro Pezzi , outubro 3, 2018 às 10:29 am
Olá Rodrigo. Para este tipo de problema, onde todas as variáveis são quantitativas, com predição quantitativa. Há algum
outro método de ML que pode ser usado, ou somente a regressão linear mesmo?
Obrigado.
Olá, Rodrigo,
Sou novo na área e quei com uma dúvida em relação ao cálculo do RMSE.
Qual o sentido de “multiplicamos duas vezes por 0.5 para obter o RMSE”?
Abraço!
***
danielacd , novembro 27, 2018 às 6:39 pm
Olá Rodrigo,
você sabe me dizer quantos neurônios existem na camada intermediária?
Obrigada