Previsão de preços de ações usando aprendizado de reforço

Conteúdo

Esta postagem foi lançada como parte do Data Science Blogathon.

Introdução

preço das ações-3832087

Neste post, intentaremos mitigar eso a través de el uso del aprendizaje por refuerzo.

Técnicas que podemos usar para prever os preços das ações

Como é uma previsão de valores contínuos, qualquer tipo de técnica de regressão pode ser usada:

  • A regressão linear ajudará você a prever valores contínuos
  • Modelos de série temporal são modelos que podem ser usados ​​para dados relacionados ao tempo.
  • ARIMA é um daqueles modelos usados ​​para prever previsões futurísticas associadas ao tempo..
  • LSTM também é uma daquelas técnicas que tem sido usada para previsões de preços de ações.. LSTM se refere à memória de longo prazo e faz uso de redes neurais para prever valores contínuos. LSTMs são muito poderosos e são conhecidos por reter memória de longo prazo.

Apesar disto, há outra técnica que pode ser usada para previsões de preços de ações e que é o aprendizado de reforço.

87552download201-6799798

O que é aprendizagem por reforço?

El aprendizaje por refuerzo es otro tipo de aprendizaje automático al mismo tiempo del aprendizagem supervisionada e não supervisionado. É um sistema de aprendizagem baseado em agente no qual o agente realiza ações em um ambiente em que o objetivo é maximizar o registro.. Aprendizagem por reforço não requer o uso de dados rotulados, como aprendizagem supervisionada.

O aprendizado por reforço funciona muito bem com menos dados históricos. Ele faz uso da função de valor e o calcula com base na política que é decidida para aquela ação.

A aprendizagem por reforço é modelada como um procedimento de decisão de Markov (MDP):

  • Um ambiente E e estados de agente S

  • Um conjunto de ações A tomadas pelo agente.

  • P (s, s ‘) => P (st + 1 = s’ | st = s, at = a) é a probabilidade de transição de um estado para s ‘

  • R (s, s ‘): recompensa imediata por qualquer ação

Como podemos prever os preços do mercado de ações usando o aprendizado de reforço?

O conceito de aprendizagem reforçada pode ser aplicado para prever o preço de uma ação específica., uma vez que usa os mesmos princípios fundamentais de exigir dados históricos menores, trabalhar em um sistema baseado em agente para prever retornos mais elevados com base no ambiente atual. Veremos um exemplo de previsão do preço de uma ação para uma determinada ação seguindo o modelo de aprendizagem por reforço. Faz uso do conceito de aprendizagem Q explicado em mais detalhes.

As etapas para projetar um modelo de aprendizagem por reforço são:

  • Importação de bibliotecas
  • Crie o agente que tomará todas as decisões.
  • Defina funções básicas para formatar valores, função sigmóide, ler arquivo de dados, etc.
  • Treine o agente
  • Examine o desempenho do agente

Estabeleça o Ambiente de Aprendizagem Reforçada

MDP para previsão do preço das ações:

  • Agente: um agente A trabalhando no ambiente E
  • Açao – Comprar / Mercado / Manter
  • Estado: valores de dados
  • Recompensas: Lucros / perdas
42998download-1678374

Papel de Q – Aprendendo

Q-learning é um algoritmo de aprendizado por reforço sem modelo para saber a qualidade das ações e dizer a um agente que ação tomar em quais circunstâncias. O Q-learning encontra uma política ótima no sentido de maximizar o valor esperado da recompensa total em qualquer etapa sucessiva, começando do estado atual.

Coleção de dados

  1. Ir a Yahoo Finance

  2. Insira o nome da empresa, como um exemplo. Banco HDFC

  3. Selecione o período de tempo para, como um exemplo, 5 anos

  4. Clique em Download para baixar o arquivo CSV

39120data-6637811

Vamos implementar nosso modelo em Python

Importação de bibliotecas

Para construir o modelo de aprendizagem por reforço, importe las bibliotecas de Python indispensables para modelar las capas de la neuronal vermelho y la biblioteca NumPy para algunas operaciones básicas.

import keras
from keras.models import Sequential
from keras.models import load_model
from keras.layers import Dense
from keras.optimizers import Adam
import math
import numpy as np
import random
from collections import deque

Criando o Agente

El código del agente comienza con algunas inicializaciones básicas para los distintos parametros. Algumas variáveis estáticas são definidas como gama, Épsilon, epsilon_min e epsilon_decay. São valores de limiar constantes que são usados para conduzir todo o procedimento de compra e venda de ações e manter os parâmetros calmos.. Esses valores mínimos e de queda servem como valores limiares na distribuição normal.

Agente projeta modelo de rede neural em camadas para realizar ações de compra, venda ou retenção. Esse tipo de ação é realizada observando sua previsão anterior e também o estado do ambiente atual. O método de ato é usado para prever a próxima ação a ser tomada. Se a memória estiver preenchida, há outro método chamado expreplay projetado para redefinir a memória.

Agente de Classe:

    def __init__(auto, state_size, is_eval=Falso, model_name =""):
        self.state_size = state_size # normalized previous days
        self.action_size = 3 # Sentar, comprar, sell
        self.memory = deque(maxlen=1000)
        auto.inventário = []
        self.model_name = model_name
        self.is_eval = is_eval
        self.gamma = 0.95
        self.epsilon = 1.0
        self.epsilon_min = 0.01
        self.epsilon_decay = 0.995
        auto.modelo = load_model(model_name) se is_eval mais self._model()
    def _model(auto):
        modelo = Sequencial()
        model.add(Denso(unidades=64, input_dim=self.state_size, ativação ="retomar"))
        model.add(Denso(unidades=32, ativação ="retomar"))
        model.add(Denso(unidades=8, ativação ="retomar"))
        model.add(Denso(self.action_size, ativação ="linear"))
        model.compile(perda ="mse", otimizador = Adam(lr=0,001))
        return model
    def act(auto, Estado):
        se não self.is_eval e aleatório.aleatório()<= self.epsilon:
            retorno aleatório.randrange(self.action_size)
        opções = self.model.predict(Estado)
        retorno np.argmax(Opções[0])
    def expReplay(auto, tamanho do batch):
        mini_batch = []
        l = len(auto.memória)
        para eu no alcance(eu - tamanho do batch + 1, eu):
            mini_batch.append(auto.memória[eu])
        para o estado, açao, recompensa, next_state, feito em mini_batch:
            target = reward
            if not done:
                alvo = recompensa + auto.gamma * np.amax(auto.model.predict(next_state)[0])
            target_f = auto.model.predict(Estado)
            target_f[0][açao] = target
            self.model.fit(Estado, target_f, épocas=1, verbose = 0)
        se self.epsilon > self.epsilon_min:
            auto.epsilon *= self.epsilon_decay

Establecer funciones básicas

El formatprice () é escrito para estruturar o formato da moeda. GetStockDataVec () trará os dados de estoque para Python. Defina a função sigmoide como um cálculo matemático. GetState () é codificado de tal forma que fornece o estado atual dos dados.

formato defPrice(n):
    Retorna("-Rs." se n<0 outro "Rs.")+"{0:.2f}".formato(abdômen(n))
def getStockDataVec(chave):
    vec = []
    linhas = abertas(chave+".csv","r").leitura().linhas de divisão()
    para linha em linhas[1:]:
        #imprimir(linha)
        #imprimir(flutuador(linha.split(",")[4]))
        vec.append(flutuador(linha.split(",")[4]))
        #imprimir(vec)
    return vec 
def sigmoid(x):
    Retorna 1/(1+math.exp(-x))
def getState(dados, t, n):
    d = t - n + 1
    bloco = dados[d:t + 1] se d >= 0 outra coisa -d * [dados[0]] + dados[0:t + 1] # pad with t0
    res = []
    para eu no alcance(n - 1):
        res.append(sigmóide(bloquear[eu + 1] - bloquear[eu]))
    retorno np.array([res])

Treinando o Agente

Dependendo da ação prevista pelo modelo, a chamada de compra / venda adiciona ou subtrai dinheiro. Se entrena por medio de múltiples episodios que son los mismos que épocas en el aprendizado profundo. A seguir, o modelo é salvo mais tarde.

import sys
stock_name = input("Digite stock_name, window_size, Episode_count")
window_size = entrada()
episode_count = entrada()
stock_name = str(stock_name)
window_size = int(window_size)
episode_count = int(episode_count)
agente = Agente(window_size)
dados = getStockDataVec(stock_name)
l = len(dados) - 1
batch_size = 32
para e no intervalo(episode_count + 1):
    imprimir("Episódio " + str(e) + "/" + str(episode_count))
    estado = getState(dados, 0, window_size + 1)
    total_profit = 0
    agente.inventário = []
    para t no intervalo(eu):
        ação = agente.act(Estado)
        # sit
        next_state = getState(dados, t + 1, window_size + 1)
        recompensa = 0
        se a ação == 1: # buy
            agent.inventory.append(dados[t])
            imprimir("Comprar: " + formatPrice(dados[t]))
        elif ação == 2 e len(agente.inventário) > 0: # sell
            bought_price = window_size_price = agent.inventory.pop(0)
            recompensa = max(dados[t] - bought_price, 0)
            total_profit += dados[t] - bought_price
            print("Vender: " + formatPrice(dados[t]) + " | Lucro: " + formatPrice(dados[t] - bought_price))
        feito = Verdadeiro se t == l - 1 else False
        agent.memory.append((Estado, açao, recompensa, next_state, terminado))
        state = next_state
        if done:
            imprimir("--------------------------------")
            imprimir("Lucro Total: " + formatPrice(total_profit))
            imprimir("--------------------------------")
        se len(agente.memória) > tamanho do batch:
            agent.expReplay(tamanho do batch)
    se e % 10 == 0:
        agent.model.save(str(e))

Salida de Treinamento al final del primer episodio:

Lucro Total: Rs.340.03
770801_26xdrhi-alvdafcppjjgjq-5373529
Realimentação, Em outras palavras, a recompensa é dada ao Agente para processamento adicional.

Avaliação de modelo

Uma vez que o modelo tenha sido treinado com base nos novos dados, você será capaz de testar o modelo para definir os lucros / perdas oferecidas. Em consequência, pode examinar a credibilidade do modelo.

stock_name = entrada("Digite Stock_name, Model_name")
model_name = entrada()
modelo = load_model(model_name)
window_size = modelo.camadas[0].input.shape.as_list()[1]
agente = Agente(window_size, Verdade, model_name)
dados = getStockDataVec(stock_name)
imprimir(dados)
l = len(dados) - 1
batch_size = 32
estado = getState(dados, 0, window_size + 1)
imprimir(Estado)
total_profit = 0
agente.inventário = []
imprimir(eu)
para t no intervalo(eu):
    ação = agente.act(Estado)
    imprimir(açao)
    # sit
    next_state = getState(dados, t + 1, window_size + 1)
    recompensa = 0
    se a ação == 1: # buy
        agent.inventory.append(dados[t])
        imprimir("Comprar: " + formatPrice(dados[t]))
    elif ação == 2 e len(agente.inventário) > 0: # sell
        bought_price = agent.inventory.pop(0)
        recompensa = max(dados[t] - bought_price, 0)
        total_profit += dados[t] - bought_price
        print("Vender: " + formatPrice(dados[t]) + " | Lucro: " + formatPrice(dados[t] - bought_price))
    feito = Verdadeiro se t == l - 1 else False
    agent.memory.append((Estado, açao, recompensa, next_state, terminado))
    state = next_state
    if done:
        imprimir("--------------------------------")
        imprimir(stock_name + " Lucro Total: " + formatPrice(total_profit))
        imprimir("--------------------------------")
        imprimir ("O lucro total é:",formatPrice(total_profit))

Notas finais

Aprendizagem por reforço dá resultados positivos para previsões de valor. Através do uso de Q learning, diferentes experimentos podem ser realizados. Mais pesquisas sobre aprendizagem por reforço permitirão que a aprendizagem por reforço seja aplicada em um estágio mais seguro.

Você pode se comunicar com

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.