Você está na página 1de 61

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO SUL DE

MINAS GERAIS – CAMPUS PASSOS

Juliano Belfort Monteiro Junior

Identificação de Arquiteturas Factíveis de Redes Neurais Artificiais


Aplicadas à Predição de Séries Temporais Financeiras

PASSOS, MG
2019
Juliano Belfort Monteiro Junior

Identificação de Arquiteturas Factíveis de Redes Neurais Artificiais


Aplicadas à Predição de Séries Temporais Financeiras

Trabalho de Conclusão de Curso apresentado ao


IFSULDEMINAS como parte das exigências do
curso de graduação em bacharelado em Ciência da
Computação para a obtenção do título de Bacharel
em Ciência da Computação.

Orientador: Prof. Me. Hugo Resende

PASSOS, MG
2019
Dedico este trabalho especialmente aos meus pais
Isabel e Juarez, e também a minha família, por todo
o apoio durante minha vida acadêmica e pessoal.
AGRADECIMENTOS

Aos meus pais, Isabel e Juarez e ao meu irmão, Peterson, por sempre me
apoiarem durante a minha vida e pelo carinho, amizade, paciência, conselhos e
compreensão em diversos momentos.
À minha namorada, Bruna, pela paciência, carinho, auxílio durante essa
etapa, por ser uma amiga e pelos diversos momentos de distração.
A minha família, especialmente aos meus avós Nilza e Waldelar e ao meu tio
Thiago, pelo apoio, auxilio, compreensão e por me guiarem em momentos difíceis.
Ao meu orientador, Hugo, pela ajuda, tempo reservado, motivação,
compreensão, conversas descontraídas e por ser um amigo nessa etapa.
Ao professor Taffarel, pelo auxilio corrigindo tantos erros, pela paciência e
por toda atenção dada em preparar os alunos para esse momento.
Aos meus companheiros, especialmente ao Alan, ao Alysson, ao João, a
Joyce, ao Rafa e a Vanessa, por toda a ajuda, torcida, dificuldades compartilhadas,
madrugadas em claro, momentos de comemoração e auxilia durante essa etapa.
Aos professores do IFSULDEMINAS, por reservarem seu tempo, dedicação
e paciência para nos capacitar academicamente e nos preparar para o mercado de
trabalho.
A todos que já torceram pelo meu sucesso nessa etapa da minha vida e no
restante dela.
Obrigado!
“Não prever, é já lamentar.”
-Leonardo da Vinci
RESUMO

Os investimentos no mercado acionário, os quais são efetuados por pessoas físicas


e jurídicas, são uma das formas mais utilizadas para se gerar renda atualmente. A
ocorrência dessas aplicações pode significar, particularmente para o investidor,
uma ação de risco, visto que pode resultar em lucros ou prejuízos. Com base nessa
informação e buscando um meio de solucionar esse problema, muitos
pesquisadores utilizam de técnicas da Inteligência Artificial em busca da predição
dos valores dos investimentos, e assim, evitar riscos potenciais. A fim de solucionar
tais problemas, grande parte dos trabalhos da literatura utilizam Redes Neurais
Artificiais (RNAs) na construção de soluções, o que por consequência tende a exigir
um certo esforço para a modelagem das redes. Nesse sentido, este trabalho
apresenta arquiteturas factíveis da Rede Neural Perceptron de Múltiplas Camadas,
quando aplicadas a um conjunto de dados financeiros do Índice Bovespa em um
período específico de tempo. Espera-se através do uso dessas arquiteturas, reduzir
o tempo de modelagem e carga de trabalho dos pesquisadores que as utilizarem e
também incentivar os investidores (através da predição de quedas nos valores das
ações) que desistem ou sentem insegurança ao investir no mercado acionário.
Inicialmente, mostrou-se necessário, através de um Web Crawler Agent, coletar os
dados a serem utilizados para a modelagem das redes e, como um passo seguinte,
através da biblioteca Keras (em linguagem Python), implementar a RNA
selecionada com e sem o uso da biblioteca. Após definir as arquiteturas (soluções
candidatas), combinadas com variados valores de parâmetros, foi realizada a etapa
de treinamento de cada uma delas. Ao se comparar os resultados obtidos, foram
computados os valores de acurácia de cada arquitetura. Desse modo, foi possível
ao final do trabalho proporcionar aos pesquisadores que buscam predizer os valores
do Índice Bovespa, as melhores arquiteturas obtidas durante o desenvolvimento
deste trabalho. Além disso, as arquiteturas obtidas também podem ser utilizadas
por investidores, os quais podem utilizar dos valores obtidos (pelas arquiteturas)
para não realizar investimentos em momentos de queda (dos valores das ações).
Tais arquiteturas mostraram-se capacitadas de predizer valores com uma taxa de
erro aceitável (conforme a literatura), possibilitando através do uso dessas
arquiteturas a redução na carga de trabalho e do tempo demandado ao se trabalhar
com RNAs.

Palavras-chave: Predição de Valores Financeiros. Arquiteturas de Redes Neurais


Artificiais. Keras.
LISTA DE TABELAS

Tabela 1 – Principais componentes do SFN. ........................................................ 18

Tabela 2 – Base de dados..................................................................................... 37

Tabela 3 – Relação de Neurônios por Camada. ................................................... 40

Tabela 4 – Base de dados de entradas e saídas esperadas................................. 52


LISTA DE ILUSTRAÇÕES

Figura 1 – Mercado Financeiro Segmentado. ....................................................... 19

Figura 2 – Estrutura do mercado de capitais ......................................................... 20

Figura 3 – Hierarquia de Aprendizado ................................................................... 24

Figura 4 – Modelo não-linear de um neurônio. ...................................................... 25

Figura 5 – Rede neural de camada simples. ......................................................... 27

Figura 6 – Rede neural de múltiplas camadas. ..................................................... 28

Figura 7 – Código de requisição e manipulação. .................................................. 36

Figura 8 – Valores do Índice Bovespa no período de oito anos. ........................... 38

Figura 9 – Trecho de código-fonte utilizado na elaboração da primeira RNA. ...... 42

Figura 10 – Trecho de código-fonte utilizado na elaboração da segunda RNA. ... 43

Figura 11 – Arquitetura da MLP1. ......................................................................... 45

Figura 12 – Arquitetura da MLP2. ......................................................................... 46

Figura 13 – Arquitetura inicial da MLP1. ............................................................... 47

Figura 14 – Arquitetura final da MLP1. .................................................................. 48

Figura 15 – Arquitetura inicial da MLP2. ............................................................... 49

Figura 16 – Arquitetura final da MLP2. .................................................................. 50

Figura 17 – Comparativo dos resultados de cada arquitetura (fase de treinamento)


com os valores reais. ............................................................................................ 51

Figura 18 – Comparativo dos resultados de cada arquitetura (fase de testes) com


os valores reais. .................................................................................................... 52

Figura 19 – Percentual do resultado de cada arquitetura. ..................................... 53


LISTA DE EQUAÇÕES

Equação 1 – Cálculo do Índice de Negociabilidade .............................................. 21

Equação 2 – Cálculo do Índice Bovespa ............................................................... 22

Equação 3 – Função de ativação sigmoide logística ............................................. 29

Equação 4 – Função de ativação linear ................................................................ 29

Equação 5 – Cálculo de normalização da entrada ................................................ 30

Equação 6 – Cálculo de normalização da saída ................................................... 30

Equação 7 – Cálculo de desnormalização da saída .............................................. 30


LISTA DE ABREVIATURAS E SIGLAS

AM Aprendizado de Máquina
IA Inteligência Artificial
IBOV Índice Bovespa
IN Índice de Negociabilidade
LSTM Long-Short Term Memory/Memória de Longo Prazo
MLP Multilayer Perceptron/Perceptron de Múltiplas Camadas
MSE Mean Square Error/Erro Médio Quadrático
NARX Nonlinear Autoregressive Network with Exogenous Inputs/Rede
Neural Auto-Regressiva Com Entradas Exógenas
RN Rede Neural
RNA Rede Neural Artificial
RMSE Root Mean Square Error/Raiz do Erro Médio Quadrático
SFN Sistema Financeiro Nacional
WCA Web Crawling Agent
LISTA DE SÍMBOLOS

∑ Função de Agregação.
Θ Limiar/Threshold.
Φ Função de Ativação.
SUMÁRIO

1 INTRODUÇÃO ........................................................................................................ 14

1.1 Objetivo Geral ..................................................................................................... 16

1.2 Objetivos Específicos ........................................................................................ 16

2 REFERENCIAL TEÓRICO ...................................................................................... 17

2.1 Mercado Financeiro e Conceitos Relacionados ............................................... 17

2.1.1 Mercado de Capitais .......................................................................................... 19

2.1.2 BM&FBovespa ................................................................................................... 20

2.1.3 Séries Temporais ............................................................................................. 22

2.2 Inteligência Artificial ........................................................................................... 23

2.2.1 Rede Neural Perceptron de Múltiplas Camadas ................................................ 27

2.3 Tecnologias para a Programação de Redes Neurais Artificiais...................... 31

2.4 Métricas de Desempenho................................................................................... 32

2.4.1 Erro Quadrático Médio ....................................................................................... 32

2.4.2 Raiz do Erro Quadrático Médio .......................................................................... 33

3 MATERIAL E MÉTODOS ........................................................................................ 34

3.1 Técnicas e Tecnologias Envolvidas .................................................................. 34

3.2 Implementação do Web Crawler Agent ............................................................. 35

3.3 Base de Dados .................................................................................................... 37

3.4 Arquiteturas Iniciais e Técnicas de Predição ................................................... 38

3.5 Implementação das RNAs .................................................................................. 40

3.6 Validação das arquiteturas ................................................................................ 44

4 RESULTADOS E DISCUSSÕES ............................................................................ 45

4.1 Análise das arquiteturas .................................................................................... 45

4.2 Análise das saídas obtidas ................................................................................ 50

5 CONCLUSÃO ......................................................................................................... 56

5.1 Limitações e Trabalhos Futuros ........................................................................ 57

REFERÊNCIAS BIBLIOGRÁFICAS .......................................................................... 59


14

1 INTRODUÇÃO

Nos últimos anos, os investimentos no mercado financeiro se tornaram cada


vez mais comuns na sociedade atual, visto que são uma das formas mais utilizadas
por muitas pessoas para conseguir aumentar as suas rendas. Segundo dados da
BM&FBOVESPA (2018), em agosto de 2018, o número total de investidores
(pessoas físicas e jurídicas) era de 762.075 e o valor total de investimentos era
aproximadamente 183 bilhões de reais.
De modo a se obter uma maior liquidez nas transações financeiras, diversos
investidores se baseiam em índices da Bolsa de Valores. Um dos principais
indicadores de desempenho do mercado de ações brasileiro é o Índice Bovespa
(IBovespa - IBOV). Tal indicador é obtido por meio de um cálculo que utiliza os
valores das ações de empresas com maior liquidez e volume financeiro negociado
(CAVALCANTE, 2002). Por exemplo, ao final de abril de 2019 foi observado um
IBOV de 94.578,26 pontos e, conjunto a esse valor, o volume financeiro negociado
foi de aproximadamente 15 milhões de reais, obtidos em um total de 1.476.780
negócios (BM&FBOVESPA, 2019). A partir desses dados é possível perceber as
dimensões de pessoas e capital envolvidos no mercado financeiro.
Com o objetivo de tentar predizer futuras quedas de valores de ações,
diversos pesquisadores utilizaram abordagens que implementam técnicas
encontradas na literatura computacional. Em particular, foram observados trabalhos
que utilizam de técnicas da Inteligência Artificial (IA), como Redes Neurais Artificiais
(RNAs), Aprendizagem de Máquina (AM), Support Vector Machine, Algoritmos
Genéticos, Lógicas Fuzzy, entre outras (SCARPEL, 2005; SOUZA, 2017;
WUERGES; BORBA, 2010).
Uma característica observada foi que grande parte dos trabalhos apresenta
métodos que fazem uso de RNAs na construção de soluções. Essas técnicas
baseadas propriamente em uma estrutura de neurônios biológicos organizada
geralmente em camadas, se utiliza de paradigmas de aprendizado supervisionado
e não-supervisionado, para realizar a classificação de vários tipos de dados,
reconhecer padrões e realizar a predição de valores (HAYKIN, 2009).
Nesse sentido, Dametto (2018) e de Barros Franco e Steiner (2014)
propuseram a utilização das RNAs Perceptron de Múltiplas Camadas (MLP), com o
Modelo Auto-Regressivo Não-Linear com Entradas Exógenas (NARX) e
15

Recorrentes de Memória de Longo Prazo (LSTM) para tentar prever séries


temporais financeiras. Particularmente, nesses trabalhos foi observado que os
modelos propostos encontraram maiores problemas na otimização dos dados de
entrada e na definição de uma arquitetura ótima para cada Rede Neural (RN). A
definição de uma arquitetura ótima para uma RN geralmente demanda um tempo
considerável de modelagem pelos pesquisadores, os quais devem alcançá-la por
meio de tentativas de diferentes combinações de parâmetros (NORVIG; RUSSELL,
2014).
Com base no exposto, este trabalho fundamentou-se em encontrar
arquiteturas eficientes para uma rede neural artificial do tipo MLP, que fossem
capazes de predizer futuros valores do Índice Bovespa. De modo a possibilitar o
desenvolvimento das arquiteturas, foi necessário coletar dados a serem utilizados
como amostragem, ou seja, os valores a serem utilizados em cada arquitetura. De
posse desses dados a rede neural artificial seria capaz de manipular os dados e
conseguir predizer os futuros valores da melhor maneira possível.
Com a capacidade de prever esses valores, as arquiteturas de redes neurais
artificiais poderiam contribuir com as duas vertentes de pesquisa deste trabalho,
tanto a econômica (mercado acionário), quanto a computacional (redes neurais
artificias). Fornecer uma arquitetura eficiente poderia reduzir consideravelmente a
carga de trabalho e o tempo reservado para a modelagem de uma RNA por parte
do pesquisador que utilizar tal arquitetura. Geralmente quando se trabalha com
redes neurais, utiliza-se de métodos empíricos para obtenção de uma solução
candidata, por esse motivo esse processo é pode ser demorado, realizando testes
de diversas arquiteturas possíveis, bem como uma quantidade de iterações que
pode ser valores relativamente altos ou não.
Além dessa contribuição, essas arquiteturas poderiam contribuir para outros
problemas, esses relacionados ao mercado financeiro (especificamente ao
investidor). A primeira delas é que com a utilização de uma arquitetura eficiente é
possível predizer futuras quedas nos valores das ações e, de posse dessa
informação, evitar investir no momento em que a queda foi prevista. Por fim, outra
contribuição seria utilizar da arquitetura para evitar que os investidores desistam de
investir no mercado acionário devido a prejuízos obtidos, isso poderia ser realizado
através de alertas a respeito de futuras quedas repentinas.
16

Posteriormente a coleta desses dados, fez-se necessário definir qual a


quantidade ideal de neurônios da(s) camada(s) oculta(s) para que o treinamento
fosse mínimo e a classificação mais precisa. De posse dessa quantidade, foi
necessário obter quais os valores de parâmetros otimizados para cada arquitetura
e definir quais funções de ativação seriam utilizadas, visando a convergência da
rede em um intervalo de tempo tolerável. Neste trabalho, em particular, foi feita uma
análise comparativa de diferentes arquiteturas da rede neural artificial MLP, as quais
foram obtidas utilizando a biblioteca Keras, aplicadas à predição de valores no
mercado financeiro.

1.1 Objetivo Geral

Analisar as diferentes arquiteturas da rede neural MLP, a fim de se identificar


arquiteturas eficientes a serem aplicadas na predição de valores do mercado
financeiro, especificamente do Índice Bovespa.

1.2 Objetivos Específicos

● Revisar a literatura correlata e definir quais RNAs a serem investigadas;


● Pesquisar e definir qual a biblioteca e qual a linguagem de programação a
ser utilizada para implementar as redes neurais;
● Realizar a coleta dos dados a serem utilizados posteriormente para o
treinamento da rede e testes de eficácia da arquitetura;
● Padronizar os valores para utilizá-los nas redes e implementar as RNAs com
as arquiteturas iniciais;
● Coletar os resultados obtidos por cada rede e compará-los com os valores
reais alcançados pelo Índice Bovespa;
● Realizar ajustes nas arquiteturas até que um erro tolerável no valor da saída
seja alcançado;
● Verificar se os resultados obtidos foram satisfatórios, caso contrário realizar
pequenos ajustes em parâmetros das RNAs;
● Analisar e documentar os resultados.
17

2 REFERENCIAL TEÓRICO

Na tentativa de predizer quaisquer valores do mercado financeiro, são


utilizados diversos métodos e técnicas de áreas distintas, seja no estudo das ações,
obtenção de dados, utilização de cálculos estatísticos ou em outras tarefas
inerentes à predição. Buscando um melhor entendimento e compreensão, fez-se
necessária a exposição de alguns conceitos e técnicas que foram utilizadas no
decorrer deste trabalho, bem como a sua explicação. Nesse sentido, este capítulo
apresenta os principais conceitos envolvidos com o presente trabalho.
Na Seção 2.1 apresentam-se aspectos relacionados ao mercado de ações,
bem como a descrição de alguns termos técnicos. Na Seção 2.2 realiza-se uma
breve introdução à Inteligência Artificial, particularmente sobre o funcionamento da
arquitetura de uma rede neural, com foco nas técnicas que foram utilizadas neste
trabalho. A Seção 2.3 aborda uma breve introdução da linguagem de programação
Python e uma descrição acerca da biblioteca selecionada como ferramenta auxiliar
para a implementação da RNA. Por fim, a Seção 2.4 descreve as métricas de
desempenho que foram utilizadas para realizar a comparação de eficácia dos
resultados.

2.1 Mercado Financeiro e Conceitos Relacionados

O Sistema Financeiro Nacional (SFN) é um conjunto de entidades e


instituições, públicas ou privadas, e de regras que possuem como objetivo viabilizar
a intermediação financeira, ou seja, realizar a troca de recursos entre indivíduos
deste meio caracterizados como deficitários ou superavitários. Por meio desse
sistema que as pessoas, empresas e o governo realizam a circulação de seus bens,
pagam dívidas e fazem investimentos (BANCO CENTRAL DO BRASIL, s.d;
BM&FBOVESPA, 2017).
O SFN é organizado de modo a manter um equilíbrio entre as partes que o
compõem. Os Órgãos Normativos são responsáveis por determinar as regras e
diretrizes que fazem com que o sistema funcione de maneira adequada. As
18

Entidades Supervisoras buscam fazer com que os outros integrantes do SFN sigam
as regras definidas pela entidade anterior. Por fim, os Operadores são as entidades
e instituições que compõem o mercado financeiro brasileiro, as quais realizam o
papel intermediário na troca de recursos. Na Tabela 1 são apresentados alguns dos
componentes que fazem parte do SFN.

Tabela 1 – Principais componentes do SFN.

Órgãos Normativos Entidades Supervisoras Operadores do Sistema

Instituições Financeiras,
Banco Central do Brasil Intermediários Financeiros e
Conselho Monetário
Administradores
Nacional
Comissão de Valores Bolsa de Mercadorias e
Mobiliários Futuros e Bolsa de Valores
Sociedades de
Conselho Nacional de Superintendência de
Capitalização e
Seguros Privados Seguros Privados
Seguradoras
Conselho Nacional de Secretaria Nacional de Entidades de Previdência
Previdência Complementar Previdência Complementar Complementar

Fonte: Adaptado de BM&FBovespa (2017).

A existência de diversas instituições, instrumentos e entidades citadas na


Tabela 1, como os operadores do SFN, fez com que fosse desenvolvido um
ambiente propício para negociações entre deficitários e superavitários, realizando
transações de moedas, títulos, ações (capitais), entre outros. Em operações
envolvidas dentro do conceito de mercado financeiro existem dois tipos distintos de
investimentos: a Renda Fixa, que possui uma maior estabilidade no rendimento do
investimento, e a Renda Variável (bolsa de valores), um ambiente de compra e
vendas de ações, a qual possui rendimento indefinido. O conceito de mercado
financeiro é bem amplo e extenso e conta com diversos conceitos distintos, dentre
eles o mercado de capitais (BM&FBOVESPA, 2017). A Figura 1 ilustra a estrutura
do mercado financeiro.
19

Figura 1 – Mercado Financeiro Segmentado.

Fonte - Adaptado de BM&FBovespa (2017).

Este trabalho teve como foco o estudo e o compreendimento do mercado de


capitais, sendo exigidos apenas conceitos básicos de outros mercados, que serão
explicados ao longo do texto.

2.1.1 Mercado de Capitais

O conceito do mercado de capitais está paralelo ao de mercado financeiro,


visto que os mesmos conjuntos de instituições e de instrumentos realizam
negociações, por meio de títulos e valores mobiliários. O surgimento dessas novas
negociações se deve ao fato de que o mercado de crédito não estava mais
atendendo algumas necessidades, por exemplo, não conseguia atender o prazo na
garantia do fluxo de recursos. Com base nessa informação, o Mercado de Capitais
tem como objetivo direcionar recursos de compradores para vendedores, ou seja,
distribuir valores mobiliários, buscando viabilizar capitalização e dar liquidez a títulos
de empresas (PINHEIRO, 2018).
No conceito de mercado acionário, tanto os seus objetivos quanto o seu
surgimento são fundamentados em dois princípios básicos: (i) operar como um
impulsionador de capitais para a realização de investimentos, buscando através
disso colaborar para o desenvolvimento econômico do país e estimular a criação de
poupança privada; e (ii) fornecer orientação para estruturar a sociedade de uma
20

forma pluralista, que seja baseada na economia de mercado, fazendo com que a
participação coletiva em tal economia ocorra de forma ampla, atuando incisivamente
nos resultados e riquezas da economia.
Após a compreensão dos pilares que fundamentam o mercado tratado nesta
subseção, foi necessário abordar o seu funcionamento. O mercado acionário é
classificado em duas etapas, as quais são o Mercado Primário, que é o principal
responsável pela inserção dos recursos nas empresas, e o Mercado Secundário, o
qual retrata cada transação entre as partes envolvidas. Na Figura 2 é ilustrada a
estrutura do mercado de capitais e algumas funcionalidades.

Figura 2 – Estrutura do mercado de capitais

Mercado Primário

● Criação de Títulos: negociações são realizadas para a venda de ações para o


público;
● Capitalização das Empresas: através da venda citada na Criação de Títulos, as
empresas recebem recursos para empreendimentos;
● O mercado primário atua como condutor de recursos dos poupadores para
investimento em atividades produtivas.

Mercado Secundário

● Negociação de Títulos: compra e venda de títulos e qualquer transação que envolva


os títulos do mercado primário;
● Troca da Propriedade do Título: transferência da posse da ação comprada;
● Proporciona liquidez aos títulos e incentiva o mercado primário.

Fonte: Adaptado de Pinheiro (2018).

O foco de estudo tratado neste trabalho foi o mercado secundário, cujo


ambiente é a bolsa de valores (Bovespa), além disso fez-se necessário explicar
alguns termos, valores e índices que serão abordados na próxima subseção.

2.1.2 BM&FBovespa

O conceito de bolsa de valores existe desde a época em que se iniciaram as


negociações entre os comerciantes. Com a evolução e a necessidade de mudança
nas transações, esse conceito sofreu algumas alterações. Até que no ano de 1531,
na Bélgica, surgiu a primeira bolsa de valores (ou praça de comércio) oficial,
designada por Nieuve Beurse (PINHEIRO, 2018).
21

Esse acontecimento histórico fez com que muitas outras bolsas de valores
surgissem posteriormente pelo mundo e, em 1991 se iniciou o processo de
consolidação das bolsas de valores brasileiras. Inicialmente, tais praças de
comércio foram incorporadas por duas instituições, a BM&F e a Bovespa, que no
futuro deixariam de possuir fins lucrativos e integrariam suas operações, se
unificando e originando a atual BM&FBovespa.
Atualmente, a BM&FBovespa proporciona local, condições e sistema para a
prática de negociações de compra e venda de títulos e valores mobiliários. Além
disso, realiza uma análise do comportamento do mercado por meio de diversos
índices. Geralmente, cada índice específico é um indicador de desempenho de um
determinado conjunto de ações, que permite o acompanhamento da valorização de
tais ações ao longo do tempo.
Cada um dos índices medidos pela BM&FBovespa indica um valor obtido por
meio da realização de um cálculo. Esses valores são separados em setores, que
podem ser definidos como amplos, setoriais, de sustentabilidade, de governança ou
de segmento. Devido à sua grande utilização no mercado financeiro, abordou-se
neste trabalho o índice amplo conhecido como Bovespa (ASSAF NETO, 2018;
PINHEIRO, 2018).
O IBOV é um valor continuamente atualizado após um período de tempo e
que possui como finalidade indicar o desempenho das negociações na bolsa. Para
se realizar o cálculo desse valor utiliza-se do Índice de Negociabilidade (IN), que
define as quantidades teóricas de cada ativo que integrará o IBOV. Porém,
primeiramente, é necessário formalizar os ativos que farão parte da operação, para
que atendam a alguns critérios, dentre eles a liquidez e o volume financeiro, que
são, respectivamente, as ações com maior quantidade de negociações na bolsa e
as ações com maior montante de dinheiro transacionado (BM&FBovespa, 2017).
Após a seleção com base nas especificações, é realizado o cálculo que é
representado pela Equação 1, a qual compreende a estimativa do IN.

3 𝑁𝑎 𝑉𝑎 2
 × ( )
𝐼𝑁  =   ∑𝑃𝑖=1 √ 𝑁 𝑉
(1)
𝑃
22

Na Equação 1, Na diz respeito à quantidade de negócios com o ativo, N é a


quantidade total de negócios, Va é o volume financeiro gerado pelo ativo, V denota
o volume financeiro total, e P é o valor total de pregões1 no período i
(BM&FBOVESPA, 2017).
Consequente à obtenção da quantidade de cada ativo e os seus valores
ponderados, é possível finalmente calcular o IBOV. A definição deste índice, em alto
nível, é o valor de desempenho do conjunto de empresas (ativos selecionados) do
mercado. O cálculo do IBOV é feito ao se utilizar dos valores obtidos na Equação 1,
provenientes das empresas com melhor liquidez e volume financeiro. A Equação 2
descreve o cálculo do IBOV.

𝐼𝑏𝑜𝑣𝑒𝑠𝑝𝑎𝑡 = ∑𝑛𝑖=1 𝑃𝑖,𝑡 × 𝑄𝑖,𝑡 (2)

Na Equação 2, Ibovespat diz respeito ao valor do IBOV no instante t, n é o


número total de ações, Pi,t é o último preço da ação i no instante t, e Qi,t é a
quantidade teórica da ação i no instante t (BM&FBOVESPA, 2017).

2.1.3 Séries Temporais

As Séries Temporais podem ser utilizadas para mensurar valores voltados a


diversos cunhos de pesquisa, por exemplo, o número médio anual de manchas
solares, a precipitação atmosférica, os índices da bolsa de valores e o registro de
marés. Segundo Morettin e Toloi (2006), com base nos exemplos apresentados,
existem séries temporais discretas e contínuas. No mercado financeiro, geralmente
para análises gerais de investimentos faz-se o uso de séries temporais discretas.
Ainda segundo os autores, uma série temporal é um conjunto qualquer de
ponderações com base no tempo. É possível, ao se analisar uma série temporal,
após realizar uma modelagem, descrever o comportamento através de gráficos,
concluir uma tendência (variações sazonais) e realizar previsões de valores futuros
das séries de curto ou longo prazo. Os modelos que são utilizados para apresentar
as séries temporais são processos estocásticos, ou seja, tratando-se dos dados,

1Pregão é o ato de divulgar alguma informação, na Economia é a exposição feita, por corretores de
bolsas, de ofertas a serem negociadas junto aos lances oferecidos (PREGÃO, 2019).
23

todas as alterações serão influenciadas por probabilidades. Com a absorção desse


comportamento é possível concluir que não há controle sobre o que irá acontecer
com as ações, as quais podem, de forma abrupta, aumentar ou diminuir.
Um dos principais problemas ao se trabalhar com valores financeiros em
séries temporais é a característica intrínseca de que tais séries são não-
estacionárias, ou seja, não progridem no tempo aleatoriamente com base em uma
média constante. Porém, as séries financeiras e econômicas têm a tendência de
serem lineares, as quais sofrem alterações positivas e negativas em torno de uma
reta, assim como acontece na prática quando se trata de mercado de capitais. Por
essa razão, por meio de técnicas computacionais pode-se encontrar tendências em
séries com tal característica.
Além disso, com o uso de alguns conceitos, é possível tentar converter uma
série não-estacionária para estacionária, de modo a facilitar as operações, como
feito por Morettin e Toloi (2006) que transformaram índices mensais do Bovespa.

2.2 Inteligência Artificial

Atualmente, grande parte dos problemas são passíveis de resolução através


de métodos computacionais, por meio de algoritmos que implementam diversos
tipos de técnicas. É possível também que seja necessário realizar uma análise de
dados para um melhor compreendimento do problema. Por essa razão, a máquina
deve sempre realizar tarefas complexas de maneira eficiente, e a depender o grau
de complexidade, executar funções impraticáveis pelo ser humano (FACELI et al.,
2011).
Na grande área da IA já existem diversas técnicas que são empregadas na
resolução de problemas da sociedade, particularmente a AM. Segundo Mitchell
(1997), a Aprendizagem de Máquina é a capacidade de aprimorar o desempenho
na execução de alguma tarefa por meio da experiência, obtendo conhecimento a
cada nova iteração. No conceito de AM programa-se computadores para que
aprendam com base em suas práticas passadas, obtendo uma conclusão genérica
de um conjunto a partir do princípio da indução (MITCHELL, 1997).
Como citado anteriormente é possível aplicar diversas técnicas para se
realizar a predição de valores e em sua grande maioria, são treinadas com base na
hipótese indutiva. Nesse processo, as RNAs fazem uso de um conjunto de números
24

reais que são associados aos pesos de conexão da rede. Devido a isso é possível
fazer com que a rede se torne genérica (para qualquer entrada). Portanto, sem essa
etapa o algoritmo não obterá o conhecimento necessário para a generalização e
não conseguirá ser aplicado a novos conjuntos de dados.
Existem dois objetivos principais a serem atendidos, quando se trabalha com
AM: generalizar análises e encontrar a função (matemática) que possa ser utilizada
para predizer valores ou classificá-los. Além disso, existem dois Paradigmas de
Aprendizado quando se trata desses algoritmos, o Aprendizado Supervisionado em
que é necessário um supervisor externo que conhece o valor da saída e é capaz de
avaliar a eficácia do resultado, e o Aprendizado Não Supervisionado, no qual utiliza-
se de medidas estatísticas/probabilísticas na tentativa de se predizer/classificar
informações (FACELI et al., 2011). A Figura 3 ilustra a hierarquia de aprendizado,
bem como os seus tipos de tarefas.

Figura 3 – Hierarquia de Aprendizado

Fonte: Faceli et al. (2011).

Como o objetivo do trabalho foi predizer e classificar valores, utilizou-se de


técnicas da IA, especificamente RNAs, que fazem uso do aprendizado
supervisionado (MLP). Segundo Haykin (2009) rede neural é um processador
distribuído de forma paralela que consegue armazenar conhecimento experimental
e utilizá-lo posteriormente. Além disso as redes adquirem o conhecimento, que é
25

armazenado pelos pesos sinápticos, realizando um processo de aprendizagem


dentro de um ambiente propício (FACELI et al., 2011).
A rede neural obtém seu conhecimento a partir de um procedimento
chamado algoritmo de aprendizagem, o qual modifica os valores dos pesos
sinápticos com o intuito de alcançar o valor objetivo. É possível perceber a
semelhança que as redes neurais possuem com o cérebro humano, pois seu
conceito foi inspirado na estrutura neural de organismos que adquirem
conhecimento através da experiência. Além disso assim como o cérebro as redes
neurais, necessitam de um conjunto de neurônios, pois é através deles que é feita
a condução, troca e decisão de disparo de impulsos.
Existem diversos objetivos para realizar a modelagem de uma rede neural
pois são bem versáteis e podem classificar dados, reconhecer padrões, predizer
valores, entre outros. Com base nisso fez-se necessário compreender o
funcionamento de uma rede neural artificial, visto que o objetivo deste trabalho foi
realizar uma predição de valores. A Figura 4 ilustra como é a arquitetura de um
neurônio de rede neural artificial.

Figura 4 – Modelo não-linear de um neurônio.

Fonte: Adaptado de Haykin (2009).


26

Um neurônio é composto por uma quantidade de variáveis de sinais de


entrada (xi, i = 1...n, onde n é a quantidade de entradas), que servem de base para
realizar as alterações, com base em operações matemáticas, nos pesos sinápticos
de cada neurônio k (wki, i = 1...p, onde p é a quantidade de neurônios). Esses valores
constituem a entrada para uma função de agregação (∑) que irá calcular o valor de
um combinador linear, conhecido como potencial de ativação. Essa função será
submetida a um limiar de ativação (bias - b) que irá novamente modificar o valor
atual, a fim de minimizar os erros de cada iteração. Por fim, é calculado o potencial
de ativação (u), que tem por objetivo validar se o valor atual está dentro de um certo
limiar (θ), e após selecionar a função de ativação ideal (φ), obter o valor de saída
da iteração (yi, i=1...k, onde k diz respeito ao k-ésimo neurônio de saída da rede).
Geralmente, as RNAs possuem arquiteturas padronizadas, compostas por
três camadas, as quais são camada de entrada, camada intermediária e camada de
saída. Além disso, existem arquiteturas que se destacam das demais e são as mais
utilizadas, por exemplo a rede Perceptron de Múltiplas Camadas. A maioria das
RNAs também mostram maior precisão nos resultados com uma quantidade
extensa de entradas, pois para esses casos, tendem a possuir um maior
conhecimento, oriundo de uma maior quantidade de fases de treinamento (HAYKIN,
2009).
A RN mais simples é a Perceptron de Camada Única, visto que é utilizada
para dados que podem ser linearmente separáveis em um plano bidimensional, ou
seja, totalmente distintos conforme os seus atributos. Essa RN possui uma camada
sensorial (apenas simbólica, pois os neurônios não correspondem ao padrão de
neurônio apresentado na Figura 4) e outra de neurônios, também utilizada como
camada de saída. Tal RN pode ser observada na Figura 5.
Considerando a Figura 5, a primeira camada vertical a qual é composta por
símbolos geométricos representados por quadrados, diz respeito ao conjunto de
neurônios sensoriais, os quais apenas fornecerão valores de entradas para serem
operados com os pesos sinápticos (segmentos de reta). A segunda camada é
constituída dos neurônios propriamente ditos. Compreendendo os conceitos do
Perceptron de Camada Única tornou-se possível abordar a respeito da rede neural
Perceptron de Múltiplas Camadas (HAYKIN, 2009).
27

Figura 5 – Rede neural de camada simples.

Fonte: Adaptado de Haykin (2009).

2.2.1 Rede Neural Perceptron de Múltiplas Camadas

A característica que torna a MLP superior à rede apresentada na Figura 5 é


o fato de tal RNA possuir pelo menos uma camada intermediária e, diferentemente
da Perceptron Simples, essa possui algoritmos de ajuste de pesos, por exemplo, o
de retropropagação de erro conhecido como Backpropagation. Nesse algoritmo, o
cálculo é feito em duas fases, sendo a primeira semelhante ao da rede anterior em
que são feitas as operações a fim de se obter uma saída. Na segunda fase é
realizada uma verificação com o sinal sináptico do valor obtido, de modo que se tal
sinal apresentar um erro não tolerável, realiza-se uma alteração dos pesos da rede
e retorna-se para a primeira fase. A Figura 6 ilustra a arquitetura que possui uma
MLP simples e de apenas uma camada.
Analisando-se a Figura 6, compreende-se que a primeira camada vertical é
referente aos sinais de entrada que operam com os pesos sinápticos. Em seguida,
os valores de cada operação são armazenados e calculados junto ao bias único de
cada neurônio. Esses resultados são tecnicamente chamados de saída e, além
disso, o cálculo dessa variável é feita por meio de uma de função de ativação. Após
obtenção das saídas dos primeiros neurônios, é realizado o mesmo cálculo entre
os pesos sinápticos da próxima camada, juntamente com o cálculo dos valores do
bias. Por fim, realiza-se a última iteração entre os pesos e calcula-se o gradiente da
saída (valor específico a ser computado pelo algoritmo de retropropagação do erro).
28

Caso a saída não esteja adequada (dentro de um erro tolerável), realiza-se novas
operações de modo a tornar cada peso mais exato, buscando a convergência da
rede.

Figura 6 – Rede neural de múltiplas camadas.

Fonte: Adaptado de Haykin (2009).

Com base no que foi exposto, existem diversos algoritmos que podem ser
utilizados para ajustar os valores dos pesos sinápticos de uma rede neural artificial.
Para prosseguir com o desenvolvimento das arquiteturas propostas, foram
utilizados os algoritmos de otimização de pesos conhecidos como Gradiente
Estocástico Descendente e Adam. Dessa forma, fez-se necessário analisar ambos
os algoritmos de modo a compreender seu funcionamento.
O primeiro algoritmo de otimização, o Gradiente Estocástico Descendente,
consiste em realizar o cálculo de um parâmetro conhecido como gradiente (obtido
através do erro total entre saída esperada e obtida), para cada neurônio, em cada
iteração. Vale ressaltar que o cálculo dos gradientes dos neurônios é efetuado com
base nos gradientes já computados de neurônios de camadas vizinhas. De posse
do valor do gradiente de cada neurônio é possível determinar qual o fator de ajuste
de cada peso sináptico da rede, realizando as atualizações para cada um deles.
Além disso, esse algoritmo mantém uma taxa de aprendizagem fixa (definida à
priori) para todas as iterações.
Segundo Kingma e Ba (2014), os quais são responsáveis por desenvolver o
algoritmo Adam, o intuito desse algoritmo é adaptar os pesos da rede neural
29

artificial, de modo a estimar um valor em determinado momento. Então com o uso


desse algoritmo, a etapa de ajuste de pesos da RNA, trabalhando com séries não
estacionárias existe maior chance de obter resultados precisos.
A principal diferença entre os dois algoritmos de otimização utilizados neste
trabalho, é que no algoritmo Adam adota-se uma taxa de aprendizado para cada
neurônio separadamente, ao invés de ser um valor padrão para toda a rede. Além
disso, o cálculo do parâmetro gradiente é realizado em dois pontos específicos da
fase de ajuste de pesos. Particularmente, realiza-se uma média móvel desses
valores e os utiliza para determinar quais serão os novos pesos, calculados
individualmente.
Analisados os algoritmos de otimização de pesos, faz-se necessário ressaltar
os diversos tipos de função de ativação existentes na literatura. Com base nisso,
neste trabalho serão utilizadas duas delas, as quais são função sigmoide logística
e a função linear. Ambas consistem em realizar a somatória dos produtos dos pesos
pelas entradas e, após isso, somar o valor do bias. A diferença existente entre tais
funções de ativação é que a primeira consiste em retornar um valor entre 0 e 1,
enquanto a segunda retorna o valor inteiro obtido na realização do cálculo
supramencionado. Com o intuito de apresentar a função de ativação sigmoide
logística, utilizou-se a Equação 3.

1
𝑓 (𝑥 ) = (3)
1+ 𝑒 −𝑥

Na Equação 3, e é a constante de Euler e x diz respeito ao potencial de


ativação. Por outro lado, a função de ativação linear consiste em retornar o valor o
valor obtido no cálculo da saída do neurônio (sem nenhuma alteração), conforme é
descrito pela Equação 4.

𝑓(𝑥) = 𝑥 (4)

Na Equação 4, a função de ativação linear considera o valor do potencial de


ativação (x) como o resultado produzido por cada neurônio.
Devido à utilização da função de ativação sigmoide logística, é importante
abordar a respeito da normalização e desnormalização dos dados de entrada e
30

saída de uma rede neural. A técnica de normalizar todos os dados de entrada,


consiste no fato de que o valor da saída de um neurônio, ao se utilizar a função
sigmoide, deve pertencer ao intervalo [0, 1] (HAYKIN, 2009). Neste trabalho, os
valores de entrada, caso não normalizados, farão com que o valor de saída não
esteja nesse intervalo, ocasionando em valores numéricos muito baixos (quando
tendem a zero) ou muito altos (quando tendem ao infinito). Tal característica caso
não tratada, inviabilizaria o processo de treinamento da rede neural artificial.
Particularmente, a normalização numérica consiste em analisar toda a
entrada da rede e os valores esperados de saída, e então armazenar o maior e o
menor valor de cada base de dados. Dessa forma, o maior valor normalizado se
torna 1 e o menor, 0. Os demais valores são calculados e pertencem ao intervalo
[0, 1]. A Equação 5 e a Equação 6 demonstram como é realizada a normalização
dos valores das entradas e dos valores de saída, respectivamente.

𝑥 = (𝑥 − min (𝑥))/(max(𝑥) − min (𝑥)) (5)

𝑦 = (𝑦 − min (𝑦))/(max (𝑦) − min (𝑦)) (6)

Na Equação 5, x diz respeito ao conjunto de entradas e, na Equação 6, y


denota o conjunto de saídas obtidas.
Após efetuar todas as operações foi necessário realizar a desnormalização
da saída do último neurônio, para que o valor alcançado pela a rede esteja no
mesmo intervalo do valor esperado. Para realizar a desnormalização da saída
utiliza-se a Equação 7.

𝑦 = 𝑦(max(𝑦) − min(𝑦)) + max(𝑦) (7)

Uma vez que os dados forem manipulados corretamente (por exemplo,


utilizando da normalização e da desnormalização), espera-se que redes neurais do
tipo MLP, conforme já foi exposto no início desta seção, consigam resolver grande
parte dos problemas computacionais de classificação. Além disso, rede neural
artificial MLP tende a apresentar uma alta taxa de acerto, se os dados forem
padronizados e a rede for modelada e treinada corretamente. Para ser treinada a
31

rede demanda, geralmente, de um considerável tempo de execução, visto que esse


processo é realizado por experimentação. Portanto, quanto maior a amostragem,
maior será chance de uma classificação eficaz (HAYKIN, 2009).

2.3 Tecnologias para a Programação de Redes Neurais Artificiais

Como explicado anteriormente, as tecnologias presentes na IA que foram


abordadas neste trabalho são em grande maioria implementadas por algoritmos
específicos para solucionar um determinado problema de classificação. Além disso,
existem várias linguagens que tornam possível a programação de técnicas que
solucionam de forma eficiente esses problemas, desde as linguagens de baixo nível
até as linguagens de alto nível. A linguagem de programação Python é uma dessas
linguagens (de alto nível), que apesar de sua simplicidade e clareza é bem robusta
e poderosa (MENEZES, 2010).
Neste trabalho utilizou-se essa linguagem devido à sua relevante utilização
em modelos que resolvem problemas de diversas áreas, como IA, Banco de Dados,
Biotecnologia, entre outras. Ainda segundo Menezes (2010), uma das maiores
vantagens de se utilizar essa linguagem é que existe uma variedade imensa de
bibliotecas, frameworks e programas funcionais disponíveis, fato este que diminui a
carga de tarefas que o programador teria ao implementar toda a solução
manualmente. Com o intuito de acelerar o progresso deste trabalho, a biblioteca
Keras, foi utilizada como ferramenta auxiliar para a modelagem das RNAs
abordadas.
A Keras é uma biblioteca que auxilia na criação de modelos de AM,
especificamente para redes neurais artificiais. Essa biblioteca tornou-se uma das
mais utilizadas na literatura computacional para desenvolvimento de soluções
baseadas em Deep Learning. O motivo disso, é a facilidade que a biblioteca
proporciona para construir modelos de aprendizagem, além de suportar diversos
tipos diferentes de redes neurais artificiais (KERAS, s.d).
Ainda com base na documentação oficial, essa biblioteca oferece serviços
que auxiliam na construção e modelagem de soluções baseadas em técnicas da IA.
Além disso, a biblioteca Keras realiza com algumas linhas de comando a
modelagem, o treinamento e os testes de cada arquitetura das redes neurais. Ainda
é possível obter dados como a estrutura/arquitetura da rede elaborada, com base
32

em métodos que a própria biblioteca mencionada disponibiliza. Portanto, é um


recurso que pode fornecer grande auxílio na produção e implementação do trabalho.

2.4 Métricas de Desempenho

Atualmente, várias métricas podem ser utilizadas para mensurar a qualidade


dos resultados de soluções projetadas para classificar determinados tipos de
informações. Nesse sentido, fez-se necessário detalhar a respeito do
funcionamento das métricas que foram utilizadas para avaliação de desempenho,
de modo a obter, por meio dessas métricas, qual das arquiteturas obtidas neste
trabalho se mostrou mais eficiente. De modo a avaliar o desempenho de cada RNA
fez-se necessário utilizar métricas que realizam uma comparação do valor real
esperado com o valor obtido como saída das redes. Com isso, aquela RNA que
apresentasse um menor valor de erro seria considerada a solução com maior
acurácia. De modo a se obter essa acurácia, foram utilizadas duas métricas de
desempenho, buscando confirmar qual a melhor rede obtida.

2.4.1 Erro Quadrático Médio

O Erro Quadrático Médio (MSE), como conceituado na Seção 2.4, é uma das
técnicas da área da Estatística que realiza a comparação entre valores alcançados
e reais. Segundo Dametto (2018), a MSE é a métrica mais empregada para realizar
o cálculo de desempenho em modelos de predição. A Equação 8 mostra como é
realizado o cálculo.

2
∑𝑁
𝑡=1(𝑉𝑝 − 𝑉𝑟 )
𝑀𝑆𝐸 = (8)
𝑁

Na Equação 8, o cálculo do MSE é realizado através da média aritmética das


diferenças entre os valores obtidos (Vp) e esperados (Vr) elevadas ao quadrado.
Ainda nessa equação, N é a quantidade de dias da série temporal.
33

2.4.2 Raiz do Erro Quadrático Médio

A Raiz do Erro Quadrático Médio (RMSE) encontra, por meio de seu cálculo,
um valor numérico que indica o quão grave foi o erro computado, podendo ser
próximo de zero (erro mínimo) ou não. A operação realizada para obtenção do valor
é similar ao que ocorre na Equação 8, porém extrai-se o valor da raiz quadrada do
resultado. A Equação 9 descreve como é realizado o cálculo.

𝑁 2
∑ (𝑉𝑝 − 𝑉𝑟 )
𝑅𝑀𝑆𝐸 = √ 𝑡=1 (9)
𝑁

Com base nas métricas apresentadas, espera-se que com a sua utilização,
seja possível alcançar qual o resultado obtido pelas RNAs é o mais preciso. Por fim,
através desse resultado, foi possível concluir qual das redes analisadas é a melhor,
se aplicada ao problema de predição apresentado neste trabalho.
34

3 MATERIAL E MÉTODOS

Este capítulo tem como objetivo descrever a sequência de etapas que


compuseram o desenvolvimento deste trabalho. Na Seção 3.1, são apresentadas
as técnicas e as tecnologias estudadas e utilizadas no decorrer das tarefas, bem
como quais as decisões tomadas e o motivo de cada escolha. Na Seção 3.2, são
descritos os procedimentos adotados na implementação do WCA, tal como os seus
modos de operação. Na Seção 3.3, estão dispostos os dados obtidos através do
WCA, os quais foram separados com base em sua relevância para o trabalho. A
Seção 3.4, detalha possíveis arquiteturas iniciais com base nas técnicas utilizadas
para a predição de valores. Na Seção 3.5, é demonstrada a forma como foram
implementadas as RNAs propostas. Por fim, na Seção 3.6 é realizada uma
discussão acerca de como serão analisadas as arquiteturas propostas.

3.1 Técnicas e Tecnologias Envolvidas

Inicialmente, foi realizada uma busca acerca do histórico de cotações da


bolsa de valores, especificamente do Índice Bovespa, de modo que tais dados
suprissem a necessidade de todos os requisitos necessários à implementação. O
primeiro requisito, foi que os dados deveriam estar em um intervalo de oito anos
(2011 a 2019), e além disso, não poderiam estar ausentes quaisquer valores
mensais de cotações dentro do intervalo proposto, visto que a sua inexistência
poderia significar uma inexatidão na predição de valores. Por essa razão, os valores
foram coletados com base no histórico de cotações disponibilizado no site UOL
Economia2, o qual contém dados com os supramencionados requisitos. Além disso,
visando padronizar as amostras e buscando uma maior eficiência de resultados,
foram utilizados os dados referentes a cada primeiro dia útil de cada mês no
decorrer dos anos.
Após definir a plataforma para a obtenção dos dados, foi feita uma nova
revisão bibliográfica com o intuito de selecionar técnicas de extração de dados de
páginas HTML. Nesse sentido, optou-se após realizar uma pesquisa pela técnica
com maior número de utilizações, que consiste na manipulação de bibliotecas

2 http://cotacoes.economia.uol.com.br/bolsas/cotacoes-historicas.html?indice=.bvsp
35

elaboradas em linguagem Python. A primeira delas foi a Requests, a qual permite


ao programador que a utiliza realizar requisições HTTP, ou seja, obter o código
HTML de alguma página web. Também foi utilizada a BeautifulSoup, que realiza a
extração de dados em códigos HTML/XML. Uma das principais características
dessa biblioteca é fornecer recursos para obter conteúdo por meio de tags.
Posteriormente, para realizar a manipulação dos dados, modelando-os em
um arquivo com extensão .csv (em formato de tabela), permitindo maior facilidade
em sua exibição, e uma melhor compreensão, fez-se o uso da biblioteca Pandas.
Sequencialmente, para o desenvolvimento das redes neurais artificiais, foi
necessário utilizar de alguns artifícios (matemáticos, em sua grande maioria) e,
devido a isso, foi realizada uma pesquisa na documentação das bibliotecas internas
da linguagem Python, de modo a mensurar a eficiência de tais. Com base nas
informações coletadas, concluiu-se que tais bibliotecas, cujos nomes são math,
random e numpy, seriam suficientes para a elaboração de uma das arquiteturas.
Além disso, para elaborar a segunda arquitetura da rede neural MLP, utilizou-se da
biblioteca externa Keras, que permite criar arquiteturas de RNAs, treiná-las e testá-
las.
Por fim, foi necessário realizar uma pesquisa sobre como predizer possíveis
valores do IBOV, e, nesse sentido, segundo Filho (2014), existem duas maneiras
eficientes, as quais podem ocorrer ao tomar como base o valor imediatamente
anterior ao desejado ou calcular a média móvel, que geralmente utiliza os seis
últimos valores. Ambas as técnicas, se mostram razoáveis ao realizar os cálculos,
porém busca-se com a utilização das RNAs aperfeiçoar os resultados gerados por
elas.

3.2 Implementação do Web Crawler Agent

Inicialmente, foi necessário realizar uma coleta de dados para serem


utilizados como amostras de treinamento, em busca de conseguir predizer valores
do Índice Bovespa. Para realizar tal tarefa, foi implementado um WCA que
conseguisse, por meio de linhas de comando em linguagem Python, obter tais
valores diretamente de uma plataforma de base de dados online. Sendo assim, foi
feito o uso das bibliotecas de requisição HTTP e de manipulação HTML, citadas na
Seção 3.1 (Requests e BeautifulSoup), as quais foram responsáveis por capturar
36

dados de 12 páginas HTML com endereços distintos. A Figura 7 ilustra como é


realizada a requisição da página e também a maneira como são acessados os
conteúdos das tags HTML.

Figura 7 – Código de requisição e manipulação.

1. for atual in range(1, 12):


2. pagina.append(url)
3. for item in pagina:
4. pagina = requests.get(item)
5. soup = BeautifulSoup(pagina.text, 'html.parser')
6. tabela = soup.find(class_='tblCotacoes')
7. linhas = tabela.find_all('tr')
8. for itens in linhas:
9. itens = itens.get_text()
Fonte: Autoria própria.

O funcionamento do algoritmo apresentado na Figura 7 ocorre da seguinte


forma: o laço de repetição (linha 1), serve para analisar as 12 páginas HTML com o
conteúdo utilizado para a extração dos dados. Portanto, adiciona-se todas as urls à
lista pagina. O segundo laço de repetição (linha 3) tem como objetivo examinar cada
elemento da lista pagina, um-a-um. Ao analisar todas as páginas HTML, é feita a
requisição dos códigos HTML, um para cada página, utilizando a biblioteca requests
(linha 4). Caso a requisição seja aceita, é necessário acessar o mesmo código
utilizando a biblioteca BeautifulSoup (linha 5). Após isso, utilizando a variável soup,
que acessa o conteúdo HTML da página, deve-se passar uma tag por parâmetro a
ser buscada no código fonte (linha 6), e então, interno a tabela, cada linha
(denominada tr - linha 7). Após essa etapa, atribui-se à variável linhas, as linhas da
tabela, as quais são examinadas por um laço de repetição (linha 8). Finalmente,
atribui-se à variável itens o conteúdo de cada linha para tratamento dos dados (linha
9).
Devido à vasta quantidade de dados fornecida pelo site (todos os dias do
ano), dados os prazos para a conclusão deste trabalho, era manualmente inviável
coletá-los e separá-los posteriormente. Além disso, o site UOL Economia ainda
fornece diversos valores em cada linha de sua tabela, tais como data, cotação atual,
cotação mínima, cotação máxima, variação real, variação percentual e volume, os
quais em sua grande maioria não teriam utilidade neste trabalho. Visando reduzir o
37

esforço manual de se trabalhar com um grande volume de dados, optou-se por


utilizar somente a data e a cotação atual de cada linha da tabela e, além disso,
validar os dados antes de armazená-los, evitando armazenamento desnecessário.
Além disso, obteve-se os índices dos valores correspondentes às datas e às
cotações, e então foi realizada uma verificação com base nas datas, de modo a
obter o primeiro dia útil de cada mês a ser analisado no período de oito anos. Após
isso, foi inserida a data e a cotação às suas respectivas listas, as quais foram
criadas utilizando a linguagem Python. De posse dos dados já separados foi
possível criar e analisar a base de dados a ser utilizada.

3.3 Base de Dados

Após realizar a coleta dos dados, foi necessário separá-los em forma de


tabela. Isso se mostrou necessário, pois ao se analisar uma tabela tende-se a tornar
menos oneroso a elaboração de figuras, por exemplo, gráficos, que potencialmente
serão úteis em análises de comportamento e tendências. A Tabela 2 exibe como é
disposta a tabela com os valores de cada dia coletado, suprimindo-se, para uma
melhor legibilidade, os valores indexados de 4 a 93.

Tabela 2 – Base de dados.


Índice Datas Valores
0 1/08/2019 102125.94
1 1/07/2019 101066.94
2 3/06/2019 97020.48
3 2/05/2019 95527.62
... ... ...
94 3/10/2011 50791.53
95 1/09/2011 58118.20
96 1/08/2011 58535.74
97 1/07/2011 63394.34

Fonte: Autoria própria.

As datas das cotações, como mencionado nas seções anteriores, são


compostas por cada primeiro dia útil de cada mês do ano, desde o mês de julho de
38

2011 ao mês de agosto de 2019. A Tabela 2 possui um total de 98 valores, os quais


foram agrupados de sete em sete, de modo que os seis primeiros valores de cada
grupo foram utilizados na tentativa de predizer o último valor do mesmo grupo
(predição com base em média móvel). Com base nisso, esses dados foram
utilizados para elaborar o gráfico contido na Figura 8.

Figura 8 – Valores do Índice Bovespa no período de oito anos.

BVSP Linear (BVSP)

120000

110000

100000

90000
Valores

80000

70000

60000

50000

40000
jul/11 jul/12 jul/13 jul/14 jul/15 jul/16 jul/17 jul/18 jul/19
Datas

Fonte: Autoria própria.

Com base na Figura 8, é possível perceber diversas quedas repentinas em


valores do IBOV, algumas delas podem ser influenciadas por acontecimentos no
país (incluindo políticos). Analisando o gráfico, é possível verificar que atualmente
o Índice Bovespa alcançou o seu valor mais elevado e por esse motivo, os estudos
nessa área se tornam ainda mais importantes.

3.4 Arquiteturas Iniciais e Técnicas de Predição

Sequencialmente à coleta de dados e à separação dos valores a serem


utilizados para predição, foram definidas algumas arquiteturas iniciais candidatas
para realizar o treinamento e o aperfeiçoamento dos parâmetros da rede. A
princípio, existiam algumas arquiteturas primitivas, dado que em sua elaboração,
39

esperava-se empregar as técnicas utilizadas para a predição de séries temporais


(apresentadas na Seção 3.1).
A teoria inicial, era criar uma arquitetura para as redes neurais que recebesse
como entrada todos os valores anteriores àquele que esperava-se prever e a partir
de então, aplicasse a técnica de predição da média móvel. Dessa forma, cada valor
a se prever contaria com um número diferente de entradas, devido a quantidade
predefinida de dados. Nessa mesma arquitetura, seriam geradas quantidades
aleatórias de camadas ocultas e de neurônios, hipótese essa que foi descartada
devido à existência de redes extremamente densas que poderiam ser geradas.
Outra teoria que também foi descartada, compreendia utilizar em sua
arquitetura apenas um valor de entrada na rede, o qual sofreria operações junto a
um número aleatório de camadas/neurônios, e por fim, seria comparado o valor de
saída da rede com o valor real. O descarte ocorreu, pois em um teste de mesa
utilizando a técnica de predição com base no mês anterior, quando comparada, a
precisão obtida ao utilizar maior quantidade de valores para a predição foi superior
do que utilizar apenas um.
Por fim, para as arquiteturas iniciais, optou-se pela utilização da técnica de
predição por média móvel (para entradas de tamanho variáveis), visto que,
compreende uma arquitetura pouco densa. Após diversos testes, a quantidade de
entradas que se mostrou satisfatória, foi um total de seis valores, os quais foram
trocados a cada iteração (desde que atendendo os critérios de convergência).
Para gerar as arquiteturas, analisou-se que ao contrário de se gerar as
quantidades de camadas e neurônios de forma aleatória, iniciar a arquitetura com
os valores já definidos torna seu estudo e análise mais simples e objetivos. Além
disso, através de um estudo da literatura, foi possível observar que algumas
arquiteturas, as quais possuem uma quantidade específica de neurônios em suas
camadas, geralmente se mostram capazes de obter diversas soluções para
diferentes cenários de aplicação e, por esse motivo, optou-se por utilizar como base
essa arquitetura.
Essa arquitetura mencionada possui 3 neurônios na primeira camada oculta,
2 neurônios na segunda camada oculta e 1 neurônio na camada de saída.
Baseando-se nessa arquitetura, gerou-se de maneira aleatória algumas outras
arquiteturas candidatas (variando as quantidades de neurônios por valores
40

próximos ao inicial). Dessa forma é possível gerar, posteriormente, tais arquiteturas


e comparar seus resultados, a fim de se verificar a eficiência de cada rede.

3.5 Implementação das RNAs

Foi necessário após o estudo descrito na subseção 3.4, realizar a


implementação e verificação de resultados de cada uma das arquiteturas propostas.
Dessa forma, para cada rede neural treinada, utilizou-se diferentes quantidades de
neurônios para cada camada oculta, de modo a obter qual delas foi a melhor.
Sequencialmente, variou-se a quantidade de neurônios ocultos que foram utilizadas
na fase de treinamento, de modo a validar qual delas proveu melhores resultados.
A Tabela 3 detalha quais foram as quantidades de neurônios utilizados nas duas
camadas ocultas e na camada de saída.

Tabela 3 – Relação de Neurônios por Camada.


Primeira Camada Oculta Segunda Camada Oculta Camada de Saída
4 4 1
4 3 1
4 2 1
3 3 1
3 2 1
2 2 1
Fonte: Autoria própria.

As arquiteturas propostas, que estão dispostas na Tabela 3, possuem em suas


camadas a quantidade de neurônios descritos por cada coluna. A camada de saída
necessita apenas de um neurônio, pois a rede deve convergir para um valor único.
Após a definição de quais arquiteturas deveriam ser desenvolvidas, fez-se
necessário realizar a implementação da primeira rede neural (arquitetura), a qual foi
implementada em linguagem Python, sem o auxílio da biblioteca Keras. Além disso,
para a implementação das redes neurais artificiais, as amostras foram separadas,
como mencionado anteriormente, em duas listas, sendo que a primeira lista contém
um vetor com os seis valores anteriores, e a segunda lista, o sétimo valor (a ser
obtido na predição).
Durante a implementação, utilizou-se a função de ativação linear, o que fez
com que os neurônios da rede neural alcançassem em suas saídas valores muito
41

discrepantes dos esperados (com o uso do Gradiente Estocástico Descendente).


Por esse motivo, a mencionada função de ativação foi substituída por uma função
de ativação do tipo sigmoide, conhecida como função logística. Sequencialmente a
essa troca de função, a rede, durante o processo de propagação (em que as saídas
dos neurônios são as entradas dos neurônios posteriores), obteve valores que
impossibilitava a realização dos cálculos, pois gerava uma divisão por um valor que
tendia a 0.
Para solucionar esse problema, utilizou-se a normalização e a
desnormalização dos dados, fazendo com que os valores de entrada estivessem no
intervalo [0, 1]. Posteriormente, após realizar as operações com as entradas
normalizadas, o valor de saída obtido pelo último neurônio da rede foi
desnormalizado, a fim de realizar uma análise quando comparado ao valor real do
IBOV (fase de treinamento e fase de testes - HAYKIN, 2009).
Após implementar (sem o uso da biblioteca Keras) toda a estrutura de uma
RNA, incluindo os métodos que a caracterizam (backpropagation e o ajuste de
pesos), realizou-se a implementação da mesma arquitetura, com os mesmos
parâmetros e com a mesma função de ativação adotados pela rede anterior, porém
com o uso da biblioteca. Essa implementação foi feita com o intuito de se comparar
qual arquitetura desenvolvida (utilizando ou não a biblioteca) seria mais eficiente.
Dessa forma, a rede com eficácia superior seria utilizada para o restante do
trabalho, enquanto a inferior seria descartada.
Utilizando os resultados coletados após realizar as etapas de testes e
treinamento das redes, a arquitetura desenvolvida pela biblioteca Keras obteve um
resultado superior. Por esse motivo, abordou-se apenas o desenvolvimento da rede
mais eficiente (entre as duas). Para implementar tal rede, utilizou-se essa biblioteca,
a qual foi responsável por fornecer funções que auxiliam em processos internos de
uma RNA. Dessa forma, ao contrário de se implementar as operações de cada
neurônio individualmente e estar mais sujeito a erros no processo de
desenvolvimento, a biblioteca Keras possibilita predefinir os parâmetros e a
quantidade de neurônios e camadas da rede. Além disso, essa biblioteca permite
inserir um comando conhecido como fit, que tem por finalidade realizar todo o
processo de treinamento da rede neural. Vale reafirmar, que essa arquitetura foi
implementada anteriormente sem o uso da biblioteca. Portanto, utilizou-se a função
de ativação sigmoide e o método Gradiente Estocástico Descendente para criar a
42

rede. A Figura 9 mostra como é realizada a criação da rede neural com o uso da
biblioteca e como são declarados seus parâmetros.

Figura 9 – Trecho de código-fonte utilizado na elaboração da primeira RNA.

1. model = Sequential()
2. model.add(Dense(x, input_dim=6, activation='sigmoid'))
3. model.add(Dense(y, activation='sigmoid'))
4. model.add(Dense(z, activation='sigmoid'))
5. model.compile(optimizer="sgd", loss="mse", metrics=['mse'])
6. model.fit(x_train, y_train, epochs=epocas, batch_size=6, verbose=0)

Fonte: Autoria própria.

O algoritmo apresentado na Figura 9 funciona da seguinte maneira: na linha


1, define-se um modelo (model) sequencial (camadas em série e que possuem
influência nas camadas posteriores). Posteriormente, nas linhas 2, 3 e 4, foram
adicionados à variável model todas as camadas supramencionadas, sendo a
primeira camada com a quantidade x de neurônios (em que input_dim é a
quantidade de entradas que a camada recebeu, neste caso os seis meses
anteriores), a segunda camada com a quantidade y de neurônios e a terceira
camada com apenas a quantidade z de neurônios (utilizou-se os valores da tabela
3). Além disso, para todas as camadas, a função de ativação (activation) foi a linear.
Na linha 5, a função compile, tem por finalidade configurar a rede neural, definindo
como os pesos da rede são atualizados (optimizer) e como será feito o cálculo da
diferença entre valor alcançado e o valor real (loss), além de definir quais as
métricas utilizadas para a avaliação (metrics). Por fim, na linha 6 é realizada a etapa
de treinamento da RNA, em que foram enviadas as entradas da rede (x_train), a
saída esperada (y_train), a quantidade de épocas (epochs), o número de amostras
propagadas pela rede (batch_size), e o parâmetro verbose, o qual pode ser utilizado
na exibição ou não do processo de treino da rede (KERAS, s.d).
Posteriormente, foi implementada uma segunda rede neural (também MLP)
utilizando as mesmas arquiteturas supramencionadas, porém utilizando uma função
de ativação e um algoritmo de otimização distintos da arquitetura anterior. Para
implementar essa RNA, também foi utilizada a biblioteca Keras. Para o
desenvolvimento dessa rede neural, empregou-se, ao invés da função de ativação
logística, a função de ativação linear na saída de todos os neurônios e gerou-se os
43

pesos e os biases aleatoriamente. Diferentemente da rede anterior, o fato que


ocasionou no funcionamento dessa rede utilizando a função linear, foi a aplicação
do algoritmo de otimização Adam. Com base no exposto, na Figura 10 é
apresentado como é feita a definição dessa nova arquitetura.

Figura 10 – Trecho de código-fonte utilizado na elaboração da segunda RNA.

7. model = Sequential()
8. model.add(Dense(x, input_dim=6, activation='linear'))
9. model.add(Dense(y, activation='linear'))
10. model.add(Dense(z, activation='linear'))
11. model.compile(optimizer="adam", loss="mse", metrics=['mse'])
12. model.fit(x_train, y_train, epochs=epocas, batch_size=6, verbose=0)

Fonte: Autoria própria.

O funcionamento do algoritmo apresentado na Figura 10 é o mesmo


funcionamento do algoritmo ilustrado na Figura 9. A distinção entre as duas
arquiteturas é que a rede criada pelo algoritmo da Figura 10 consiste em definir
todas a funções de ativação nas saídas dos neurônios (activation) com a função
linear e os pesos da rede ajustados conforme o algoritmo (optimizer) Adam. Além
disso, existe uma diferença na quantidade de épocas (epochs) necessárias para a
convergência.
Após realizar todas as etapas mencionadas nesta seção, obteve-se as três
MLPs treinadas. A primeira rede, foi implementada sem o auxílio da biblioteca e foi
desconsiderada devido à sua inferioridade na capacidade de predição. Por outro
lado, a segunda rede foi implementada com o auxílio da biblioteca Keras (MLP1 –
seguindo a mesma arquitetura e parâmetros da rede anterior), a qual fornece
algumas funções pré-definidas que contribuem para o desenvolvimento de uma
RNA. Finalmente, a terceira rede, foi desenvolvida também com o uso da
mencionada biblioteca e possui alteração nas funções de ativação e método
utilizado para o ajuste de pesos (MLP2 – comparada com a MLP1). A principal
diferença entre as arquiteturas são as funções de ativação utilizadas e também qual
o algoritmo de otimização. Na MLP1, utilizou-se em todas as camadas a função
sigmoide e o algoritmo SGD, enquanto, por outro lado, na MLP2, utilizou-se a função
de ativação linear e o algoritmo Adam para todas as camadas.
44

Além disso, faz-se necessário destacar que devido a distinção entre as RNAs
propostas, as quantidades de épocas utilizadas se diferem. Utilizou-se para a
primeira arquitetura (MLP1), as quantidades 25000, 50000, 75000 e 100000,
enquanto para a segunda arquitetura (MLP2) foram utilizadas as quantidades 2500,
5000, 7500 e 10000, para realizar o treinamento das redes.

3.6 Validação das arquiteturas

Após finalizar a fase de treinamento das redes neurais, mencionada na seção


anterior, utilizou-se para a fase de testes o primeiro dia dos últimos cinco meses
anteriores à elaboração deste relatório (junho, julho, agosto, setembro e outubro de
2019). A seleção desses valores a serem obtidos pela rede, ocorreu com o intuito
de verificar qual seria a saída para os próximos valores do IBOV com base em seu
treinamento. Com isso, foi realizada uma comparação das saídas obtidas pelas
arquiteturas com os valores reais de fechamento do IBOV nos dias dos meses em
questão.
Os resultados gerados pelas RNAs foram selecionados para que pudessem
ser utilizados na etapa de validação. Com isso, foi possível mensurar por meio das
métricas de desempenho (MSE, RMSE), qual arquitetura obteve uma saída mais
próxima do valor do índice real. Por fim, as análises de eficiência e de resultados de
cada arquitetura, descrevendo procedimentos realizados e dificuldades enfrentadas
são descritos no próximo capítulo.
45

4 RESULTADOS E DISCUSSÕES

4.1 Análise das arquiteturas


Após a implementação de cada uma das arquiteturas mencionadas na tabela
3 e realizar uma análise de resultados, foi possível verificar que em diversas vezes
uma das arquiteturas se mostrou superior (MLP2). Dessa forma, de posse dos
resultados, selecionou-se a arquitetura que obteve melhores resultados de cada
uma das redes obtidas. As Figura 11 e 12 ilustram quais foram essas arquiteturas
para cada rede neural.
As arquiteturas apresentadas nas Figura 11 e 12, possuem uma camada de
entrada (primeira linha vertical) que contém, para ambas as arquiteturas, seis
neurônios que representam os seis valores anteriores ao valor que se deseja
predizer. Além disso, possuem, para ambas as arquiteturas, duas camadas ocultas
(segunda e terceira linhas verticais), as quais são compostas por quatro e três
neurônios, para a primeira arquitetura e dois e dois neurônios, para a segunda
arquitetura. A camada de saída possui apenas um neurônio, para ambas as
arquiteturas, por meio do qual será apresentado o valor obtido com base na média
móvel, operada com os parâmetros gerados aleatoriamente (Seção 3.5).

Figura 11 – Arquitetura da MLP1.

Fonte: Autoria própria.


46

Figura 12 – Arquitetura da MLP2.

Fonte: Autoria própria.

Uma vez que foram realizados todos os passos descritos na Seção 3 e


obtidas as arquiteturas funcionais de cada rede neural, foi possível verificar as
diferenças entre ambas. Além disso, deve ser ressaltado que se optou por permitir
apenas os valores com o menor erro possível (entre valor obtido e valor real do
IBOV). Portanto, buscou-se de maneira repetitiva obter qual a melhor arquitetura
que se enquadre nesse parâmetro (erro total). A Figura 13 mostra qual a primeira
arquitetura gerada para a MLP1.
A Figura 13 mostra todas as 4 camadas da rede neural (uma camada de
entrada, duas camadas ocultas e uma camada de saída). Os pesos sinápticos a
serem operados com cada neurônio (elipse) são representados, cada um, por um
segmento de reta que conecta cada elipse e possui os seus valores gerados
aleatoriamente. O bias é representado por um valor ligado ao neurônio, também
gerado aleatoriamente. Por fim, o valor da saída de cada neurônio, é calculado
durante o processo (função de ativação) e, portanto, possui valor inicial igual a 0.
Com base no exposto, após o treinamento dessa rede uma nova arquitetura
foi gerada para cada saída obtida. A mudança na arquitetura da rede ocorreu
principalmente na fase de ajuste de pesos, em que para cada entrada, os valores
47

dos pesos e o bias de cada neurônio podem ter sido alterados de 0 até 100000
vezes. A nova arquitetura da rede é mostrada pela Figura 14.

Figura 13 – Arquitetura inicial da MLP1.

Fonte: Autoria própria.

A Figura 14 contém a mesma estrutura da rede neural artificial ilustrada por


meio da Figura 13, porém com os valores de cada peso, biases e saídas atualizados
para o melhor funcionamento dela. Esses valores demonstram qual a arquitetura
final da rede neural uma vez que foram alcançadas todas as saídas esperadas e
realizada a etapa de ajustes de pesos. A alteração realizada em cada peso sináptico
da rede, já era esperada. Essa diferença entre os valores iniciais e finais da
arquitetura, ocorre devido ao algoritmo de ajuste de pesos que é empregado em
funções internas de cada rede neural, fazendo com que os valores dos pesos se
ajustassem a cada iteração. Com isso, compreende-se que fazendo uso de RNAs
as arquiteturas iniciais, teoricamente, são sempre distintas das arquiteturas finais.
48

Figura 14 – Arquitetura final da MLP1.

Fonte: Autoria própria.

Na sequência de experimentações foi desenvolvida e treinada da mesma


maneira a rede neural MLP2 (utilizando a biblioteca Keras) e como mencionada na
Seção 3.5, tal rede utilizou uma função de ativação distinta da MLP1. A diferença
existente entre as redes é que com a utilização da biblioteca a porcentagem do erro
observado é adequada para cada saída alcançada, ou seja, variando para cada
iteração. Outra característica observada ao se utilizar a biblioteca, é que alguns dos
valores e etapas internas da rede não são possíveis de se realizar algum tipo de
análise para identificar padrões e/ou tirar conclusões a respeito.
Na execução do código e na criação da rede, a biblioteca desconsiderou o
valor do bias do neurônio da camada de saída. Isso ocorre em razão de que esse
neurônio contém o valor predito e, devido ao uso do algoritmo Adam e da função de
ativação linear, o limiar de ativação não atua sob o último neurônio. Com base nessa
informação, a Figura 15 detalha como é constituída inicialmente a arquitetura da
MLP2 com a mesma quantidade de camadas da rede anterior.
49

Na Figura 15, a representação da arquitetura da rede ocorre da mesma


maneira detalhada na Figura 13. A diferença existente é no valor do bias da camada
de saída. Com base nesse conhecimento, realizou-se por meio da função fit o
treinamento da rede e, além disso, utilizou-se 2500 épocas nessa fase. Após
realizar o treinamento para cada camada, a nova arquitetura da rede MLP2
desenvolvida com o auxílio da biblioteca Keras, pode ser observada na Figura 16.
A Figura 16 detalha como os pesos iniciais foram alterados com o passar das
épocas de treinamento da rede neural. Dessa forma, com os pesos finais é possível
de se alcançar de maneira mais eficiente os resultados esperados, buscando ser
genérica para todas as entradas. A seção seguinte relata quão precisos foram os
valores obtidos se comparados com os valores reais, ou seja, compara o
desempenho e qualidade do resultado de cada arquitetura obtida.

Figura 15 – Arquitetura inicial da MLP2.

Fonte: Autoria própria.


50

Figura 16 – Arquitetura final da MLP2.

Fonte: Autoria própria.

4.2 Análise das saídas obtidas

Após detalhar todas as mudanças pelas quais as arquiteturas passaram


desde a primeira até a última épocas, posterior à fase de treinamento a qual ambas
foram sujeitas, fez-se necessário realizar uma avaliação do quão próximo foram os
resultados alcançados se comparados com os valores reais. Além disso, mensurou-
se qual o nível de precisão das arquiteturas ao inserir valores distintos (valores dos
últimos cinco meses, conforme relatado na Seção 3.6).
Como mencionado anteriormente, utilizou-se para os testes a mesma base
de dados coletada para o treinamento da rede, visto que seria necessário utilizar os
seis últimos meses dos valores atuais selecionados. Diante dessa informação, a
avaliação consistiu em quantificar o erro real alcançado comparando os valores
obtidos durante a fase de treinamento com o valor real do IBOV. Tais valores
deveriam ser o mais próximos possível dos valores reais. De modo a tornar mais
compreensível a visualização do desempenho das redes, foram utilizados os
valores reais e os valores alcançados por cada MLP para desenvolver o gráfico
mostrado na Figura 17.
51

Figura 17 – Comparativo dos resultados de cada arquitetura (fase de treinamento) com os


valores reais.

Índice Bovespa MLP1 MLP2


100000

90000

80000
Valores

70000

60000

50000

40000
jan/12 jan/13 jan/14 jan/15 jan/16 jan/17 jan/18 jan/19
Datas

Fonte: Autoria própria.

É possível verificar por meio da Figura 17 que em todas as tentativas de se


obter os valores de saída mais próximos possíveis dos valores reais do IBOV, as
arquiteturas se mostraram eficientes e sempre convergiram. Isso acontece, devido
ao fato de que as redes ajustam os seus pesos sinápticos até obter um resultado
próximo ao valor real.
Uma vez que a fase de treinamento foi finalizada, realizou-se a etapa de teste
com base em determinados dados para ambas as arquiteturas. Dessa forma,
selecionou-se dados dos cinco meses anteriores ao mês de novembro de 2019, e
para cada um desses meses utilizou-se como entrada para as redes neurais os seis
valores imediatamente anteriores ao IBOV do mês que se desejava predizer. Ao se
utilizar dessa estratégia se tornou possível avaliar a eficiência de cada arquitetura
gerada após a fase de treinamento. Na Tabela 4 estão apresentados os valores
selecionados (a serem obtidos) e os seis valores anteriores a serem utilizados como
entradas para as redes.
52

Tabela 4 – Base de dados de entradas e saídas esperadas.

Valores dos seis meses anteriores Valor do mês atual

89820,09; 91012,31; 97861,27; 94603,75; 96054,45; 95527,62 97020,48

91012,31; 97861,27; 94603,75; 96054,45; 95527,62; 97020,48 101066,94

97861,27; 94603,75; 96054,45; 95527,62; 97020,48; 101066,94 102125,94

94603,75; 96054,45; 95527,62; 97020,48; 101066,94; 102125,94 100625,74

96054,45; 95527,62; 97020,48; 101066,94; 102125,94; 100625,74 104053,40

Fonte: Autoria própria.

Com base na Tabela 4, é possível compreender quais os últimos seis valores


mensais utilizados para predizer o último valor. Dessa forma, computacionalmente,
utilizou-se como entrada da rede uma lista com os seis valores, que posteriormente
foram normalizados e operados com os pesos/biases das redes neurais. Dessa
forma, a Figura 18 ilustra um gráfico com os valores obtidos por cada rede neural
se comparados com os valores reais mensais do Índice Bovespa.
Figura 18 – Comparativo dos resultados de cada arquitetura (fase de testes) com os valores
reais.

IBOV MLP1 MLP2

104000

102000

100000
Valores

98000

96000

94000

92000
jun/19 jul/19 ago/19 set/19 out/19
Datas

Fonte: Autoria própria.

Na Figura 18, é possível verificar que enquanto a rede neural MLP2


consegue obter valores bem próximos aos valores reais mensais do IBOV, a rede
53

MLP1 não apresentou o mesmo comportamento, de forma a não conseguir predizer


grande maioria dos valores com a mesma eficiência. Isso ocorreu, provavelmente,
devido ao fato de que a rede MLP1 utilizou a função de ativação sigmoide logística
e o algoritmo de otimização Estocástico Gradiente Descendente, pois conforme
pode ser observado há uma semelhança arquitetural entre as redes, exceto no que
diz respeito aos mencionados funções de ativação e algoritmo de otimização.
Além da análise dos valores obtidos como resultados da rede, foi calculado
qual o percentual alcançado por cada resultado da RNA, quando comparado ao
resultado real. O intuito de realizar essa etapa, é verificar qual porcentagem do valor
real cada resultado das redes representa. Vale ressaltar, que o objetivo dessa etapa
é verificar qual das redes obteve a melhor solução, ou seja, quanto mais próximo
de 100%, melhor é a precisão do valor obtido pela rede. Além disso, verificou-se,
com base nas métricas de desempenho, a eficiência e a acurácia de cada uma das
arquiteturas. Com base nessas informações, o gráfico representado pela Figura 19
mostra a porcentagem do valor real que cada arquitetura obteve.

Figura 19 – Percentual do resultado de cada arquitetura.

MLP1 MLP2

100%
99%
98%
97%
Percentual

96%
95%
94%
93%
92%
91%
90%
97020,48 101066,94 102125,94 100625,74 104053,4
IBOV real

Fonte: Autoria própria.

Na Figura 19, o eixo X representa os valores reais do Índice Bovespa,


enquanto no eixo Y, estão alocados o percentual de acerto obtido por cada rede.
Após isso, foi preciso realizar um estudo com base na literatura correlata, de modo
a verificar se os valores alcançados foram aceitáveis. Nesse processo observou-se
54

que em grande parte dos trabalhos analisados, os erros que estivessem no intervalo
de 1 a 10% são considerados aceitáveis. Com base no exposto, é possível verificar
que ambas as arquiteturas se mostraram eficientes ao realizar a predição dos
valores utilizados. Porém, a arquitetura e os parâmetros utilizados na MLP2,
mostraram-se superiores se comparados à MLP1, visto que todos os resultados
obtidos na fase de testes foram superiores a 96%.
Uma vez que foram encontrados os valores referentes à taxa de acerto de
cada rede, foram calculadas as métricas mencionadas na Seção 2.4. Para a MLP1,
obteve-se um valor de MSE igual a 1965329,63, e de RMSE um valor igual a
1401,90. Por outro lado, no que diz respeito à rede MLP2, foram obtidos valores de
MSE e RMSE, respectivamente iguais a 196844,52 e 443,67. Posteriormente,
verificou-se qual a acurácia da rede, tomando como base que o erro permitido para
a saída seria de 7% (tendo em mente análises empíricas). Com base no cálculo de
quantas saídas atendiam a esse critério, obteve-se uma acurácia de 80% para a
arquitetura da MLP1 e 100% para a arquitetura da MLP2.
Apesar dos valores altos de acurácia das arquiteturas, quando se realiza um
estudo a respeito do mercado acionário, propor uma arquitetura que oferece um
erro de 7% pode resultar em um prejuízo relativamente grande ao investidor. Dessa
forma, foi preciso reduzir ainda mais a margem de erro tolerável a fim de verificar
se as redes seriam realmente eficientes nessa predição, selecionou-se então um
erro permitido de 2%, pois utilizando esse valor foi possível reduzir o prejuízo (se
comparado a 7% de erro). Realizando então a análise, concluiu-se que a MLP2 se
mostrou novamente superior (se comparada a MLP1), visto que obteve uma taxa
de acerto de 80% para os valores utilizados na fase de testes, enquanto a MLP1
obteve 0% de taxa de acerto, não conseguindo predizer nenhum valor com uma
margem menor ou igual à 2% de erro.
Baseando-se nesse resultado é possível mensurar, comparando com as
arquiteturas existentes na literatura computacional, qual é a eficiência das redes,
parâmetros e função de ativação sugeridas por este trabalho. Com esse intuito,
utilizou-se os resultados (arquitetura de uma MLP) obtidos por Dametto (2018). A
arquitetura de Dametto foi utilizada para realizar predições com base em valores
diários do Índice Bovespa, em predições realizadas para períodos mais curtos
geralmente utiliza-se um erro inferior à 7% (utilizado neste trabalho), visto que a
cotação diária tem pouca variação (comparada à variação mensal). Além disso, para
55

a elaboração de uma arquitetura que prediz valores diários, existe uma quantidade
maior de dados a serem utilizados na fase de treinamento, fato que melhora a
capacidade de predição da rede.
Com base no exposto, é necessário enfatizar que a arquitetura desenvolvida
por Dametto, era composta de duas funções de ativação distintas (Unidade Linear
Retificada e Tangente Hiperbólica). Tal arquitetura também possui uma quantidade
maior de neurônios na camada intermediária (14 neurônios e apenas uma camada
oculta), diferentemente das arquiteturas desenvolvidas neste trabalho. Por meio
dessas informações, é possível classificar a arquitetura da MLP2 (obtida neste
trabalho) como uma arquitetura eficiente e capaz de predizer valores com um erro
inferior a 2% (na maioria das vezes), o qual pode ser considerado mínimo quando
se observa a variação mensal do IBOV. Utilizou-se o trabalho de Dametto para
realizar essa comparação devido ao fato de que essa dissertação serviu de
inspiração para a elaboração e desenvolvimento deste trabalho.
56

5 CONCLUSÃO

Com o desenvolvimento deste trabalho, foi possível apresentar um contexto


para realizar a predição dos valores mensais do Índice Bovespa. Para esse fim,
utilizou-se de técnicas da Inteligência Artificial, especificamente da Aprendizagem
de Máquina, empregando Redes Neurais Artificiais. Dessa forma, foi preciso definir
quais arquiteturas seriam utilizadas para tal fim e qual delas iria possuir a melhor
eficiência. De forma a construir uma base de dados efetiva, utilizou-se de
informações do mercado financeiro disponibilizadas por meio da plataforma UOL
Economias, devido ao seu extenso Banco de Dados (no que diz respeito a período
de tempo).
Nesse sentido, o objetivo deste trabalho foi obter arquiteturas (de RNAs) que
fossem capazes de predizer com eficiência os futuros valores do IBOV.
Posteriormente, foram selecionadas dentre essas arquiteturas capacitadas, quais
delas obtiveram melhor desempenho, com o intuito de fornecê-las aos
pesquisadores, evitando o tempo demandado na fase de modelagem para aqueles
que as utilizarem. Com o intuito de alcançar esse objetivo, foi desenvolvido um Web
Crawler Agent, que realizou, de maneira automática, a coleta dos dados históricos
utilizados.
De posse das informações que foram utilizadas neste trabalho, a primeira
RNA foi desenvolvida sem o auxílio da biblioteca Keras. Durante o desenvolvimento
dessa rede, foram encontradas diversas adversidades, as quais são reportadas na
subseção 5.1.
Ao término da implementação dessa RNA candidata, foram implementadas
a segunda e a terceira redes neurais (MLP1 e MLP2), porém fez-se o uso da
biblioteca Keras para auxiliar em sua implementação. As vantagens de se utilizar
essa biblioteca, foi que pôde-se manipular as funções fornecidas por tal, a
implementação das redes foi feita em um tempo menor e os seus resultados foram
mais precisos. Isso ocorre pois com o uso da biblioteca as operações são menos
suscetíveis a erros, visto que as operações já foram validadas por desenvolvedores.
Além disso, a utilização da biblioteca não exige um conhecimento tão aprofundado
em RNAs para a manipulação de suas funções. Dessa forma, qualquer parte da
construção ou definição de parâmetros da rede é feita internamente, sem que haja
intervenções do desenvolvedor. A única entrada necessária para a definição do
57

modelo é a definição das quantidades de camadas e neurônios, funções de ativação


a serem utilizadas e, por fim, quais os valores de entrada e qual a saída a ser
alcançada.
Com as arquiteturas já treinadas e funcionais, realizaram-se testes para
verificar a eficiência na predição de cada valor. Ambas as arquiteturas obtiveram
em sua fase de testes, valores próximos àqueles que esperava-se obter,
alcançando uma acurácia de 80% e 100%, para a MLP1 e para a MLP2. A melhor
arquitetura obtida em todos os testes foi a MLP2 (principalmente quando utilizou-se
2% de taxa de erro aceitável). Essa arquitetura (MLP2) se mostrou superior a MLP1
visto que, foi treinada utilizando uma quantidade menor de épocas, não houve a
necessidade de normalizar e desnormalizar os dados para sua utilização, o seu
tempo de execução foi menor e conseguiu predizer com maior precisão nos testes
com uma taxa de erro menor e maior.
Dessa forma, ao término deste trabalho, é possível concluir que as
arquiteturas propostas podem ser utilizadas na predição de valores do Índice
Bovespa, especificamente. Espera-se que com base nos resultados obtidos,
pesquisadores da área as utilizem para o desenvolvimento acadêmico, científico ou
com o intuito de investir no mercado acionário.

5.1 Limitações e Trabalhos Futuros

Durante o desenvolvimento deste trabalho, principalmente na etapa de


implementação das redes neurais artificiais, encontrou-se diversas limitações.
Grande parte delas ocorreu durante a implementação da primeira RNA, devido,
principalmente, à não utilização da biblioteca Keras como ferramenta auxiliar no
desenvolvimento, ou seja, foi necessário elaborar os algoritmos backpropagation e
ajuste de pesos de forma manual. Esses algoritmos possuem uma complexidade
de desenvolvimento considerável, visto que são operados por meio de derivações
sequenciais e por esse motivo podem resultar, facilmente, em valores imprecisos.
Ainda sobre essa parte de desenvolvimento, em particular, foi necessário construir
essa rede desde o seu início, o que demandou exaustivos testes para verificar sua
funcionalidade.
Uma outra fase de desenvolvimento do trabalho que deve ser enfatizada é a
implementação das outras (duas) arquiteturas com o auxílio da biblioteca Keras.
58

Durante o processo de desenvolvimento dessas redes, foi possível perceber


algumas insuficiências. Com base na distinção da função de ativação utilizada por
cada rede, em particular, na sigmoide logística, foi preciso aplicar as técnicas de
normalização e desnormalização de dados, fato que aumentou a consideravelmente
a carga de trabalho. Além disso, as épocas necessárias para a rede MLP1 convergir
na fase de treinamento foram maiores que a rede MLP2 (devido às funções de
ativação empregadas) o que consequentemente implicou na adoção de uma
quantidade de épocas em uma proporção mil vezes maior.
Outra dificuldade, a qual influencia na fase de predição da rede, ocorreu no
momento em que o valor do Índice Bovespa obteve quedas e elevações repentinas.
Isso acontece devido ao fato de que os valores do mercado acionário (séries
temporais financeiras) sofrem interferência governamental, com isso os valores do
IBOV podem ser alterados de maneira imprevisível conforme a economia do país.
Isso faz com que a rede neural consiga alcançar tais valores na fase de treinamento,
porém na fase de testes em que busca-se predizer valor do próximo mês, em caso
de queda ou elevação por esse motivo, a arquitetura não será eficiente.
Com base no exposto, este trabalho proporcionou para a literatura
computacional arquiteturas que se mostraram eficientes na predição dos valores do
Índice Bovespa, especificamente. Nesse sentido, ainda é possível verificar se as
mesmas são válidas na predição de outras séries temporais financeiras, por
exemplo, o conjunto de ações do mercado acionário. Assim, para a realização de
trabalhos futuros (relacionados à temática) poderá ser feita a utilização de algumas
soluções empregadas neste trabalho com o intuito de solucionar algumas dessas
limitações.
Uma possível alternativa seria implementar novas arquiteturas e compará-
las com as arquiteturas obtidas neste trabalho, de modo a verificar a existência de
uma arquitetura ainda mais eficiente que a MLP2. Além disso, combinar as técnicas
de predição utilizadas neste trabalho com outras técnicas de classificação que
buscam identificar futuras interferências governamentais, por exemplo, por meio de
análises de notícias, poderia surgir como uma potencial solução para contornar uma
queda imprevista no valor das ações.
59

REFERÊNCIAS BIBLIOGRÁFICAS

ASSAF NETO, Alexandre. Mercado financeiro. Atlas, 2018.

BANCO CENTRAL DO BRASIL. Sistema Financeiro Nacional (SFN). S.d.


Disponível em: <https://www.bcb.gov.br/estabilidadefinanceira/sfn>. Acesso em: 8
maio. 2019.

BM&FBOVESPA. Ações | B3. 2019. Disponível em:


<http://www.b3.com.br/pt_br/market-data-e-indices/servicos-de-dados/market-
data/cotacoes/>. Acesso em: 18 abr. 2019.

BM&FBOVESPA. Apostila - Guia Completo. 2017. Disponível em:


<https://educacional.bmfbovespa.com.br/documentos/ApostilaPQO.pdf>. Acesso
em: 8 maio. 2019.

BM&FBOVESPA. Histórico pessoas físicas. 2018. Disponível em:


<http://www.bmfbovespa.com.br/pt_br/servicos/market-data/consultas/historico-
pessoas-fisicas/>. Acesso em: 18 abr. 2019.

CAVALCANTE, Francisco. Mercado de capitais. Elsevier Brasil, 2002.

DAMETTO, Ronaldo César. Estudo da aplicação de redes neurais artificiais para


predição de séries temporais financeiras. 2018.

DE BARROS FRANCO, David Gabriel; STEINER, Maria Teresinha Arns. Estudo


comparativo de redes neurais artificiais para previsão de séries temporais
financeiras. Blucher Marine Engineering Proceedings, v. 1, n. 1, p. 303-313,
2014.

FACELI, Katti et al. Inteligência Artificial: Uma abordagem de aprendizado de


máquina. 2011.

FILHO, Mario. How to Create a Simple Machine Learning Model to Predict


Time Series. S.d Disponível em: < http://mariofilho.com/create-simple-machine-
learning-model-predict-time-series/>. Acesso em: 18 ago. 2019.

FLORENCIO, Paulo Henrique Borba. Aplicação de Redes Neurais Artificiais na


Previsão de Demanda de Peças de Reposição de Veículos Automotores. 2016. 88
f. Dissertação (Mestrado em Engenharia) - Pontifícia Universidade Católica de
Goiás, GOIÂNIA, 2016.

HAYKIN, Simon S. et al. Neural networks and learning machines. Upper Saddle
River: Pearson education, 2009.

KINGMA, Diederik P.; BA, Jimmy. Adam: A method for stochastic optimization.
arXiv preprint arXiv:1412.6980, 2014.

KERAS. Keras Documentation. S.d. Disponível em: <https://keras.io/>. Acesso


em: 15 out. 2019.
60

MENEZES, Nilo Ney Coutinho. Introdução à programação com python. São


Paulo: Novatec, 2010.

MITCHELL, Thomas M. 1997. Machine Learning (1 ed.). McGraw-Hill, Inc., New


York, NY, USA.

MORETTIN, Pedro A.; TOLOI, Clélia. Análise de séries temporais. In: Análise de
séries temporais. 2006.

NORVIG, Peter; RUSSELL, Stuart. Inteligência Artificial: Tradução da 3a


Edição. Elsevier Brasil, 2014.

PINHEIRO, Juliano Lima. Mercado de capitais. Atlas, 2018.

PREGÃO. In: DICIO, Dicionário Online de Português. Porto: 7Graus, 2019.


Disponível em: <https://www.dicio.com.br/pregao/>. Acesso em: 19/10/2019.

RUDER, Sebastian. An overview of gradient descent optimization algorithms. arXiv


preprint arXiv:1609.04747, 2016.

SCARPEL, Rodrigo Arnaldo. Utilização de Support Vector Machine em previsão


de insolvência de empresas. Anais do XXXVII Simpósio Brasileiro de Pesquisa
Operacional, p. 671-677, 2005.

SOUZA, Paulo Campos. A utilização dos métodos de Data Mining e Machine


Learning no processo de prevenção à fraudes no mercado segurador. 2017

WUERGES, Artur Filipe Ewald; BORBA, José Alonso. Redes neurais, lógica
nebulosa e algoritmos genéticos: aplicações e possibilidades em finanças e
contabilidade. JISTEM-Journal of Information Systems and Technology
Management (Online), v. 7, n. 1, p. 163-182, 2010.

Você também pode gostar