Spaces:
Runtime error
Runtime error
| import yfinance as yf | |
| import pandas as pd | |
| import streamlit as st | |
| import numpy as np | |
| import plotly.graph_objs as go | |
| import plotly.offline as pyo | |
| import pandas_ta as ta | |
| st.header("Enter Market/Stock Ticker") | |
| symbol = st.text_input('Enter Symbol', "ADANIENT.NS") | |
| period = st.text_input('Enter Time Period', "60d") | |
| """(use *"60d"* for min intervals and date(MM-DD-YYY) for other intervals)""" | |
| interval = st.text_input('Enter Time Interval', "30m") | |
| def get_data(): | |
| df = yf.download(symbol, period=period, interval=interval) | |
| #'2021-03-01', '2023-03-01' | |
| #df = yf.download(symbol, period, interval) | |
| df = df.drop(columns=['Volume', 'Adj Close'], axis=1) | |
| df.reset_index(inplace=True) | |
| return(df) | |
| data = get_data() | |
| def movingAvgs(mov1: int, mov2: int): | |
| data["sma100"] = ta.ema(data["Close"], length=mov1) | |
| data["sma21"] = ta.ema(data["Close"], length=mov2) | |
| for i in range(len(data)): | |
| # ! BULLISH | |
| data.loc[data['sma21'] >= data["sma100"], 'movAvgSignal'] = 1 | |
| # ! BEARISH | |
| data.loc[data['sma21'] <= data["sma100"], 'movAvgSignal'] = -1 | |
| def iMACD(): | |
| data['ema5'] = data['Close'].rolling(window=5).mean() | |
| data['ema13'] = data['Close'].rolling(window=13).mean() | |
| data['i_macd'] = data['ema5'] - data['ema13'] | |
| return data | |
| def plot_iMACD(): | |
| dfpl = data[5500:] | |
| fig = go.Figure() | |
| fig.add_trace(go.Scatter(x=data.index, y=data.ema5, | |
| mode='lines', line_color='red', name='5-day EMA')) | |
| fig.add_trace(go.Scatter(x=data.index, y=data.ema13, | |
| mode='lines', line_color='green', name='13-day EMA')) | |
| fig.update_layout(title='IMPulse MACD Chart', | |
| xaxis_title='Date', | |
| yaxis_title='IMPulse MACD') | |
| fig.show() | |
| return data | |
| def ene_iMACD( diff: int ): | |
| data['ptc_change'] = (data['ema13'] - data['ema5']).pct_change(periods=1) | |
| data['short_long'] = 0 | |
| # SHORT == -1 | |
| # LONG == 1 | |
| # Default ptc_change difference == 0.037 | |
| data.loc[data['ptc_change'] >= diff, 'short_long'] = 1 | |
| data.loc[(data['ptc_change'] <= diff) & (data['ptc_change'] >= -diff), 'short_long'] = -1 | |
| data.loc[data['ptc_change'] <= -diff, 'short_long'] = 1 | |
| #counts = data['short_long'].value_counts() | |
| #print(counts) | |
| return data | |
| def ene_SMI( n: int ): # n = number of lookback days (default = 20) | |
| # BOLLINGER BANDS | |
| std_20d = data['Close'].rolling(n).std() | |
| data['m_bband'] = data['Close'].rolling(n).mean() | |
| data['u_bband'] = data['m_bband'] + std_20d * 1.5 | |
| data['l_bband'] = data['m_bband'] - std_20d * 1.5 | |
| #KELTNER CHANNELS | |
| atr_20d = ta.atr(data["High"], data["Low"], data["Close"], length=n) | |
| data['m_keltb'] = ta.ema(data['Close'], length = n) | |
| data['u_keltb'] = data['m_keltb'] + (1.5 * atr_20d) | |
| data['l_keltb'] = data['m_keltb'] - (1.5 * atr_20d) | |
| high_h = data['High'].rolling(n).max() | |
| low_l = data['Low'].rolling(n).min() | |
| hl_avg = (high_h + low_l) / 2 | |
| hl_mean = (data['m_bband'] + hl_avg) / 2 | |
| delta = data.Close - hl_mean | |
| data['delta'] = delta.rolling(n).mean() | |
| return data | |
| def squeeze(): | |
| data['sqz'] = 0 | |
| #sqzOn = (lowerBB > lowerKC) & (upperBB < upperKC) | |
| data.loc[(data.l_bband > data.l_keltb) & (data.u_bband < data.u_keltb), 'sqz'] = 1 | |
| #sqzOff = (lowerBB < lowerKC) & (upperBB > upperKC) | |
| data.loc[(data.l_bband < data.l_keltb) & (data.u_bband > data.u_keltb), 'sqz'] = -1 | |
| #noSqz = (sqzOn == False) & (sqzOff == False) | |
| last_squeeze = 0 | |
| for i in range(len(data)): | |
| # check for bullish signal | |
| if data.loc[i, 'sqz'] == 1: | |
| if last_squeeze == 0 or last_squeeze == -1: | |
| data.loc[i, 'sqz'] = 1 | |
| last_squeeze = 1 | |
| elif last_squeeze == 1 and i < len(data) - 1 and data.loc[i+1, 'sqz'] != data.loc[i, 'sqz']: | |
| data.loc[i, 'sqz'] = 0 | |
| else: | |
| data.loc[i, 'sqz'] = 0 | |
| # check for bearish signal | |
| elif data.loc[i, 'sqz'] == -1: | |
| if last_squeeze == 0 or last_squeeze == 1: | |
| data.loc[i, 'sqz'] = -1 | |
| last_squeeze = -1 | |
| elif last_squeeze == -1 and i < len(data) - 1 and data.loc[i+1, 'sqz'] != data.loc[i, 'sqz']: | |
| data.loc[i, 'sqz'] = 0 | |
| else: | |
| data.loc[i, 'sqz'] = 0 | |
| else: | |
| data.loc[i, 'sqz'] = 0 | |
| data['sqz_label'] = np.where(data.sqz == 1, 'ON', np.where(data.sqz == -1, 'OFF', '')) | |
| return data | |
| def TSI(n1, n2): | |
| ap = (data['High'] + data['Low'] + data['Close']) / 3 | |
| esa = ap.ewm(span=n1, min_periods=n1).mean() | |
| d = abs(ap - esa).ewm(span=n1, min_periods=n1).mean() | |
| ci = (ap - esa) / (0.015 * d) | |
| tci = ci.ewm(span=n2, min_periods=n2).mean() | |
| data['TSI'] = tci | |
| return data | |
| def signals(delta_h: int, delta_l: int): | |
| last_signal = 0 | |
| for i in range(len(data)): | |
| # check for bullish signal | |
| if data.loc[i, 'delta'] >= delta_h: | |
| #if last_signal == 0 or last_signal == -1: | |
| data.loc[i, 'signal'] = 1 | |
| # last_signal = 1 | |
| #elif last_signal == 1 and i < len(data) - 1 and data.loc[i+1, 'delta'] != data.loc[i, 'delta']: | |
| # data.loc[i, 'signal'] = 0 | |
| #else: | |
| # data.loc[i, 'signal'] = 0 | |
| # check for bearish signal | |
| elif data.loc[i, 'delta'] <= delta_l: | |
| #if last_signal == 0 or last_signal == 1: | |
| data.loc[i, 'signal'] = -1 | |
| # last_signal = -1 | |
| #elif last_signal == -1 and i < len(data) - 1 and data.loc[i+1, 'delta'] != data.loc[i, 'delta']: | |
| # data.loc[i, 'signal'] = 0 | |
| #else: | |
| # data.loc[i, 'signal'] = 0 | |
| else: | |
| data.loc[i, 'signal'] = 0 | |
| return data | |
| def plot_SMI(data): | |
| fig = go.Figure() | |
| fig.add_trace(go.Scatter(x=data.index, y=data.u_bband, | |
| mode='lines', line_color='red', name='Upper Bollinger Band')) | |
| fig.add_trace(go.Scatter(x=data.index, y=data.l_bband, | |
| mode='lines', line_color='red', name='Lower Bollinger Band')) | |
| #fig.add_trace(go.Scatter(x=data.index, y=data.m_keltb, | |
| # mode='lines', line_color='green', name='Middle Kelter Channel')) | |
| fig.add_trace(go.Scatter(x=data.index, y=data.u_keltb, | |
| mode='lines', line_color='green', name='Upper Kelter Channel')) | |
| fig.add_trace(go.Scatter(x=data.index, y=data.l_keltb, | |
| mode='lines', line_color='green', name='Lower Kelter Channel')) | |
| fig.update_layout(title='SMI Chart', | |
| xaxis_title='Date', | |
| yaxis_title='SMI') | |
| return fig.show() | |
| #fig, ax = plt.subplots(figsize=(20,5)) | |
| #ax.plot(data.loc[data['signal'] == 1].index, data['Close'][data['signal'] == 1], '^', markersize=10, color='g', label='Buy Signal') | |
| #ax.plot(data.loc[data['signal'] == -1].index, data['Close'][data['signal'] == -1], 'v', markersize=10, color='r', label='Sell Signal') | |
| #plt.show() | |
| def plot_Signals(data): | |
| linechart = go.Scatter(x=data.index, | |
| y=data['Close'], | |
| mode='lines', | |
| name='Closing Prices') | |
| buy_signals = data[data['signal'] == 1] | |
| sell_signals = data[data['signal'] == -1] | |
| buy_trace = go.Scatter(x=buy_signals.index, | |
| y=buy_signals['Close'], | |
| mode='markers', | |
| marker=dict(symbol='triangle-up', size=10, color='green'), | |
| name='Buy Signal') | |
| sell_trace = go.Scatter(x=sell_signals.index, | |
| y=sell_signals['Close'], | |
| mode='markers', | |
| marker=dict(symbol='triangle-down', size=10, color='red'), | |
| name='Sell Signal') | |
| #annot_trace = go.Scatter(x=data.index, y=data.Close, mode='text', name='Squeeze Status', | |
| # text=data.sqz_label, textposition='bottom center', showlegend=False) | |
| data = [linechart, buy_trace, sell_trace]#, annot_trace] | |
| fig = go.Figure(data=data) | |
| #fig.show() | |
| return fig | |
| def plot_TSI(data): | |
| data['above_zero'] = data['TSI'] > 0 | |
| # Create traces for above and below zero | |
| trace_above = go.Scatter(x=data.index, | |
| y=data['TSI'], | |
| mode='lines', | |
| name='TSI line above 0', | |
| fill='tozeroy', # fill above the line | |
| fillcolor='green', | |
| line=dict(color='green'), | |
| opacity=0.5, # set the opacity to 0.5 to see the line | |
| visible='legendonly', # only show in legend | |
| showlegend=True # show in legend | |
| ) | |
| trace_below = go.Scatter(x=data.index, | |
| y=data['TSI'], | |
| mode='lines', | |
| name='TSI line below 0', | |
| fill='tozeroy', # fill below the line | |
| fillcolor='red', | |
| line=dict(color='red'), | |
| opacity=0.5, # set the opacity to 0.5 to see the line | |
| visible='legendonly', # only show in legend | |
| showlegend=True # show in legend | |
| ) | |
| fig = go.Figure() | |
| fig.add_trace(trace_above) | |
| fig.add_trace(trace_below) | |
| # Update the layout | |
| fig.update_layout( | |
| title='TSI line', | |
| xaxis_title='Date', | |
| yaxis_title='TSI', | |
| legend=dict( | |
| title='TSI lines', | |
| orientation='h', | |
| yanchor='bottom', | |
| y=1.02, | |
| xanchor='right', | |
| x=1 | |
| ), | |
| ) | |
| return fig | |
| def refresh_page(): | |
| st.experimental_rerun() | |
| if __name__ == '__main__': | |
| st.header("Calculate the Simple Moving Averages (Moving Average Crossovers)") | |
| #st.subheader("movingAvgs( 1st Moving Average Period, 2nd Moving Average Period)") | |
| #movAvg1 = st.text_input('Enter SMA 1 period: ', 21) | |
| #movAvg2 = st.text_input('Enter SMA 2 period: ', 7) | |
| #movAvg1 = int(movAvg1) | |
| #movAvg2 = int(movAvg2) | |
| #movingAvgs(movAvg1,movAvg2) | |
| movingAvgs(21, 7) | |
| iMACD() | |
| #ene_iMACD(0.035) | |
| #st.header("Calculate the Squeeze Momentum Indicator values") | |
| #smi_timef = st.text_input('Enter SMI lookback period ', 7) | |
| #smi_timef = int(smi_timef) | |
| #ene_SMI(smi_timef) | |
| ene_SMI(7) | |
| squeeze() | |
| st.header("Calculate the BUY/SELL Signals") | |
| signals_b = st.text_input('Enter BUY threshold (positive)', 30) | |
| signals_s = st.text_input('Enter SELL threshold (negative)', -32) | |
| signals_b = int(signals_b) | |
| signals_s = int(signals_s) | |
| signals(signals_b, signals_s) | |
| #st.dataframe(signals(signals_b, signals_s)) | |
| #plot_SMI(data) | |
| TSI(10,21) | |
| if st.button('Refresh'): | |
| refresh_page() | |
| st.header("Visualize the BUY/SELL Signals") | |
| #st.plotly_chart(plot_Signals(data)) | |
| fig = plot_Signals(data) | |
| st.plotly_chart(fig) | |
| #fig2 = plot_TSI(data) | |
| #st.plotly_chart(fig2) | |