(PMC)
Yan Uynitu Seles Correa
Resumo— Este trabalho tem como finalidade demonstrar a investimento procuram continuamente soluções desse tipo,
aplicação de Redes Neurais Artificiais, mais especificamente as visando obter altos retornos financeiros [1].
redes Perceptron Multicamadas ou Multilayer Perceptron (MLP)
na previsão de preços no mercado de ações. Com a capacidade II. DEFINIÇÃO DO PROBLEMA
de descobrir padrões em sistemas não-lineares e caóticos, alguns
tipos de redes neurais oferecem a possibilidade de prever as Uma rede neural é um programa de computador que pode
direções do mercado com precisões consideráveis, servindo reconhecer padrões nos dados, aprender com isso e, no caso
como apoio à tomada de decisões no processo de compra e de dados de séries temporais, fazer previsões de valores
venda de ações.
futuros. O uso de uma rede neural demanda tempo para
compreender e limpar os dados, remover erros, pré-processar
I. I NTRODUÇÃO
e pós-processar [2].
Desde os primórdios, o homem sempre buscou por Tudo que é observado e medido, seja uma variável física
soluções ou meios que facilitassem a sua vida. O fogo, a como a temperatura ou o preço de uma ação da bolsa de
roda, as ferramentas e todas as invenções que, de alguma valores são diferentes em pontos distintos do tempo. O
forma, resolveram algum problema da época ou contribuíram reconhecimento clássico de padrões e, com ele, grande parte
para solucionar e criar novos artefatos décadas ou séculos das aplicações das redes neurais, tem sido principalmente
depois e até hoje são utilizados, como exemplo a internet, preocupado em detectar padrões sistemáticos em uma série
talvez uma das maiores invenções da humanidade e que de medições que não mudam no tempo (padrões estáticos).
possibilitou um grande avanço para a raça humana. Aplicações típicas envolvem a classificação dos vetores de
Nos dias atuais, novos problemas surgem todos os dias e entrada em uma classe (problema de classificação) ou a
a busca por suas soluções são incessáveis. Afinal, evoluímos descrição aproximada do valor saída esperado para uma
e o mundo que nos cerca hoje, certamente, sofrerá grandes dada variável ou variáveis (problema de regressão). Quando
variações nos próximos anos. Décadas atrás era inimaginável as mudanças ao longo do tempo também são levadas em
uma pessoa comum conseguir investir seu dinheiro em consideração, a dimensão temporal é inserida. A análise
alguma empresa ou ação, porém, hoje, todos podem e grande desses dados espaço-temporais, ou seja, dados com dimensão
parte da população o faz, necessitando ter apenas um celular espacial e temporal, é geralmente denominada processamento
ou computador com conexão à internet. E é aqui onde está de séries temporais[3]. A Figura 1 serve como exemplo de
o divisor de águas para muita gente: todos podem investir uma série temporal que descreve o valor de uma ação com
mas qual é a maneira correta de se fazer? Com certeza não o decorrer do tempo.
há uma resposta simples e objetiva para esta pergunta, mas
existem ferramentas que podem ajudar na tomada de decisão.
Os investidores têm a difícil tarefa de acompanhar, de
forma contínua, as oscilações do mercado para que suas
estratégias resultem em melhores retornos financeiros. Não
é uma tarefa simples acompanhar as diversas informações
veiculadas em jornais, revistas, televisão, Internet ou outros
canais, depois filtrá-las e analisá-las para tomar uma decisão.
Muitas vezes são utilizadas ferramentas gráficas para acom-
panhar e até mesmo tentar antecipar os riscos do mercado.
Muitos sistemas eletrônicos, disponibilizados por corretoras
e instituições bancárias para seus clientes, baseiam-se nas
informações de liquidez diária das empresas participantes da
Bolsa e em gráficos de tendências. Figura 1. Variação do preço de uma ação ao decorrer dos anos.
Existem várias motivações para tentar prever os preços do
mercado de ações. O mais básico deles é o ganho financeiro. Um tipo de rede neural chamado Multilayer Perceptron
Qualquer sistema que possa sempre escolher vencedores e (MLP) foi introduzido em 1957 para resolver diferentes
perdedores frente a um mercado dinâmico e inconstante problemas combinatoriais [4]. A rede MLP foi utilizada
fará com que seu proprietário fique muito rico. Assim, no problema não linear XOR, também conhecido como ou
muitos indivíduos, incluindo pesquisadores e profissionais de exclusivo, e foi aplicada com sucesso a diferentes problemas
combinatórios. É agora muito usada para processamento de i m p o r t p a n d a s a s pd
informações e reconhecimento de padrões. Por se tratar de i m p o r t numpy a s np
import m a t p l o t l i b . pyplot as p l t
um classificador não linear, várias publicações têm apre-
sentado a rede MLP como uma aproximadora universal de d a t a = pd . r e a d _ c s v ( " . / BVSP . c s v " , u s e c o l s = [ ’
funções, como em [5] e [6], sendo constantemente utilizada D a t e ’ , ’ Open ’ , ’ High ’ , ’Low ’ , ’ C l o s e ’ , ’
Volume ’ ] )
e testada em problemas de predição de séries temporais d a t a [ ’ D a t e ’ ] = pd . t o _ d a t e t i m e ( d a t a [ ’ D a t e ’ ] )
[7]. A Figura 2 mostra a estrutura de uma rede MLP com d a t a . s e t _ i n d e x ( ’ Date ’ , i n p l a c e =True )
6 neurônios na camada de entrada, 4 na primeira camada print ( data . describe () )
oculta, 3 na segunda camada oculta e 1 na camada de saída. Código 1. Importando dados do CSV
scaler = StandardScaler ()
f o r c i n d a t a . columns :
d a t a [ c+ ’ _Norm ’ ] = s c a l e r . f i t _ t r a n s f o r m ( d a t a [ c ] .
to_numpy ( ) . r e s h a p e ( −1 , 1 ) )
Código 4. Normalização dos dados de entrada
sinh(x) ex − e−x
tanh(x) = = x (1)
cosh(x) e + e−x
A NEXOS
A. CÓDIGO FONTE
• Código 13: tratamento dos dados.
• Código 14: criação, treinamento e predição da RNA.
i m p o r t p a n d a s a s pd
i m p o r t numpy a s np
import m a t p l o t l i b . pyplot as p l t
import warnings
i m p o r t m p l f i n a n c e a s mpf
from s k l e a r n . p r e p r o c e s s i n g i m p o r t S t a n d a r d S c a l e r
from k e r a s i m p o r t m o d e l s
from k e r a s i m p o r t l a y e r s
from k e r a s . l a y e r s i m p o r t Dense
warnings . f i l t e r w a r n i n g s ( " ignore " )
# Loading d a t a
d a t a = pd . r e a d _ c s v ( " . / BVSP . c s v " , u s e c o l s = [ ’ D a t e ’ , ’ Open ’ , ’ High ’ , ’Low ’ , ’ C l o s e ’ , ’ Volume ’ ] )
d a t a [ ’ D a t e ’ ] = pd . t o _ d a t e t i m e ( d a t a [ ’ D a t e ’ ] )
d a t a . s e t _ i n d e x ( ’ Date ’ , i n p l a c e =True )
i f DEBUG:
p r i n t ( " Describe " )
print ( data . describe () )
print ( data . info () )
# Remove N u l l
data = data . dropna ( )
mpf . p l o t ( d a t a [ pd . t o _ d a t e t i m e ( ’ 18−04−2020 ’ ) : pd . t o _ d a t e t i m e ( ’ 18−06−2020 ’ ) ] , t y p e = ’ c a n d l e ’ ,
f i g s c a l e = 1 . 0 , volume = F a l s e , s t y l e = ’ c h a r l e s ’ , y l a b e l = ’BVSP ( R$ ) ’ )
d a t a [ ’ Close_Tomorrow ’ ] = d a t a [ ’ C l o s e ’ ] . s h i f t ( −1)
d a t a [ ’ R e t u r n ’ ] = d a t a [ ’ Close_Tomorrow ’ ] − d a t a [ ’ C l o s e ’ ]
i f DEBUG:
print ( data )
# S p l i t t i n g t h e d a t a ( t r a i n , v a l i d a t i o n and t e s t )
# Train
t r a i n = d a t a [ pd . t o _ d a t e t i m e ( ’ 04−01−2010 ’ ) : pd . t o _ d a t e t i m e ( ’ 31−12−2017 ’ ) ]
t r a i n _ x = d a t a [ [ ’ Open_Norm ’ , ’ High_Norm ’ , ’ Low_Norm ’ , ’ Close_Norm ’ , ’ Volume_Norm ’ ] ] . to_numpy ( )
t r a i n _ y = d a t a [ [ ’ Return_Norm ’ ] ] . to_numpy ( )
# Validation
v a l = d a t a [ pd . t o _ d a t e t i m e ( ’ 01−01−2018 ’ ) : pd . t o _ d a t e t i m e ( ’ 31−12−2018 ’ ) ]
v a l _ x = v a l [ [ ’ Open_Norm ’ , ’ High_Norm ’ , ’ Low_Norm ’ , ’ Close_Norm ’ , ’ Volume_Norm ’ ] ] . to_numpy ( )
v a l _ y = v a l [ [ ’ Return_Norm ’ ] ] . to_numpy ( )
# Test
t e s t = d a t a [ pd . t o _ d a t e t i m e ( ’ 01−01−2019 ’ ) : pd . t o _ d a t e t i m e ( ’ 18−06−2020 ’ ) ]
t e s t _ x = t e s t [ [ ’ Open_Norm ’ , ’ High_Norm ’ , ’ Low_Norm ’ , ’ Close_Norm ’ , ’ Volume_Norm ’ ] ]
t e s t _ y = t e s t [ [ ’ Return_Norm ’ , ’ R e t u r n ’ ] ]
Código 13. Código fonte da RNA implementada e utilizada neste trabalho - Tratamento dos dados
# C r e a t i n g MLP Model
model = m o d e l s . S e q u e n t i a l ( )
model . add ( l a y e r s . Dense ( 3 0 , i n p u t _ d i m = t r a i n _ x . s h a p e [ 1 ] , a c t i v a t i o n = " t a n h " ) )
model . add ( l a y e r s . Dense ( 3 0 , a c t i v a t i o n = " t a n h " ) )
model . add ( l a y e r s . Dense ( 3 0 , a c t i v a t i o n = " t a n h " ) )
model . add ( l a y e r s . Dense ( 1 ) )
model . summary ( )
model . c o m p i l e (
o p t i m i z e r = ’ adam ’ ,
loss = ’ mean_squared_error ’ ,
)
# T r a i n i n g MLP
r e s u l t s = model . f i t (
train_x , train_y ,
epochs= 1000 ,
b a t c h _ s i z e = 128 ,
v a l i d a t i o n _ d a t a = ( val_x , val_y ) ,
verbose = 0
)
# P l o t t i n g T r a i n i n g and V a l i d a t i o n E r r o r s
p l t . p l o t ( r e s u l t s . h i s t o r y [ " l o s s " ] , l a b e l =" l o s s " )
p l t . p l o t ( r e s u l t s . h i s t o r y [ " v a l _ l o s s " ] , l a b e l =" v a l _ l o s s " )
p l t . legend ( )
p l t . show ( )
# P r e d i c t a l l T e s t Data
p r e d = model . p r e d i c t ( t e s t _ x )
pred = s c a l e r . i n v e r s e _ t r a n s f o r m ( pred )
# Show R e s u l t s
p r i n t ( ’ Acc : ’ , t e s t _ y [ ’ H i t ’ ] . mean ( ) )
i n i t i a l _ i n v e s t m e n t = d a t a [ pd . t o _ d a t e t i m e ( ’ 01−01−2019 ’ ) : ] . h e a d ( 1 ) [ ’ Open ’ ]
p r i n t ( ’ I n i t i a l I n v e s t m e n t : R$ \ n ’ , d a t a [ pd . t o _ d a t e t i m e ( ’ 01−01−2019 ’ ) : ] . h e a d ( 1 ) [ ’ Open ’ ] )
p r i n t ( ’ R e t u r n o f S t r a t e g y (RNA) : R$ ’ , t e s t _ y [ ’ I n v e s t m e n t _ R e t u r n ’ ] . sum ( ) , ’ Buy & Hold : R$ ’ , (
t e s t _ y [ ’ R e t u r n ’ ] . sum ( ) + i n i t i a l _ i n v e s t m e n t ) )
Código 14. Código fonte da RNA implementada e utilizada neste trabalho - Criação da RNA treinamento e predição