essas características com um desvio padrão alto pode ser o indicador de que a
empresa está trabalhando sobre uma volatilidade muito grande, em outras palavras,
assim como ela valorizou muito repentinamente, a mesma pode desvalorizar muito de
forma rápida também, levando junto consigo o seu investimento.
O mercado de ações é também baseado nestes tipos de características, se você
estudar o mercado financeiro ou ao menos obter alguma consultoria de alguém que
trabalha diretamente nesse meio, verá que o operador está sempre atento a tudo o
que pode interferir na valorização ou desvalorização dos ativos de uma determinada
empresa, realizando essa leitura diariamente, várias vezes durante o dia, para
tentar identificar o momento certo de investir em um determinado portfólio.
Nesse exemplo apenas realizamos os entendimentos iniciais deste universo, colocando
em prática os meios de como se obtém dados para que a partir dos mesmos possamos
gerar informações relevantes para nossos investimentos. Conforme formos avançando
os capítulos estaremos usando de meios mais complexos para realizar análise
financeira.
------------------------------------------------------------------- Outros métodos
e funções interessantes de serem implementadas:
Caso você já esteja familiarizado com Python deve saber bem que uma determinada
ação pode ser realizada de diferentes formas, cabendo ao desenvolvedor escolher os
meios e métodos aos quais se sente mais à vontade para trabalhar. O mesmo ocorre
com as bibliotecas desenvolvidas pela comunidade, não é difícil encontrar na
estrutura de uma biblioteca ou módulo diferentes estruturas de função com o mesmo
propósito ou com intercompatibilidade. Vamos ver mais algumas dessas possibilidades
que podem tornar nossos códigos mais robustos.
No processo de importação de nossa base de dados, usamos da biblioteca
pandas_datareader para realizar tal importação diretamente do site Yahoo Finanças,
e fizemos isso usando da classe DataReader( ) da mesma. Visando melhor performance,
é possível chamar apenas a função específica para importação do site Yahoo
Finanças, por meio da função get_data_yahoo( ).
data = wb.get_data_yahoo('AAPL', start=datetime.datetime(2019, 1, 1),
end=datetime.datetime(2020, 1, 1)) Note que, já que estamos usando da função
específica, não é mais necessário passar a fonte ‘Yahoo’ como parâmetro de função,
apenas qual carteira e que intervalo de tempo, neste caso, usando da própria
biblioteca datetime do sistema.
Vimos em outro momento que é perfeitamente possível criar novas colunas em nosso
dataframe, e usando da própria gama de possibilidades nativas do Python, podemos
fazer este tipo de criação inclusive por meio de operadores.
Supondo que estamos a criar uma nova coluna com os valores da diferença entre os
valores de abertura e do fechamento do mercado, isso pode ser feito diretamente
aplicando um operador aritmético sobre tais colunas de nosso dataframe.
data['diferenca'] = data.Open - data.Close print(data) Note que estamos usando a
notação de referenciar uma coluna de nome ‘diferenca’ em nossa variável data, o
valor a ser atribuído para a mesma nada mais é do que os valores de Open – Close,
sendo possível realizar essa subtração diretamente sobre tais colunas.Seguindo com
o código, agora que temos uma estrutura já funcional, podemos definir alguns
parâmetros a serem usados.
Lembrando que definimos esses parâmetros manualmente e por meio de variáveis para
que possamos os modificar de forma mais fácil e dinâmica.
Seguindo essa lógica criamos a variável stock_name que recebe “AAPL” como atributo,
uma vez que neste exemplo em particular estamos trabalhando com ações da Apple;
data que recebe como atribuição o retorno da função dataset_loader( ) que por sua
vez recebe o dado de stock_name (Caso você queira testar outro portfólio de
carteiras de ações de outras empresas basta alterar o nome repassado a stock_name;
s que instancia a função state_creator( ) passando um valor para data, 0 e 5
respectivamente. Apenas relembrando que s é o estado de nosso agente de acordo com
a lógica da equação de Bellman.
Dando sequência criamos a variável trader que por sua vez instancia a classe
AI_Trader( ) passando como atributo de classe os dados contidos em window_size. A
partir desse ponto é possível também visualizar (caso não haja nenhum erro de
sintaxe ou de cruzamento dos dados) o sumário de nossa rede neural artificial
intuitiva, por meio da função print( ) parametrizada com trader.model.summary( ).
Via console é possível visualizar o sumário que descreve a arquitetura de nossa
rede neural artificial intuitiva. Como visto anteriormente trata-se de uma
estrutura bastante básica, com poucos neurônios e camadas de processamento, ainda
assim, note que, de acordo com os dados acima, temos a interconexão de 11,171
neurônios, cada um por sua vez com seus respectivos valores, pesos, funções de
ativação, etc...
Concluída a estrutura de nosso agente em si, uma prática bastante comum é criar uma
estrutura onde ao mesmo tempo em que os dados são lidos e processados, possamos
acompanhar de forma visual o processamento dos mesmos.
Para tal feito, inicialmente criamos um laço de repetição que percorrerá cada
episódio (cada ciclo de processamento) de nosso agente, exibindo em terminal o
andamento dessas etapas.
Novamente é instanciada a variável state chamando a função state_creator( ). É
criada a variável total_profit inicialmente com valor zerado, que será atualizada
com os dados referentes ao lucro ou perda obtidos no processo de corretagem. Da
mesma forma também é criada sobre trader um objeto de inventário que inicialmente
recebe uma lista vazia atribuída a si, mas que armazenará os dados das transações.
Em seguida é criado um novo laço de repetição dentro do laço atual, onde fazendo o
uso da ferramenta tqdm( ) parametrizada com o tamanho de data_samples nos exibirá
uma barra de progresso em nosso console, facilitando a visualização do progresso de
processamento em si.
Também é criada a variável reward, inicialmente com valor 0 atribuído, uma vez que
no gatilho inicial de nosso agente ainda não há o feedback de uma ação e
automaticamente ainda não há uma recompensa ou penalidade aplicada sobre seu estado
atual.
Ainda dentro do laço de repetição inicial agora criamos uma estrutura condicional a
ser executada. Basicamente, estipulamos que se o valor de action for igual a 1 será
realizada a ação de compra de uma ação. Para isso simplesmente adicionamos ao
inventário o valor lido em data em seu último estado. Também exibimos a mensagem
que nosso Agente comprou uma determinada ação. Ainda nessa estrutura, caso o valor
de action seja igual a 2 e o tamanho do inventário seja maior que 0, de buy_price é
removido o valor 0 de seu inventário. Se você reparar, esta é apenas outra maneira
de representar a necessidade de nosso agente de buscar os últimos valores obtido
para que se realize todo um processamento sobre o mesmo, em continuidade.
Em seguida reward agora é atualizada com o valor máximo do estado atual de data
subtraindo o valor de buy_price. Da mesma forma é possível também definir que
total_profit quando atualizado recebe o valor dele mesmo somado do valor atual de
data menos o valor de buy_price, em outras palavras, devemos considerar todo o
processo para separar apenas o que diz respeito ao lucro total da operação.
Finalizando, é exibida em tela uma primeira mensagem de que nesse caso nosso Agente
vendeu uma ação e uma segunda mensagem exibindo qual foi o lucro obtido na
operação, já que, corretagem trata-se de comprar uma determinada ação em um preço e
vender em outro tentando sempre lucrar com essa diferença de valor de compra/venda.