<jupyter_start><jupyter_text><jupyter_code>!pip install yfinance

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
import yfinance as yf<jupyter_output>/usr/local/lib/python3.7/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.
  import pandas.util.testing as tm<jupyter_text>COLETA DE DADOS<jupyter_code>ticket = yf.Ticker('^BVSP')
df = ticket.history(interval='1d', start='2020-01-01', end='2022-01-01')

df
df.tail() #mostra as últimas linhas
df[['Close']].info()
df[['Close']].head() #mostra as primeiras linhas
df[['Close']].plot()<jupyter_output><empty_output><jupyter_text>DECOMPOSIÇÃO DE UMA SÉRIE TEMPORAL (modelo aditivo / modelo multiplicativo)<jupyter_code>decomposicao = seasonal_decompose(df[['Close']], model='additive', freq=30, extrapolate_trend=30)
decomposicao.plot()
decomposicao_multi = seasonal_decompose(df[['Close']], model='multiplicative', freq=30, extrapolate_trend=30)
decomposicao_multi.plot()
max(decomposicao.resid)<jupyter_output><empty_output><jupyter_text>No gráfico a seguir a linha azul é referente ao valor do ticker, enquanto a linha laranja é a linha de tendência<jupyter_code>ax, fig = plt.subplots(figsize=(15,8))
plt.plot(decomposicao.observed)
plt.plot(decomposicao.trend)
fig,(ax1,ax2,ax3,ax4) = plt.subplots(4,1, figsize=(12,8))
decomposicao.observed.plot(ax=ax1)
decomposicao.trend.plot(ax=ax2)
decomposicao.seasonal.plot(ax=ax3)
decomposicao.resid.plot(ax=ax4)
plt.tight_layout() #Serve para melhorar um pouco o layout de apresentação<jupyter_output><empty_output><jupyter_text>CALCULO DE MÉDIA MÓVEL<jupyter_code>df['Close'].rolling(7).mean() #o método rolling faz a média móvelna janela de tempo determinada
media_movel9d = df['Close'].rolling(9).mean()
media_movel20d = df['Close'].rolling(20).mean()
media_movel50d = df['Close'].rolling(50).mean()
fig, ax = plt.subplots(figsize=(12,5))
plt.plot(media_movel9d, 'orange')
plt.plot(media_movel20d, 'red')
plt.plot(media_movel50d, 'black')
plt.plot(df['Close'])<jupyter_output><empty_output><jupyter_text>EXTRAÇÃO DE FEATURES<jupyter_code>df.head()
df.reset_index(inplace=True)
df.head()
# Criar features para cada período
df['year'] = df['Date'].dt.year
df['month'] = df['Date'].dt.month
df['day'] = df['Date'].dt.day
df.head()
# Rentabilidade é preçoatual/preço anterior * 100 - 100
df[['Close']]
df.head()
df['Close'].shift()
df['Rentabilidade'] = df['Close'] / df['Close'].shift() * 100 - 100
df.head()
def features_extraction(df_):
  # Criar features para cada período
  df_['year'] = df_['Date'].dt.year
  df_['month'] = df_['Date'].dt.month
  df_['day'] = df_['Date'].dt.day
  df_['Rentabilidade'] = df_['Close'] / df_['Close'].shift() *100 - 100
df.reset_index(inplace=True)
features_extraction(df)
df.head()<jupyter_output><empty_output><jupyter_text>**Hipotese 1 - Existe um melhor mês para investir no ativo?**Considerando o período de dados de rentabilidade, o agrupamento mostra que os meses de fevereiro, março e setembro são mais interessantes para investir. *N~ao esquecer que esses dados possuem ruído e o gráfico a baixo deve ser considerado apenas para fins de aprendizado.<jupyter_code>df.groupby('month').agg({'Rentabilidade':'sum'}).plot(kind='bar') #.agg para agregar os dados
df.set_index('Date', inplace=True)
media_movel30d = df['Close'].rolling(30).mean()
media_movel90d = df['Close'].rolling(90).mean()
fig, ax = plt.subplots(figsize=(8,4))
plt.plot(df['Close'])
plt.plot(media_movel30d)
plt.plot(media_movel90d)<jupyter_output><empty_output><jupyter_text>**Hipotese 2 - Existe um melhor dia para investir um ativo?** seguindo essa análise os melhores dias seriam 12,16 e 26.<jupyter_code>df.groupby('day').agg({'Rentabilidade':'sum'}).plot(kind='bar')
df.iloc[0]
df.iloc[-1]
df['Close'].iloc[-1] / df['Close'].iloc[0] * 100 - 100
df['Rentabilidade'].sum()<jupyter_output><empty_output><jupyter_text>**Correlação de séries temporais**Analise<jupyter_code>tickets = ['VALE3.SA', 'ITUB4.SA', 'PETR4.SA', 'ABEV3.SA', 'BBDC4.SA', 'BBAS3.SA', '^BVSP', 'USDBRL=X']
dfs = []

for t in tickets:
  print('Reading ticker {}...'.format(t))
  ticket = yf.Ticker(t)
  aux = ticket.history(interval='1d', start='2018-01-01', end='2022-01-01')
  aux.reset_index(inplace=True)
  aux['ticket'] = t
  dfs.append(aux)
dfs[1]
for d in dfs:
  features_extraction(d)
dfs[0]
correlacao = pd.DataFrame()
for d in dfs:
  correlacao[d['ticket'].iloc[0]] = d['Rentabilidade']
correlacao.head()
correlacao.corr() #.corr utiliza por padrão o método Pearson de correlação<jupyter_output><empty_output><jupyter_text>**Visualização de dados usando Seaborn**<jupyter_code>!pip install seaborn
import seaborn as sns
ax, fig = plt.subplots(figsize=(20,5))
ax = sns.heatmap(correlacao.corr(), annot=True)<jupyter_output><empty_output><jupyter_text>**Visualização de dados usando Plotly**<jupyter_code>!pip install plotly
import plotly.graph_objs as go
def plot_lines(df_,columns=['Open','Close','High','Low']):

  fig = go.Figure()
  for c in columns:
    fig.add_trace(go.Scatter(x = list(df_.index), #Scatter é um gráfico de ponto
                             y = df_[c],
                             mode = 'markers+lines',
                             name = c))
    return fig
plot_lines(df)
def plotCandleStick(df, acao='ticket'):
  trace1 = {
      'x': df.index,
      'open': df.Open,
      'close': df.Close,
      'high': df.High,
      'low': df.Low,
      'type': 'candlestick',
      'name': acao,
      'showlegend': False
  }

  data = [trace1]
  layout = go.Layout()

  fig = go.Figure(data=data, layout=layout)
  return fig
plotCandleStick(df)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1594782608695652, 'fraction_numerical': 0.025217391304347827, 'mean_word_length': 5.830166270783848, 'pattern_counts': {'":': 0, '<': 44, '<?xml version=': 0, '>': 44, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '42967', 'license': 'MIT', 'n_tokens_mistral': 2375, 'n_tokens_neox': 2246, 'n_words': 431, 'path': 'Stock_analysis.ipynb', 'repo_name': 'DheniMoura/stock-analysis', 'size': '5750'}