Modelo geral de previsão de estoque baseado em rede neural
Endereço de download: Código fonte de previsão de estoque geral + modelo + conjunto de dados com base na rede neural LSTM
0 Como usar Como usar
-
- Use getdata.py para baixar dados ou use sua própria fonte de dados, coloque os dados no diretório stock_daily
-
- Use data_preprocess.py para pré-processar os dados, gere um arquivo pkl e coloque-o no diretório pkl_handle (opcional)
-
- Ajuste os parâmetros em train.py e init.py, primeiro use predict...py para treinar o modelo, gere o arquivo de modelo e, em seguida, use predict.py para fazer previsões, gerar resultados de previsão ou gráficos de comparação de teste
0.1 Introdução aos parâmetros predict.py
-
- –model: nome do modelo, atualmente suporta lstm e transformador
-
- –mode: modo, atualmente suporta treinar, testar e prever
-
- –pkl: se deve usar o arquivo pkl, atualmente suporta 1 e 0
-
- –pkl_queue: Se deve usar o modo de fila pkl para aumentar a velocidade de treinamento, atualmente suporta 1 e 0
-
- –test_code: código de teste, atualmente suporta código de estoque
-
- –test_gpu: se deve usar o teste gpu, atualmente suporta 1 e 0
-
- –predict_days: número de dias para prever, atualmente suporta números
0.2 Introdução a alguns parâmetros em init.py Introdução a alguns parâmetros em init.py
-
- TRAIN_WEIGHT: peso de treinamento, atualmente suporta números menores ou iguais a 1
-
- SEQ_LEN: comprimento da sequência, atualmente suporta números
-
- BATCH_SIZE: tamanho do lote, atualmente suporta números
-
- EPOCH: número de rodadas de treinamento, atualmente suporta números
-
- LEARNING_RATE: taxa de aprendizado, atualmente suporta números menores ou iguais a 1
-
- WEIGHT_DECAY: Decaimento de peso, atualmente suporta números menores ou iguais a 1
-
- SAVE_NUM_ITER: Salve o intervalo do modelo, atualmente suporta números
-
- SAVE_NUM_EPOCH: Salve o intervalo do modelo, atualmente suporta números
-
- SAVE_INTERVAL: Salve o intervalo de tempo do modelo (segundos), atualmente suporta números
-
- OUTPUT_DIMENSION: dimensão de saída, atualmente suporta números
-
- INPUT_DIMENSION: dimensão de entrada, atualmente suporta números
-
- NUM_WORKERS: número de threads, atualmente suporta números
-
- PKL: Se deve usar arquivos pkl, atualmente suporta True e False
-
- BUFFER_SIZE: tamanho do buffer, atualmente suporta números
-
- símbolo: código de estoque, atualmente suporta código de estoque ou Generic.Data significa todos os dados baixados
-
- name_list: o nome do conteúdo que precisa ser previsto
-
- use_list: a troca de conteúdo que precisa ser prevista, 1 significa usar, 0 significa não usar
1 Introdução ao Projeto Introdução ao Projeto
Novo
-
20230402
-
- Modifique o método de leitura do conjunto de dados, use fila e buffer de dados, reduza o número de IO e melhore a velocidade de treinamento
-
- Mova as variáveis globais para init.py para facilitar a modificação
-
20230328
-
- Modifique o formato do arquivo de dados de pré-processamento e adicione dois campos ts_code e data para uso subsequente
-
- Modifique os modelos lstm e transformador para suportar entrada de comprimento misto
-
- No modelo do transformador, uma camada decodificadora é adicionada, o que deve aumentar a precisão da previsão
-
20230327
-
- Parte modificada da lógica de execução e combinada com o arquivo de pré-processamento load pkl, melhorou muito a velocidade de treinamento
-
- Corrigido um bug de alto impacto em relação à direção do fluxo de dados
-
- tente um novo modelo
-
- Adicionada uma nova métrica para avaliar a qualidade de um modelo
-
20230325
-
- Aumente a função de pré-processamento de dados e salve a fila pré-processada como um arquivo pkl para reduzir a perda de E/S
-
- Modifique o código desnecessário
-
- Simplifique a lógica, diminua a responsabilidade do tempo, e a direção é trocar o espaço pelo tempo
-
- Adicione indicadores comuns para aumentar a precisão da previsão
-
20230322
-
- Aumente o controle de conteúdo de saída, você mesmo pode definir o conteúdo e a quantidade de saída
-
- Modifique a fonte de dados de leitura para um arquivo csv local
-
- Modifique a lógica IO, use multi-threading para ler o arquivo csv na pasta especificada, armazene-o na memória, treine repetidamente e reduza o número de IO
-
- Modificar lstm, modelo do transformador
-
- Adicione a função de download de dados, use seu próprio token de API
Obtenha o token de API para baixar dados: Obtenha o token de API para baixar dados:
-
- Registre-se no site https://tushare.pro/ e obtenha pontos suficientes conforme necessário (até março de 2023, você só precisa modificar as informações do usuário, serão pontos suficientes e não serão determinados no futuro)
-
- Você pode visualizar seu próprio token de API na página https://tushare.pro/user/token
-
- Crie um api.txt no diretório raiz deste projeto e grave o token de API obtido neste arquivo
-
- Use este projeto getdata.py para baixar automaticamente os dados diários
O mercado de ações é um fator importante que orienta as mudanças no mercado de negociação.Se você conseguir entender a tendência do mercado de ações, será de grande ajuda para o investimento de pessoas físicas e jurídicas. No entanto, a tendência das ações será afetada por muitos fatores, por isso é difícil medir quantitativamente os fatores de influência. Mas agora, com a ajuda do aprendizado de máquina, é possível construir uma rede, aprender uma certa escala de dados de ações e obter um modelo que pode prever os preços das ações com mais precisão por meio do treinamento de rede, o que pode nos ajudar a entender a tendência das ações. em grande medida. Neste projeto, **LSTM (Long Short-Term Memory Network)** foi construído para prever com sucesso a tendência do estoque.
Em primeiro lugar, em termos de conjuntos de dados , escolhemos a Bolsa de Valores de Xangai nº 000001, o conjunto de dados China Ping An Stock (nº SZ_000001) usa dados de ações de 2016.01.01-2019.12.31, o conteúdo dos dados inclui a data do dia , preço de abertura, preço de fechamento, preço mais alto, preço mais baixo, volume de negociação, taxa de rotatividade. O conjunto de dados é dividido em uma proporção de 0,1 para gerar um conjunto de teste. O processo de treinamento usa os dados dos dias T-99 a T como entrada de treinamento para prever o preço de abertura da ação no dia T+1. (Aqui, gostaria de agradecer a Tushare por fornecer o conjunto de dados diários do estoque e receber seu apoio)
Em termos de modelos e resultados de treinamento , adotamos primeiro o LSTM (Long Short-Term Memory Network), que pode manter informações contextuais em comparação com redes neurais tradicionais e é mais propício a modelos de previsão de ações com base no mercado original para prever o mercado futuro. A rede LSTM nos ajudou a obter um bom resultado de ajuste e a perda rapidamente tendeu a 0. Em seguida, utilizamos a parte do Transformer Encoder proposta para atualizar o modelo LSTM para testes. No entanto, verifica-se que o resultado não é tão superior ao LSTM, o erro de ajuste da curva é maior e o declínio da perda é mais lento. Portanto, este projeto foca na realização do modelo LSTM para prever o mercado de ações.
2 Princípios do modelo LSTM Princípios do modelo LSTM
2.1 Modelo de Série Temporal Modelo de Série Temporal
Modelo de série temporal : A análise preditiva de série temporal é usar as características de um evento no passado para prever as características do evento no futuro. Este é um problema de modelagem preditiva relativamente complexo. Ao contrário da previsão do modelo de análise de regressão, o modelo de série temporal depende da ordem dos eventos. Os resultados do modelo de entrada são diferentes depois que os valores do mesmo tamanho são alterados na ordem .
2.1 De RNN para LSTM De RNN para LSTM
RNN: O resultado do cálculo de cada camada oculta de RNN está relacionado à entrada atual e ao resultado da última camada oculta. Através deste método, os resultados do cálculo de RNN têm a característica de lembrar os resultados anteriores. Entre eles, x é a camada de entrada, o é a camada de saída, s é a camada oculta e t refere-se ao número de cálculos, V, W, U são os pesos e o estado da t-ésima camada oculta é mostrado na seguinte fórmula:
S t = f ( U ∗ X t + W ∗ S t − 1 ) (1) St = f(U*Xt + W*St-1) (1)St=f ( U∗Xt+C∗St−1 ) (1)
Pode-se ver que, se o estado atual da camada oculta estiver relacionado às n vezes anteriores por meio do modelo RNN, a quantidade de cálculo precisa ser aumentada e a complexidade aumenta exponencialmente. No entanto, esse problema pode ser resolvido usando a rede LSTM.
LSTM (Rede de Memória de Longo Prazo) LSTM (Rede de Memória de Longo Prazo):
LSTM é um tipo especial de RNN, que resolve principalmente o problema de desaparecimento e explosão de gradiente no processo de treinamento de sequência longa por Eileen. Comparado com o RNN, o LSTM pode ter um desempenho melhor em sequências longas.
-
Existem três estágios dentro do LSTM: estágio de esquecimento, estágio de seleção de memória, estágio de saída O LSTM tem três estágios: estágio de esquecimento, estágio de seleção de memória e estágio de saída.
-
**Estágio de esquecimento: **Uso de cálculo como um controle de portão para controlar o conteúdo que precisa ser esquecido no estado anterior.
-
**Estágio de memória de seleção: ** Selecione a memória para a entrada, o sinal de gating é controlado por , e o conteúdo de entrada é controlado por [Falha na transferência de imagem do link externo, o site de origem pode ter um mecanismo anti-leeching, é recomendado salve a imagem e carregue-a diretamente para representação.
-
**Estágio de saída:**Determine o conteúdo de saída do estado atual, através do controle, e também dimensione a saída obtida no estágio anterior.
-
Implementação do modelo de previsão 3LSTM para previsão de estoque
1. Preparação do conjunto de dados
1. Preparação do conjunto de dados
-
Divisão do conjunto de dados: O conjunto de dados é dividido em uma proporção de 0,1 para gerar um conjunto de teste. O processo de treinamento usa os dados dos dias T-99 a T como entrada de treinamento para prever o preço de abertura da ação no dia T+1.
-
Padronize os dados: Tanto o conjunto de treinamento quanto o conjunto de teste precisam ser divididos pelo intervalo por coluna. O processamento inverso é necessário para obter resultados após a conclusão do treinamento.
train ( [ : , i ] ) = ( train ( [ : , i ] ) ) − min ( train [ : , i ] ) / ( max ( train [ : , i ] ) − min ( train [ : , i ] ) ) ( 2 ) train([:,i])=(train([:,i]))-min(train[:,i])/(max(train[:,i])-min(train[: ,i])) (2)trem ( [ : _,eu ])=( trem ( [ : _,eu ]))−min ( trem [ : _ _,i ] ) / ( ma x ( trem [ : _,eu ])−min ( trem [ : _ _,i ])) (2 )
teste ( [ : , i ] ) = ( teste ( [ : , i ] ) ) − min ( trem [ : , i ] ) / ( max ( trem [ : , i ] ) − min ( trem [ : , i ] ) ) ( 3 ) test([:,i])=(test([:,i]))-min(train[:,i])/(max(train[:,i])-min(train[: ,i])) (3)teste ( [ : _,eu ])=( teste ( [ : _,eu ]))−min ( trem [ : _ _,i ] ) / ( ma x ( trem [ : _,eu ])−min ( trem [ : _ _,i ])) (3 )
2. Construção de modelo
2. Construção do modelo
Use a estrutura pytorch para criar o modelo LSTM e as configurações de parâmetro contidas em arch.nn.LSTM() :
-
A dimensão do recurso de entrada: input_size=dimension(dimension=8)
-
A dimensão da camada oculta no LSTM: hidden_size=128
-
O número de camadas da rede neural recorrente: num_layers=3
-
lote_primeiro: VERDADEIRO
-
Viés: o viés é usado por padrão
Configurações de parâmetro de camada totalmente conectada :
-
Primeira camada: in_features=128, out_features=16
-
Segunda camada: in_features=16, out_features=1 (mapeia para um valor)
3. Treinamento modelo
3. Treinamento modelo
-
Após a depuração, é determinado que a taxa de aprendizado lr=0,00001
-
Função de otimização: descida de gradiente em lote (SGD)
-
Tamanho do lote batch_size=4
-
Época de álgebra de treinamento = 100
-
Função de perda: MSELoss significa função de perda quadrada, o modelo de treinamento final reduz o MSELoss para cerca de 0,8.
4. Previsão do modelo
4. Previsão do modelo
O conjunto de teste é verificado usando o modelo treinado, e o erro percentual médio absoluto (MAPELoss) é de 0,04 em comparação com os dados reais, e a precisão do conjunto de teste pode ser obtida em 96%.
5. Resultados do modelo
5. Resultados do modelo
A figura abaixo mostra a exibição da linha K dos últimos 100 dias do conjunto de dados geral: se o preço de abertura do dia for menor que o preço de fechamento, será vermelho e se o preço de abertura do dia for maior que o preço de fechamento, será verde. A figura também mostra informações como o volume de negociação do dia e a média móvel.
O gráfico de comparação dos resultados do conjunto de teste previstos pelo modelo LSTM e os resultados reais mostram que os resultados previstos pelo modelo LSTM estão muito próximos da tendência real do estoque, por isso tem grande valor de referência.
Mudanças no MSELoss durante o treinamento do modelo LSTM. Pode-se ver que, à medida que o número de gerações de treinamento aumenta, o MSELoss desse modelo gradualmente tende a 0.
4. Conclusão
4. Conclusão
Este projeto aborda o problema de previsão do mercado de ações usando métodos de aprendizado de máquina. O projeto adota a Bolsa de Valores de Xangai nº 000001 do centro de dados de ações de código aberto, China Ping An Stock (nº SZ_000001) e usa LSTM (rede neural de memória de longo prazo) que é mais adequado para previsão de sequência de longo prazo para treinamento. Através do treinamento da sequência do conjunto de treinamento, o conjunto de teste Ao prever o preço de abertura, o modelo de previsão de ações LSTM com uma taxa de precisão de 96% foi finalmente obtido, o que resolveu o problema de previsão do mercado de ações com mais precisão.
Durante o processo de desenvolvimento do projeto, o modelo Transformer proposto mais recentemente que o LSTM também foi usado, mas o efeito de previsão no conjunto de teste não foi bom. Análises posteriores acreditam que isso pode ser devido ao codificador e à camada decodificadora correspondente no Transformer geral modelo, mas no modelo deste projeto, a camada totalmente conectada é usada em vez do decodificador, então o efeito não é bom. Em estudos subsequentes, pode ser melhorado e talvez resultados mais otimizados do que o LSTM possam ser obtidos.
Endereço de download: Código fonte de previsão de estoque geral + modelo + conjunto de dados com base na rede neural LSTM