File size: 27,014 Bytes
4565b50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2d5847d
4565b50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
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]}')