Home › Fóruns › Fórum Python para Finanças: Análise de Dados e Machine Learning › Não estou conseguindo fazer a previsão pra trás!
- Este tópico contém 8 respostas, 2 vozes e foi atualizado pela última vez 7 meses atrás por Denny Ceccon.
- AutorPosts
- 26 de julho de 2022 às 23:13 #36003
Oi, pessoal!!
Eu estou tentando coletar série de cotações do dólar pela API do banco central, mas não estou conseguindo fazer as previsões.
Seguinte, eu quero baixar as cotações e fazer a previsão para os últimos 100 dias, como a previsão do passado no curso, eu tentei fazer de uma forma que sempre que eu executasse fosse feito sobre os últimos 100 dias, caso um dado seja adicionado ao banco de dados ele já entre automático na nova execução.
Na segunda parte, na projeção real futura, eu queria colocar a projeção real junto ao gráfico de cotações, deletei as datas pra poder juntar as duas series, mas a projeção não ficou incluída no final da serie.
< !pip install pmdarima pip install python-bcb import pandas as pd import numpy as np import matplotlib.pyplot as fig import plotly.express as px import datetime from statsmodels.tsa.seasonal import seasonal_decompose from pmdarima.arima import auto_arima from bcb import sgs dolar = sgs.get('1', start = '2000-01-01') serie_temporal = dolar['1'] print('-------------- Informações --------------') print('Total de dias com cotações = ',len(serie_temporal)) fig.plot(serie_temporal, label = 'Histórico da cotação do Dólar') fig.legend(); decomposicao = seasonal_decompose(serie_temporal, period = len(serie_temporal)//2) tendencia = decomposicao.trend sazonal = decomposicao.seasonal aleatorio = decomposicao.resid fig.plot(tendencia, label = 'Tendência') fig.legend(); fig.plot(sazonal, label = 'Sazonalidade') fig.legend(); fig.plot(aleatorio, label = 'Residuo') fig.legend(); # Teste: Projeção do Dólar a 100 dias atrás treinamento = serie_temporal[:-100] print('Treinamento: Total de dias ',len(treinamento)) teste = serie_temporal[-100:] print('Teste: Total de dias ',len(teste)) modelo_teste = auto_arima(treinamento, suppress_warning = True, error_action = 'ignore') previsoes = pd.DataFrame(modelo_teste.predict(n_periods = 100),index = teste.index) previsoes.columns = ['Previsões'] print('Parâmetros ARIMA - P, Q e D = ',modelo_teste.order) fig.figure(figsize=(8,5)) fig.plot(treinamento[-500:], label = 'Treinamento') fig.plot(teste, label = 'Teste') fig.plot(previsoes , label = 'Previsões') fig.legend(); # Projeção: Dólar para os próximos 100 dias """ modelo = auto_arima(serie_temporal, suppress_warning = True, error_action = 'ignore') previsoes = pd.DataFrame(modelo.predict(n_periods = 100)) previsoes.columns = ['Previsões'] print('Parâmetros ARIMA - P, Q e D = ',modelo.order) fig.figure(figsize=(8,5)) fig.plot(previsoes , label = 'Previsões') fig.legend();""">
Valeu pela ajuda, sucesso sempre!
- Este tópico foi modificado 2 anos, 4 meses atrás por Gustavo Rosso de Souza.
29 de julho de 2022 às 16:40 #36132Oi Gustavo,
Tente colocar as datas como índice no dataframe com as previsões:
index=pd.date_range( serie_temporal.index[-1] # pega a última data disponível em serie_temporal + pd.Timedelta('1D'), # adiciona 1 dia porque estamos fazendo a previsão a partir do dia seguinte periods=100) # faz o intervalo de datas até 100 dias no futuro ) previsoes = pd.DataFrame(modelo.predict(n_periods = 100), index=index)
Aí é só plotar os dois dataframes no mesmo gráfico:
fig.plot(serie_temporal, label='Dados históricos') fig.plot(previsoes , label = 'Previsões')
- Esta resposta foi modificada 2 anos, 4 meses atrás por Denny Ceccon.
15 de agosto de 2022 às 23:14 #36367Dae Denny,
O que você disse funcionou, porem ações são negociadas apenas em dias úteis, e a s projeções foram colocadas em dias corridos tipo sábado e domingo que a bolsa de valores não negocia. Mas, sem problemas, deu certo!!
Só que eu estou com outro problema que havia esquecido de falar antes, minhas projeções ficam linhas retas……
https://colab.research.google.com/drive/1SwfSgExprlMdfGzkVjUmeGe-Iz2CoVwC?usp=sharing (Comentário habilitado)
Se você ver o dataframe vai ver que a primeira projeção (dia) é diferente e as outras são iguais, se eu projetar 100 dias, a partir do 2º em diante fica o mesmo valor….
16 de agosto de 2022 às 10:23 #36368Olá Gustavo,
A principal razão é porque o
auto_arima
não foi capaz de encontrar padrões e tendências que ele considera útil para as predições, então ele retorna sempre a última cotação. Dê uma olhada aqui: https://stats.stackexchange.com/a/529835Você deve conseguir resultados mais interessantes testando outros parâmetros na implementação do
auto_arima
, visite a documentação da biblioteca.22 de agosto de 2022 às 12:33 #36237As datas funcionou, mas quando se trata das ações tem o problema dos finais de semana e feriados, mas tranquilo.
Eu estou tendo outro problema, tentei varias vezes, as previsões sempre ficam uma linha reta, e não é por causa da data, na previsão a partir da 2 previsão fica tudo igual, veja:
22 de agosto de 2022 às 12:34 #36403Funcionou colocar as datas, só que como as ações só negociam dias úteis, as projeções de preços foram colocadas em dias de fins de semana. Mas, sem problemas. Valeu!
Outro problema que não estou conseguindo resolver como você pode ver na imagem é que as projeções não dão certo, fica tudo uma linha reta….
22 de agosto de 2022 às 12:34 #36398Funcionou colocar as datas, só que como as ações só negociam dias úteis, as projeções de preços foram colocadas em dias de fins de semana. Mas, sem problemas. Valeu!
Outro problema que não estou conseguindo resolver como você pode ver na imagem é que as projeções não dão certo, fica tudo uma linha reta….
22 de agosto de 2022 às 12:34 #36402Funcionou colocar as datas, só que como as ações só negociam dias úteis, as projeções de preços foram colocadas em dias de fins de semana. Mas, sem problemas. Valeu!
Outro problema que não estou conseguindo resolver como você pode ver na imagem é que as projeções não dão certo, fica tudo uma linha reta….
8 de maio de 2024 às 09:51 #44727O que eu acho mais provável é o que eu disse na última mensagem: A principal razão é porque o modelo não foi capaz de encontrar padrões e tendências que ele considera útil para as predições, então ele retorna sempre a última cotação. Dê uma olhada aqui: https://stats.stackexchange.com/a/529835
- AutorPosts
- Você deve fazer login para responder a este tópico.