Spaces:
Sleeping
Sleeping
import matplotlib | |
matplotlib.use('Agg') | |
#from turtle import width | |
import streamlit as st | |
from yahooquery import Ticker | |
import pandas as pd | |
import yfinance as yf | |
# from fbprophet import Prophet | |
import numpy as np | |
import plotly.graph_objects as go | |
import scrap as scraping | |
import style as style | |
import html01 as html01 | |
def analise_tecnica_fundamentalista(): | |
#código para ativar bootstrap css | |
st.markdown( | |
""" | |
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> | |
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> | |
""",unsafe_allow_html=True | |
) | |
col1, col2,col3 = st.columns([0.1,0.4,0.1]) | |
with col2: | |
st.title('Análise Técnica') | |
st.subheader('Escolha o ativo que deseja analisar e pressione enter') | |
#nome_do_ativo = st.text_input('Nome do ativo ex: PETR4, VALE3, WEGE3...') | |
codigo_nome = pd.read_excel('data/classification_b3.xlsx') | |
nome_do_ativo = st.selectbox('Esoolha a ação que deseja analisar', (codigo_nome['Código']) ) | |
style.space(1) | |
if nome_do_ativo != "": | |
nome_do_ativo = str(nome_do_ativo + '.SA').upper() | |
df = Ticker(nome_do_ativo,country='Brazil') | |
time = df.history( period='max') | |
# ------------------------------ RESUMO ---------------------------- | |
resumo = pd.DataFrame(df.summary_detail) | |
resumo = resumo.transpose() | |
if len(nome_do_ativo) == 8: | |
fundamentus = scraping.get_specific_data(nome_do_ativo[:5]) | |
fundamentus = pd.DataFrame([fundamentus]) | |
try: | |
pfizer = yf.Ticker(nome_do_ativo) | |
info = pfizer.info | |
if info['recommendationKey'] == 'buy': | |
recomendation = 'alta' | |
else: | |
recomendation = 'baixa' | |
#KPIS | |
metric1, metric2, metric3, metric4 = st.columns([1,1,1,1]) | |
with metric1: | |
st.metric(label="P/L",value=f"{fundamentus['P/L'][0]}") | |
with metric2: | |
st.metric(label="P/VP",value=f"{fundamentus['P/VP'][0]}") | |
with metric3: | |
st.metric(label="Tendência", value=f"{recomendation}") | |
with metric4: | |
st.metric(label="Próximo dividendo", value=f"{pfizer.calendar.transpose()['Earnings Date'].dt.strftime('%d/%m/%Y')[0]}") | |
style.space(2) | |
#card info | |
html01.card_info(info['longName'], info['sector'], info['industry'], info['longBusinessSummary'], info['website']) | |
style.space(2) | |
except: | |
exit | |
else: | |
st.write('---------------------------------------------------------------------') | |
st.dataframe(resumo) | |
pfizer = yf.Ticker(nome_do_ativo) | |
info = pfizer.info | |
st.title('Company Profile') | |
st.subheader(info['longName']) | |
try: | |
st.markdown('** Sector **: ' + info['sector']) | |
st.markdown('** Industry **: ' + info['industry']) | |
st.markdown('** Website **: ' + info['website']) | |
except: | |
exit | |
# ------------------------------ GRÁFICOS DE RENDIMENTO ---------------------------- | |
if len(nome_do_ativo) == 8: | |
import datetime | |
fundamentalist = df.income_statement() | |
fundamentalist['data'] = fundamentalist['asOfDate'].dt.strftime('%d/%m/%Y') | |
fundamentalist = fundamentalist.drop_duplicates('asOfDate') | |
fundamentalist = fundamentalist.loc[fundamentalist['periodType'] == '12M'] | |
#volatilidade | |
TRADING_DAYS = 360 | |
returns = np.log(time['close']/time['close'].shift(1)) | |
returns.fillna(0, inplace=True) | |
volatility = returns.rolling(window=TRADING_DAYS).std()*np.sqrt(TRADING_DAYS) | |
vol = pd.DataFrame(volatility.iloc[-360:]).reset_index() | |
#sharpe ratio | |
sharpe_ratio = returns.mean()/volatility | |
sharpe = pd.DataFrame(sharpe_ratio.iloc[-360:]).reset_index() | |
div = time.reset_index() | |
div['year'] = pd.to_datetime(div['date']).dt.strftime('%Y') | |
div_group = div.groupby('year').agg({'close':'mean','dividends':'sum'}) | |
div_group['dividendo(%)'] = round((div_group['dividends'] * 100 ) / div_group['close'],4) | |
from plotly.subplots import make_subplots | |
fig = make_subplots( | |
rows=3, cols=2, | |
specs=[[{"type": "bar"}, {"type": "bar"}], | |
[{"type": "bar"}, {"type": "bar"}], | |
[{"type": "scatter"}, {"type": "scatter"}]], | |
subplot_titles=("Receita Total","Lucro",'Dividendos (%)','Dividendos unitário R$','Volatilidade', 'Sharpe ratio (Retorno/ Risco)') | |
) | |
fig.add_trace(go.Bar(x =pfizer.financials.transpose().index, y=pfizer.financials.transpose()['Total Revenue']), row=1, col=1) | |
fig.add_trace(go.Bar(x =pfizer.financials.transpose().index, y=pfizer.financials.transpose()['Net Income From Continuing Ops']), row=1, col=2) | |
fig.add_trace(go.Bar(x =div_group.reset_index().tail(5)['year'], y=div_group.reset_index().tail(5)['dividendo(%)']),row=2, col=1) | |
fig.add_trace(go.Bar(x =div_group.reset_index().tail(5)['year'], y=div_group.reset_index().tail(5)['dividends']),row=2, col=2) | |
fig.add_trace(go.Scatter(x =vol['date'], y=vol['close']),row=3, col=1) | |
fig.add_trace(go.Scatter(x =sharpe['date'], y=sharpe['close']),row=3, col=2) | |
fig.update_layout( height=800, width=800 ,showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') | |
fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') | |
col1, col2, col3 = st.columns([1,8,1]) | |
#with col2: | |
st.plotly_chart(fig,use_container_width=True) | |
else: | |
#volatilidade | |
TRADING_DAYS = 160 | |
returns = np.log(time['close']/time['close'].shift(1)) | |
returns.fillna(0, inplace=True) | |
volatility = returns.rolling(window=TRADING_DAYS).std()*np.sqrt(TRADING_DAYS) | |
vol = pd.DataFrame(volatility.iloc[-160:]).reset_index() | |
#sharpe ratio | |
sharpe_ratio = returns.mean()/volatility | |
sharpe = pd.DataFrame(sharpe_ratio.iloc[-160:]).reset_index() | |
from plotly.subplots import make_subplots | |
fig = make_subplots( | |
rows=1, cols=2, | |
specs=[[{"type": "scatter"}, {"type": "scatter"}]], | |
subplot_titles=('Volatilidade', 'Sharpe ratio (Retorno/ Risco)') | |
) | |
fig.add_trace(go.Scatter(x =vol['date'], y=vol['close']),row=1, col=1) | |
fig.add_trace(go.Scatter(x =sharpe['date'], y=sharpe['close']),row=1, col=2) | |
fig.update_layout( height=800, width=800 ,showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') | |
fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') | |
col1, col2, col3 = st.columns([1,8,1]) | |
#with col2: | |
st.plotly_chart(fig,use_container_width=True) | |
# ------------------------------ GRÁFICOS DE Candlestick---------------------------- | |
with st.expander("Entenda o gráfico de Candlestick, clique para saber mais"): | |
st.write("""Gráfico de Candlestick , O formato contém os valores dos preços que a ação atingiu durante o período de tempo que está sendo analisado. São os preços de:""") | |
st.write('Abertura: preço pelo qual foi fechado o primeiro negócio do período') | |
st.write('Fechamento: preço pelo qual foi fechado o último negócio do período') | |
st.write('Máximo: maior preço negociado no período') | |
st.write('Mínimo: menor preço negociado no período') | |
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, | |
vertical_spacing=0.03, subplot_titles=('Candlestick', 'Volume'), | |
row_width=[0.2, 0.7]) | |
# Plot OHLC on 1st row | |
fig.add_trace(go.Candlestick(x=time.reset_index()['date'][-90:], | |
open=time['open'][-90:], high=time['high'][-90:], | |
low=time['low'][-90:], close=time['close'][-90:], name="OHLC"), | |
row=1, col=1) | |
# Bar trace for volumes on 2nd row without legend | |
fig.add_trace(go.Bar(x=time.reset_index()['date'][-90:], y=time['volume'][-90:], showlegend=False), row=2, col=1) | |
# Do not show OHLC's rangeslider plot | |
fig.update(layout_xaxis_rangeslider_visible=False) | |
fig.update_layout( height=600, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') #width=800 , | |
fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') | |
st.plotly_chart(fig,use_container_width=True) | |
# ------------------------------ GRÁFICOS DE Retorno acumulado---------------------------- | |
with st.expander("Entenda o gráfico de Retorno acumulado, clique para saber mais"): | |
st.write("""Gráfico de Retorno acumulado, Acúmulo de retorno calculado desde a data de início escolhida até o dia de hoje.""") | |
layout = go.Layout(title="Retorno acumulado",xaxis=dict(title="Data"), yaxis=dict(title="Retorno")) | |
fig = go.Figure(layout = layout) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-365:], y=time.reset_index()['close'][-365:].pct_change().cumsum(), mode='lines', line_width=3,line_color='rgb(0,0,0)')) | |
fig.update_layout( height=600, width=800 ,showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') | |
fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') | |
st.plotly_chart(fig,use_container_width=True) | |
# ------------------------------ GRÁFICOS DE Médias móveis---------------------------- | |
with st.expander("Entenda o gráfico de Médias móveis, clique para saber mais"): | |
st.write("""Gráfico de Médias móveis, Cada ponto no gráfico representa a média dos últimos x dias, exemplo MM20 = média móvel dos última 20 dias.""") | |
st.write("""Com ela, é possível identificar o equilíbrio dos preços no mercado, observando tendências de alta, neutra ou baixa. A representação gráfica das Médias Móveis é normalmente feita por uma linha, que se movimenta conforme os dados novos recebidos para o cálculo.""") | |
rolling_200 = time['close'].rolling(window=200) | |
rolling_mean_200 = rolling_200.mean() | |
rolling_50 = time['close'].rolling(window=72) | |
rolling_mean_50 = rolling_50.mean() | |
rolling_20 = time['close'].rolling(window=20) | |
rolling_mean_20 = rolling_20.mean() | |
rolling_10 = time['close'].rolling(window=9) | |
rolling_mean_10 = rolling_10.mean() | |
layout = go.Layout(title="Médias móveis - ative ou desative clicando na legenda da média",xaxis=dict(title="Data"), yaxis=dict(title="Preço R$")) | |
fig = go.Figure(layout = layout) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-120:], y=time["close"][-120:], mode='lines', line_width=3,name='Real',line_color='rgb(0,0,0)')) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-120:], y=rolling_mean_200[-120:],mode='lines',name='MM(200)',opacity = 0.6)) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-120:], y=rolling_mean_50[-120:],mode='lines',name='MM(72)',opacity = 0.6)) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-120:], y=rolling_mean_20[-120:],mode='lines',name='MM(20)',opacity = 0.6)) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-120:], y=rolling_mean_10[-120:],mode='lines',name='MM(9)',opacity = 0.6,line_color='rgb(100,149,237)')) | |
fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') | |
fig.update_layout(autosize=True, height=600, width=800 ,showlegend=True, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') | |
st.plotly_chart(fig,use_container_width=True) | |
# ------------------------------ GRÁFICOS DE Retração de Fibonacci---------------------------- | |
with st.expander("Entenda o gráfico de Retração de Fibonacci, clique para saber mais"): | |
st.write("""Gráfico de Retração de Fibonacci, A retração de Fibonacci é composta por linhas horizontais que cortam a série de preços. A distância entre essas linhas varia obedecendo a chamada série numérica de Fibonacci. Na análise técnica esses valores são expressos em porcentagem e são: 100%, 61,8%, 38,2%, 23,6%, 0%.""") | |
st.write("""Muito utilizado para tentar identificar uma tendência de alta ou de baixa. Uma das técnicas é analisar se a ação caiu até a linha de 38,2% (verde) para voltar a subir (retração com tendência de alta) ou se caiu passando os 38,2% pode representar uma tendência de baixa ou alta com pouca força.""") | |
st.write('Tente sempre escolher a quantidade de dias analisados para começar a análise após o maior fundo de baixa histórico') | |
time_fibo = time.copy() | |
periodo_fibonacci = int(st.number_input(label='periodo fibonacci - traçada do menor valor encontrado no período de tempo setado abaixo até o maior valor encontrado para frente',value= 45 )) | |
Price_Min =time_fibo[-periodo_fibonacci:]['low'].min() | |
Price_Max =time_fibo[-periodo_fibonacci:]['high'].max() | |
Diff = Price_Max-Price_Min | |
level1 = Price_Max - 0.236 * Diff | |
level2 = Price_Max - 0.382 * Diff | |
level3 = Price_Max - 0.618 * Diff | |
# st.write ('0% >>' f'{round(Price_Max,2)}') | |
# st.write ('23,6% >>' f'{round(level1,2)}') | |
# st.write ('38,2% >>' f'{round(level2,2)}') | |
# st.write ('61,8% >>' f'{round(level3,2)}') | |
# st.write ('100% >>' f'{round(Price_Min,2)}') | |
time_fibo['Price_Min'] = Price_Min | |
time_fibo['level1'] = level1 | |
time_fibo['level2'] = level2 | |
time_fibo['level3'] = level3 | |
time_fibo['Price_Max'] = Price_Max | |
layout = go.Layout(title=f'Retração de Fibonacci',xaxis=dict(title="Data"), yaxis=dict(title="Preço")) | |
fig = go.Figure(layout = layout) | |
fig.add_trace(go.Scatter(x=time_fibo[-periodo_fibonacci:].reset_index()['date'], y=time_fibo[-periodo_fibonacci:].close, mode='lines', line_width=3,name='Preço real',line_color='rgb(0,0,0)')) | |
fig.add_trace(go.Scatter(x=time_fibo[-periodo_fibonacci:].reset_index()['date'], y=time_fibo[-periodo_fibonacci:].Price_Min, mode='lines', line_width=0.5,name='100%',line_color='rgb(255,0,0)',)) | |
fig.add_trace(go.Scatter(x=time_fibo[-periodo_fibonacci:].reset_index()['date'], y=time_fibo[-periodo_fibonacci:].level3, mode='lines', line_width=0.5,name='61,8%',line_color='rgb(255,255,0)',fill= 'tonexty', fillcolor ="rgba(255, 0, 0, 0.2)")) | |
fig.add_trace(go.Scatter(x=time_fibo[-periodo_fibonacci:].reset_index()['date'], y=time_fibo[-periodo_fibonacci:].level2, mode='lines', line_width=0.5,name='38,2%',line_color='rgb(0,128,0)',fill= 'tonexty', fillcolor ="rgba(255, 255, 0, 0.2)")) | |
fig.add_trace(go.Scatter(x=time_fibo[-periodo_fibonacci:].reset_index()['date'], y=time_fibo[-periodo_fibonacci:].level1, mode='lines', line_width=0.5,name='23,6%',line_color='rgb(128,128,128)',fill= 'tonexty', fillcolor ="rgba(0, 128, 0, 0.2)")) | |
fig.add_trace(go.Scatter(x=time_fibo[-periodo_fibonacci:].reset_index()['date'], y=time_fibo[-periodo_fibonacci:].Price_Max, mode='lines', line_width=0.5,name='0%',line_color='rgb(0,0,255)',fill= 'tonexty', fillcolor ="rgba(128, 128, 128, 0.2)")) | |
fig.update_layout( height=600, width=800 ,showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') | |
fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') | |
st.plotly_chart(fig,use_container_width=True) | |
# ------------------------------ GRÁFICOS DE RSI---------------------------- | |
try: | |
delta = time['close'][-periodo_RSI:].diff() | |
up, down = delta.copy(), delta.copy() | |
up[up < 0] = 0 | |
down[down > 0] = 0 | |
period = 14 | |
rUp = up.ewm(com=period - 1, adjust=False).mean() | |
rDown = down.ewm(com=period - 1, adjust=False).mean().abs() | |
time['RSI_' + str(period)] = 100 - 100 / (1 + rUp / rDown) | |
time['RSI_' + str(period)].fillna(0, inplace=True) | |
layout = go.Layout(title=f'RSI {periodo_RSI}',xaxis=dict(title="Data"), yaxis=dict(title="%RSI")) | |
fig = go.Figure(layout = layout) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-periodo_RSI:], y=round(time['RSI_14'][-periodo_RSI:],2), mode='lines', line_width=3,name=f'RSI {periodo_RSI}',line_color='rgb(0,0,0)')) | |
fig.update_layout( height=600, width=800 ,showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') | |
fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') | |
periodo_RSI = int(st.number_input(label='periodo RSI',value=90)) | |
with st.expander("Entenda o gráfico de Índice de Força Relativa (RSI), clique para saber mais"): | |
st.write("""Gráfico de Índice de Força Relativa (RSI), é um indicador versátil que mede a velocidade e a mudança do movimento dos preços. O RSI pode ser usado para: Determine quando um instrumento está sobrecomprado ou sobrevendido.""") | |
st.write('Comprar ativos que apresentem um baixo valor de RSI pode ser um bom indicador de desconto!') | |
st.plotly_chart(fig,use_container_width=True) | |
except: | |
exit | |
# ------------------------------ GRÁFICOS DE pivôs---------------------------- | |
with st.expander("Entenda o gráfico de pivôs, clique para saber mais"): | |
st.write("""O Pivot Point pode ser utilizado para calcular as possíveis zonas de suporte e resistência do ativo para o período desejado, o que ajuda a entender a pressão compradora (suporte) e a pressão vendedora (resistência).""") | |
st.write(' Os pontos do pivô podem ser utilizados como valores de stop-loss (preço de saída com perda) ou stop-gain (preço de saída com lucro) por exemplo.') | |
periodo_pivo = int(st.number_input(label='periodo pivô',value=20)) | |
time['PP'] = pd.Series((time['high'] + time['low'] + time['close']) /3) | |
time['R1'] = pd.Series(2 * time['PP'] - time['low']) | |
time['S1'] = pd.Series(2 * time['PP'] - time['high']) | |
time['R2'] = pd.Series(time['PP'] + time['high'] - time['low']) | |
time['S2'] = pd.Series(time['PP'] - time['high'] + time['low']) | |
layout = go.Layout(title=f'Pivô',xaxis=dict(title="Data"), yaxis=dict(title="Preço")) | |
fig = go.Figure(layout = layout) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-periodo_pivo:], y=round(time['close'][-periodo_pivo:],2), mode='lines', line_width=3,name=f'preço real',line_color='rgb(0,0,0)')) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-periodo_pivo:], y=round(time['PP'][-periodo_pivo:],2), mode='lines', line_width=1,name=f'Ponto do pivô',line_color='rgb(0,128,0)')) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-periodo_pivo:], y=round(time['R1'][-periodo_pivo:],2), mode='lines', line_width=1,name=f'Resistência 1',line_color='rgb(100,149,237)')) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-periodo_pivo:], y=round(time['S1'][-periodo_pivo:],2), mode='lines', line_width=1,name=f'Suporte 1',line_color='rgb(100,149,237)')) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-periodo_pivo:], y=round(time['R2'][-periodo_pivo:],2), mode='lines', line_width=1,name=f'Resistência 2',line_color='rgb(255,0,0)')) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-periodo_pivo:], y=round(time['S2'][-periodo_pivo:],2), mode='lines', line_width=1,name=f'Suporte 2',line_color='rgb(255,0,0)')) | |
fig.update_layout( height=600, width=800 ,showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') | |
fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') | |
st.plotly_chart(fig,use_container_width=True) | |
# ------------------------------ GRÁFICOS DE Bolinger---------------------------- | |
with st.expander("Entenda o gráfico de Bolinger, clique para saber mais"): | |
st.write("""Quando o preço do ativo ultrapassa a banda superior, observamos uma tendência de alta do ativo. Por outro lado, se o preço fica abaixo da banda inferior, há então uma tendência de baixa. Entretanto, deve-se ficar atento aos sinais de força dos ativos ao ultrapassar as bandas.""") | |
periodo_bolinger = int(st.number_input(label='periodo Bolinger',value=180)) | |
time['MA20'] = time['close'].rolling(20).mean() | |
time['20 Day STD'] = time['close'].rolling(window=20).std() | |
time['Upper Band'] = time['MA20'] + (time['20 Day STD'] * 2) | |
time['Lower Band'] = time['MA20'] - (time['20 Day STD'] * 2) | |
layout = go.Layout(title=f'Banda de Bolinger',xaxis=dict(title="Data"), yaxis=dict(title="Preço")) | |
fig = go.Figure(layout = layout) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-periodo_bolinger:], y=round(time['Upper Band'][-periodo_bolinger:],2), mode='lines', line_width=1,name=f'Banda superior',line_color='rgb(255,0,0)')) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-periodo_bolinger:], y=round(time['Lower Band'][-periodo_bolinger:],2), mode='lines', line_width=1,name=f'Banda inferior',line_color='rgb(255,0,0)',fill= 'tonexty', fillcolor ="rgba(255, 0, 0, 0.1)",opacity=0.2)) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-periodo_bolinger:], y=round(time['close'][-periodo_bolinger:],2), mode='lines', line_width=3,name=f'preço real',line_color='rgb(0,0,0)')) | |
fig.add_trace(go.Scatter(x=time.reset_index()['date'][-periodo_bolinger:], y=round(time['MA20'][-periodo_bolinger:],2), mode='lines', line_width=2,name=f'MM 20',line_color='rgb(0,128,0)')) | |
fig.update_layout( height=600, width=800 ,showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') | |
fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') | |
st.plotly_chart(fig,use_container_width=True) | |
#with st.expander("Entenda o gráfico de Previsão, clique para saber mais"): | |
# st.write("""Previsão que leva em conta apenas o movimento gráfico histórico do ativo, porém sabemos que o preço do ativo varia por outros diversos fatores. Com isso, esse é um parâmetro apenas como expectativa caso todos os outros fatores envolvidos se mantivessem.""") | |
# # ------------------------------ Previsões---------------------------- | |
# st.subheader('Previsões') | |
# st.write('As previsões são feitas levando em conta apenas o movimento gráfico, porém o movimento do preço de um ativo é influenciado por diversos outros fatores, com isso, deve se considerar as previsões como uma hipótese de o preço do ativo variar somente pela sua variação gráfica') | |
# st.write('Previsão considerando os últimos 365 dias, pode ser entendida como uma tendência dos dados segundo o último ano') | |
# st.write('Opção de alterar a previsão: caso esteja buscando resultados a curto prazo é possível alterar o "periodo analisado" para fazer previsões apenas com base nos últimos x dias. Neste caso o movimento gráfico para trás dos dias selecionados não serão levados em conta') | |
# periodo_analisado = int(st.number_input(label='período analisado (dias de resultados passados)',value=360)) | |
# st.write('Opção de alterar a previsão: possibilidade de prever resultados futuros por mais de 30 dias') | |
# periodo_futuro = int(st.number_input(label='período futuro a prever (dias)',value=30)) | |
# time = time.reset_index() | |
# time = time[['date','close']] | |
# time.columns = ['ds','y'] | |
# #Modelling | |
# m = Prophet() | |
# m.fit(time[-periodo_analisado:]) | |
# future = m.make_future_dataframe(periods= periodo_futuro, freq='B') | |
# forecast = m.predict(future[-periodo_futuro:]) | |
# from fbprophet.plot import plot_plotly, plot_components_plotly | |
# fig1 = plot_plotly(m, forecast) | |
# fig1.update_layout( height=600, width=800 ,showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') | |
# fig1.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') | |
# st.plotly_chart(fig1,use_container_width=True) | |
# st.subheader('Tendência diária e semanal') | |
# st.write('0 = segunda, 1 = terça, ... , 5 = sábado, 6 = domingo') | |
# fig2 = m.plot_components(forecast,uncertainty = False,weekly_start=1) | |
# st.plotly_chart(fig2,use_container_width=True) | |
#st.write('Previsão considerando as últimas semanas, pode ser entendida como uma tendência dos dados segundo os últimos dias. Leva em consideração diversos fatores como: Índice de força relativa RSI, oscilador estocástico %K, Indicador Willian %R além do movimento gráfico dos últimos dias') | |
#predict = stocker.predict.tomorrow(nome_do_ativo) | |
#st.write('Previsão para o dia:',f'{predict[2]}','é que a ação feche no valor de: R$',f'{predict[0]}') | |
#preço_ontem= round(time['y'][-1:].values[0],2) | |
#if predict[0] < preço_ontem: | |
#st.write('Previsão para o dia:',f'{predict[2]}','é que a ação caia de ',f'{preço_ontem}', 'para valor de: R$ ',f'{predict[0]}') | |
#else: | |
#st.write('Previsão para o dia:',f'{predict[2]}','é que a ação suba de ',f'{preço_ontem}', 'para valor de: R$ ',f'{predict[0]}') | |