import streamlit as st from nsetools import Nse from nsepy import get_history from datetime import date, timedelta import plotly.express as px import CS_pattern_rankings from PatternRecognition import * from VixAnalysis import * from TopMovers import * import time from scipy.stats import norm from math import exp, log, sqrt import numpy as np import pandas as pd import yfinance as yf from plotly.subplots import make_subplots from NewsAnalyzer import * from Stock_Static_Data import * from PortfolioAnalytics import * buy_sell_color_dict = {"Buy": "green", "Sell": "red", "Hold": "yellow"} today = date.today() nse = Nse() all_stock_codes = nse.get_stock_codes() all_stock_names = dict(zip(nse.get_stock_codes().values(),nse.get_stock_codes().keys())) del all_stock_names['NAME OF COMPANY'] st.set_page_config(page_title='Jarvis', page_icon=':money_with_wings:', layout='wide', initial_sidebar_state='auto') pd.options.plotting.backend = "plotly" st.title('Jarvis') stock_tab, portfolio_tab, intraday_tab = st.tabs(['Stocks', 'Portfolio', 'Intraday']) main_sidebar = st.sidebar with main_sidebar: vix_container = st.container() with vix_container: with st.spinner(text='Loading VIX Analysis...'): try: st.subheader("VIX Analysis") vix_df = get_history(symbol="India VIX", start=today-timedelta(30), end=today, index=True) vix_analysis_df = ProcessVixData(vix_df) value = vix_analysis_df.Norm_Class[-30:].mean() st.metric("Current Market Mood", GetMood(value), '{:.2f}'.format(value)) mood_dict = {'Greed': 'Markets are in bullish state. Good time to book profits.', 'Holding Steady': 'Markets are indecisive. its good to hold onto existing portfolio.', 'Fear': "Markets are in bearish state. Good time to pick good stocks for cheap prices."} with st.expander(GetMood(value)): st.write(mood_dict[GetMood(value)]) except: st.error("Issues fetching VIX Data!") Nifty_sentiment_container = st.container() with Nifty_sentiment_container: with st.spinner(text="Loading NIFTY live sentiment..."): st.subheader("Live NIFTY Sentiment") st.markdown(f"**{get_nifty_sentiment()}**") top_losers = st.container() with top_losers: if GetTopLosers() is not None: st.subheader('Top Losers') st.table(GetTopLosers()) top_gainers = st.container() with top_gainers: if GetTopGainers() is not None: st.subheader('Top Gainers') st.table(GetTopGainers()) with stock_tab: min_days = 60 stock_selector_col, tenure_selector_start_col, tenure_selector_end_col = st.columns(3) with stock_selector_col: selected_stock = st.selectbox('Please select a stock for analysis', list(all_stock_names.keys()), help='Choose stock to analyze') ticker_yf = all_stock_names[selected_stock]+".NS" with tenure_selector_start_col: start_date = st.date_input("Start Date", today-timedelta(min_days)) with tenure_selector_end_col: end_date = st.date_input("End Date", today) if (end_date= 0: chaikin_trend = "Bullish" else: chaikin_trend = "Bearish" st.metric(label="Chaikin Current Trend", value=chaikin_trend, delta="{:.2f}%".format(chaikin_osc_trend_chg*100), help="Chaikin Oscillator is an indicator of buy/sell pressure in the market for give stock.") with MACD_curr_trend_col: st.subheader("MACD Indicator") macd_df = ComputeMACDSignal(stock_data_df.set_index('Date')) macd_bull_bear_signal = "Bullish" if macd_df.macd.iloc[-1] >= macd_df.macdsignal.iloc[-1] else "Bearish" st.metric(label="MACD Signal", value=macd_bull_bear_signal, delta="{:.2f}".format(macd_df.macdhist.iloc[-1]), help="Helpful in analyzing momentum of price.") momentum_plot_column = st.container() with momentum_plot_column: st.subheader("MACD Chart") fig_macd = go.Figure() fig_macd = make_subplots(rows=3, cols=1, shared_xaxes=True, vertical_spacing=0.01, row_heights=[0.5, 0.3, 0.3]) fig_macd.add_trace(go.Candlestick(x=macd_df.index, open=macd_df['Open'], high=macd_df['High'], low=macd_df['Low'], close=macd_df['Close'], name=f"OHLC Chart : {ticker_yf}"), row=1, col=1) colors = ['green' if row['Open'] - row['Close'] >= 0 else 'red' for index, row in macd_df.iterrows()] fig_macd.add_trace(go.Bar(x=macd_df.index, y=macd_df['Volume'], marker_color=colors, name="Volume"), row=2, col=1) colors = ['green' if val >= 0 else 'red' for val in macd_df.macdhist] fig_macd.add_trace(go.Bar(x=macd_df.index, y=macd_df.macdhist, marker_color=colors, name="MACD Histogram"), row=3, col=1) fig_macd.add_trace(go.Scatter(x=macd_df.index, y=macd_df.macd, line=dict(color='black', width=2), name="MACD"), row=3, col=1) fig_macd.add_trace(go.Scatter(x=macd_df.index, y=macd_df.macdsignal, line=dict(color='blue', width=1), name="MACD Signal"), row=3, col=1) fig_macd.update_yaxes(title_text="Price", row=1, col=1) fig_macd.update_yaxes(title_text="Volume", row=2, col=1) fig_macd.update_yaxes(title_text="MACD", showgrid=False, row=3, col=1) st.plotly_chart(fig_macd, use_container_width=True) st.markdown("***") st.subheader("Sentiment Analysis:") newsheadlines = get_headlines(searchterm=selected_stock) newsheadlines_col, sentimet_col = st.columns(2) with newsheadlines_col: st.subheader(f"Top Headlines For {ticker_yf}:") for news in newsheadlines[:5]: st.markdown(news) with sentimet_col: sentiment = get_sentimental_analysis(newsheadlines) st.subheader(f"Live sentiment for {ticker_yf.split('.')[0]}:") st.markdown(f"**{sentiment}**") with portfolio_tab: portfolio_main_container = st.container() with portfolio_main_container: create_portfolio_for_me, diy_portfolio = st.columns(2) with create_portfolio_for_me: sector_list = get_sector_list() sector_list.append('Surprise me!') select_portfolio_sector = st.selectbox( "Choose your sector of preference?", tuple(sector_list)) if st.button('Build Portfolio'): with st.spinner(text='Creating your portfolio! Please wait!'): asset_list = get_stock_list_by_sector(select_portfolio_sector) portfolio_df, hrp = get_HRP_weights(asset_list) fig = px.pie(portfolio_df, values='Weights', names='Stock', title=f'Portfolio allocation for' f' {select_portfolio_sector} sector') st.plotly_chart(fig) exp_ret, vol, sharpe = get_portfolio_performance(hrp) st.write(f'Expected Returns {exp_ret:.0%}') st.write(f'Annualized Volatility {vol:.0%}') st.write(f'Sharpe Ratio {sharpe:.0%}') else: pass with diy_portfolio: asset_list_diy = st.multiselect( 'Choose stocks you want to add to your portfolio', list(nse_stock_sectors.keys()), list(nse_stock_sectors.keys())[:3]) asset_list_diy = [i.strip()+'.NS' for i in asset_list_diy] if st.button('Get Weights'): with st.spinner(text='Creating your portfolio! Please wait!'): portfolio_df, hrp = get_HRP_weights(asset_list_diy) fig = px.pie(portfolio_df, values='Weights', names='Stock', title=f'Portfolio allocation for' f' selected stocks') st.plotly_chart(fig) exp_ret, vol, sharpe = get_portfolio_performance(hrp) st.write(f'Expected Returns {exp_ret:.0%}') st.write(f'Annualized Volatility {vol:.0%}') st.write(f'Sharpe Ratio {sharpe:.0%}') else: pass with intraday_tab: stock_selector_container_intraday = st.container() stock_selector_container_intraday_placeholder = st.empty() with stock_selector_container_intraday: selected_stock_intraday_col, _, barrier_probability_calc_input_col, barrier_probability_calc_button_col \ = st.columns((1, 1, 1, 1)) with selected_stock_intraday_col: selected_stock_intraday = st.selectbox(label='Select stock for intraday analysis', options=list(all_stock_names.keys()), help='Choose stock to analyze') intraday_selected_ticker = all_stock_names[selected_stock_intraday] stock_quote_intraday = nse.get_quote(intraday_selected_ticker) with barrier_probability_calc_input_col: barrier = st.number_input("Enter strike to calculate hit probability", min_value=1.0, value=100.00, step=0.01, max_value=999999999.99, help="Use this tool to estimate strike price of options strategy.") if barrier < 0: st.error("Please enter strike > 0.") with barrier_probability_calc_button_col: r = 0.073 tk = yf.Ticker(intraday_selected_ticker + ".NS") v = np.log((tk.history(period='365d', interval="1d")['Close'] / tk.history(period='365d', interval="1d")['Close'].shift(1)).dropna()).std() live_stock_price_intraday = nse.get_quote(intraday_selected_ticker)['lastPrice'] barrier_flag = 1 if barrier > live_stock_price_intraday else -1 T = 1 d2 = barrier_flag * ((log(live_stock_price_intraday / barrier) + (r - 0.5 * v ** 2)*T) / v*sqrt(T)) hit_prob = exp(-r) * norm.cdf(d2) st.metric(label="Barrier hit probability", value='{:.0f}'.format(hit_prob*100) + '%', help="It gives probability that stock price will hit" " the strike price you entered") while True: with stock_selector_container_intraday_placeholder.container(): quote_dict = nse.get_quote(intraday_selected_ticker) nifty_quote_dict = nse.get_index_quote('Nifty 50') live_stock_col, live_nifty_col = st.columns(2) with live_stock_col: live_stock_price_intraday = quote_dict['lastPrice'] st.metric(label=all_stock_names[selected_stock_intraday], value=live_stock_price_intraday, delta=quote_dict['pChange']) with live_nifty_col: live_nifty_price = nifty_quote_dict['lastPrice'] st.metric(label="Nifty 50", value=live_nifty_price, delta=nifty_quote_dict['pChange']) st.markdown("***") tk = yf.Ticker(intraday_selected_ticker+'.NS') df_intraday_realtime = tk.history(period='1d', interval='1m') df_intraday_realtime['VWAP'] = (((df_intraday_realtime.High + df_intraday_realtime.Low + df_intraday_realtime.Close) / 3) * df_intraday_realtime.Volume).cumsum() /\ df_intraday_realtime.Volume.cumsum() df_intraday_realtime.dropna(inplace=True) fig = go.Figure() fig.add_trace(go.Scatter(x=df_intraday_realtime.index, y=df_intraday_realtime.Close, mode='lines', name='Price')) fig.add_trace(go.Scatter(x=df_intraday_realtime.index, y=df_intraday_realtime.VWAP, mode='lines', name='VWAP')) fig.update_layout(title=intraday_selected_ticker, xaxis_title="Time", yaxis_title=intraday_selected_ticker+" Price") st.plotly_chart(fig, use_container_width=True) if df_intraday_realtime.Close.values[-1] < df_intraday_realtime.VWAP.values[-1]: VWAP_signal = "Buy" vwap_icon = ':thumbsup:' vwap_explain = "Currently the market price is less than the VWAP price. Its good time to enter into trade." elif df_intraday_realtime.Close.values[-1] == df_intraday_realtime.VWAP.values[-1]: VWAP_signal = "Hold" vwap_icon = ':open_hands:' vwap_explain = "Currently the market price is equal to the VWAP price. Wait for buy or sell signal" else: VWAP_signal = "Sell" vwap_icon = ':thumbsdown:' vwap_explain = "Currently the market price is greater than the VWAP price. Its good time to exit the trade." vwap_expander_col, _ = st.columns((1, 3)) with vwap_expander_col: with st.expander(f"VWAP Buy/Sell Indicator : {VWAP_signal}"): st.markdown(vwap_explain) st.header(vwap_icon) time.sleep(5)