<jupyter_start><jupyter_text>Séries temporais em bases financeiras - ARIMA Não adequado para ações, pois não tem padrões temporais cíclicos bem definidos, sendo influenciado por muitos fatores externos.  Instalação e importação das bibliotecas<jupyter_code>!pip install pmdarima
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.express as px
import datetime
from statsmodels.tsa.seasonal import seasonal_decompose
from pmdarima.arima import auto_arima
import pandas as pd
from pandas_datareader import data

acoes = ['GOLL4.SA', 'CVCB3.SA', 'WEGE3.SA', 'MGLU3.SA', 'TOTS3.SA', 'BOVA11.SA']
acoes_df = pd.DataFrame()
for acao in acoes:
  acoes_df[acao] = data.DataReader(acao, data_source='yahoo', start='2015-01-01')['Close']

acoes_df = acoes_df.rename(columns={'GOLL4.SA': 'GOL', 'CVCB3.SA': 'CVC', 'WEGE3.SA': 'WEGE',
                                    'MGLU3.SA': 'MGLU', 'TOTS3.SA': 'TOTS', 'BOVA11.SA': 'BOVA'})

acoes_df.dropna(inplace=True)
acoes_df.to_csv('acoes.csv')

days_bolsa = 246
acoes_ex = ['ABEV3.SA', 'ODPV3.SA', 'VIVT3.SA', 'PETR3.SA', 'BBAS3.SA', 'BOVA11.SA']
acoes_ex_df = pd.DataFrame()
for acao in acoes_ex:
  acoes_ex_df[acao] = data.DataReader(acao, data_source='yahoo', start='2015-01-01')['Close']
acoes_ex_df.dropna(inplace=True)
acoes_ex_df = acoes_ex_df.rename(columns={
    'ABEV3.SA': 'AMBEV', 'ODPV3.SA': 'ODONTOPREV', 'VIVT3.SA': 'VIVO',
    'PETR3.SA': 'PETROBRAS', 'BBAS3.SA': 'BBRASIL', 'BOVA11.SA': 'BOVA'})
acoes_ex_df.to_csv('acoes_ex.csv')<jupyter_output><empty_output><jupyter_text>Carregamento da base de dados<jupyter_code>dateparse = lambda dates: datetime.datetime.strptime(dates, '%Y-%m-%d')
dataset = pd.read_csv('acoes.csv', parse_dates=['Date'], index_col='Date',
                      date_parser = dateparse, usecols = ['Date', 'BOVA'])

dataset2 = pd.read_csv('acoes.csv')
dataset2['Date'] = pd.to_datetime(dataset2['Date'])
dataset2.set_index('Date', inplace=True)
dataset2 = dataset2[['BOVA']]
assert dataset.equals(dataset2)
dataset
time_series = dataset['BOVA']
time_series<jupyter_output><empty_output><jupyter_text>Exploração da série temporal<jupyter_code>time_series[1]
time_series['2015-01-08']
time_series['2015-01-01':'2015-01-10']
time_series[:'2015-07-31']
time_series['2015']
time_series.index.max().strftime("%d/%m/%Y")
time_series.index.min()
plt.plot(time_series);
figura = px.line(title='Histórico do preço das ações')
figura.add_scatter(x=time_series.index, y=time_series)
plt.plot(time_series['2015']);<jupyter_output><empty_output><jupyter_text>Decomposição da série temporal<jupyter_code>type(time_series)
len(time_series) / 2
decomposicao = seasonal_decompose(
    time_series,
    # period=len(time_series) // 2
    period=days_bolsa
    )
tendencia = decomposicao.trend
sazonal = decomposicao.seasonal
aleatorio = decomposicao.resid
plt.plot(tendencia);
plt.plot(sazonal);
plt.plot(aleatorio);<jupyter_output><empty_output><jupyter_text>Previsões com ARIMA<jupyter_code>%%time
modelo = auto_arima(time_series, suppress_warnings=True, error_action='ignore')
# Parâmetros P, Q e D
modelo.order
previsoes = modelo.predict(n_periods=90)
previsoes<jupyter_output><empty_output><jupyter_text>Gráfico das previsões<jupyter_code>len(time_series)
treinamento = time_series[:1081]
treinamento.shape
treinamento.index.min(), treinamento.index.max()
teste = time_series[1081:]
teste.shape
teste.index.min(), teste.index.max()
%%time
modelo2 = auto_arima(treinamento, suppress_warnings=True, error_action='ignore')
teste.index
previsoes = pd.DataFrame(
    modelo2.predict(n_periods=len(teste)),
    index=teste.index,
    columns=['previsoes']
    )
previsoes
teste
plt.figure(figsize=(8,5))
plt.plot(treinamento, label='Treinamento')
plt.plot(teste, label='Teste')
plt.plot(previsoes, label='Previsões')
plt.legend();<jupyter_output><empty_output><jupyter_text>Avaliação do ARIMA<jupyter_code>from sklearn.metrics import mean_absolute_error
assert np.allclose(mean_absolute_error(teste, previsoes),
        sum(abs(teste - previsoes['previsoes']) / len(teste)))
mean_absolute_error(teste, previsoes)<jupyter_output><empty_output><jupyter_text>Séries temporais em bases financeiras - Facebook Prophet  Instalação e importação das bibliotecas<jupyter_code>!pip install fbprophet
from fbprophet import Prophet
import pandas as pd<jupyter_output><empty_output><jupyter_text>Carregamento da base de dados<jupyter_code>dataset = pd.read_csv('acoes.csv', usecols=['Date', 'BOVA'])
dataset
dataset = dataset[['Date', 'BOVA']].rename(columns = {'Date': 'ds', 'BOVA': 'y'})
dataset<jupyter_output><empty_output><jupyter_text>Construção do modelo e previsões<jupyter_code>%%time
modelo = Prophet()
modelo.fit(dataset)
%%time
futuro = modelo.make_future_dataframe(periods=90)
previsoes = modelo.predict(futuro)
previsoes.head()
len(dataset), len(previsoes)
len(previsoes) - len(dataset)
previsoes.tail(90)<jupyter_output><empty_output><jupyter_text>Gráfico das previsões<jupyter_code>modelo.plot(previsoes, xlabel='Data', ylabel='Preço');
modelo.plot_components(previsoes);
from fbprophet.plot import plot_plotly, plot_components_plotly
plot_plotly(modelo, previsoes)
plot_components_plotly(modelo, previsoes)<jupyter_output><empty_output><jupyter_text>Avaliação<jupyter_code>teste.shape
teste.tail()
pred = modelo.make_future_dataframe(periods=0)  # ateh dia atual
previsoes = modelo.predict(pred)
previsoes.shape
previsoes.tail()
previsoes = previsoes['yhat'].tail(len(teste))
previsoes
mean_absolute_error(teste, previsoes)<jupyter_output><empty_output><jupyter_text>Exercício<jupyter_code>dataset = pd.read_csv('acoes_ex.csv', usecols = ['Date', 'AMBEV'])
dataset = dataset[['Date', 'AMBEV']].rename(columns = {'Date': 'ds', 'AMBEV': 'y'})
dataset
%%time
from fbprophet import Prophet
model = Prophet()
model.fit(dataset)
teste = dataset[1081:]
teste.shape
pred = model.make_future_dataframe(periods=0)
previsoes = model.predict(pred)
previsoes = previsoes['yhat'].tail(len(teste))
previsoes
teste['y']
mean_absolute_error(teste['y'], previsoes)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14423548650858545, 'fraction_numerical': 0.019787408013082583, 'mean_word_length': 7.276048714479026, 'pattern_counts': {'":': 0, '<': 53, '<?xml version=': 0, '>': 53, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '13', 'dir': 'jupyter-structured-clean-dedup', 'id': '34746', 'license': 'MIT', 'n_tokens_mistral': 2502, 'n_tokens_neox': 2403, 'n_words': 380, 'path': 'Python_para_finanças_séries_temporais.ipynb', 'repo_name': 'viniciusriosfuck/python-financas', 'size': '6115'}