import streamlit as st import yfinance as yf import pandas as pd import cufflinks as cf import datetime import plotly.graph_objects as go from bs4 import BeautifulSoup import requests import os from datetime import date, timedelta from transformers import pipeline import torch from transformers import AutoTokenizer, AutoModelForSequenceClassification from contextlib import redirect_stdout from io import StringIO def scrapper (start_date): d0 = start_date d1 = datetime.date(2008, 1, 1) delta = d0 - d1 #st.write(delta) Begindatestring = start_date val = 39448 + int(delta.days) url = 'https://economictimes.indiatimes.com/archivelist/year-'+str(Begindatestring.year)+',month-'+str(Begindatestring.month)+',starttime-'+str(val)+'.cms' # Replace with your URL response = requests.get(url) if response.status_code == 200: html_text = response.text soup = BeautifulSoup(html_text, "lxml") else: gg=0 jobs = soup.find_all("li") headlines = [] for job in jobs: try: target_element = job.find("a") target_element.text headlines.append(target_element.text) except: continue return headlines # App title st.markdown(''' # Sovrenn Market Sentiment Indicator App Shown are the stock price data for the selected company! **Credits** - App built by SRL ''') st.write('---') # Sidebar st.sidebar.subheader('Query parameters') start_date = st.sidebar.date_input("Start date", datetime.date(2023,9, 20)) #start_date = start_date - datetime.timedelta(days=1) end_date = start_date + datetime.timedelta(days=14) # User input for the stock ticker symbol tickerSymbol = st.sidebar.text_input('Enter Stock Ticker Symbol') if tickerSymbol: try: tickerData = yf.Ticker(tickerSymbol) # Get ticker data tickerDf = tickerData.history(period='1d', start=start_date, end=end_date) # Get the historical prices for this ticker string_name = tickerData.info.get('longName', 'Company Name Not Available') st.header('**%s**' % string_name) # Try to get the business summary, handle KeyError if not available try: string_summary = tickerData.info['longBusinessSummary'] st.info(string_summary) except KeyError: st.warning("Business summary not available for this company.") # Ticker data st.header('**Ticker data**') st.write(tickerDf) # Create a candlestick chart and volume bar chart fig_candlestick = go.Figure(data=[go.Candlestick(x=tickerDf.index, open=tickerDf['Open'], high=tickerDf['High'], low=tickerDf['Low'], close=tickerDf['Close'])]) fig_volume = go.Figure(data=[go.Bar(x=tickerDf.index, y=tickerDf['Volume'])]) st.header('**Candlestick Chart**') st.plotly_chart(fig_candlestick) st.header('**Volume Bar Chart**') st.plotly_chart(fig_volume) st.write(start_date) tickerDf = pd.DataFrame(tickerDf).reset_index() # st.write(tickerDf) #date = datetime.date(start_date) date_str = start_date.strftime("%Y-%m-%d") #st.write(date_str) df = tickerDf[tickerDf["Date"]==date_str] #st.write(df) if (df["Close"][0] > df["Open"][0] ): st.write("NSE has uptrend on " +date_str ) if (df["Close"][0] < df["Open"][0] ): st.write(" NSE has downdtrend on " +date_str ) except: st.write("Stock Data of this Index on the selected Date is not available \n") Begindatestring = start_date # Create a dummy stream to suppress output dummy_stream = StringIO() with redirect_stdout(dummy_stream): headlines = scrapper(start_date) index = [idx for idx, s in enumerate(headlines) if s=='Most Read' ][0] del headlines[index:] news = pd.DataFrame({"News": headlines}) news.insert(0, 'Date', Begindatestring) news = news.drop_duplicates() news = news.dropna(how='any') news = news.reset_index(drop=True) tokenizer = AutoTokenizer.from_pretrained("nickmuchi/sec-bert-finetuned-finance-classification") model = AutoModelForSequenceClassification.from_pretrained("nickmuchi/sec-bert-finetuned-finance-classification") device = torch.device("cuda" if torch.cuda.is_available() else "cpu") nlp = pipeline("text-classification", model=model, tokenizer=tokenizer, device=device) length = len(news[ 'News'].to_list()) news_list = news[ 'News'].to_list() df = pd.DataFrame() for i in range (0, length): results = nlp(news_list[i]) df.loc[i, "News"] = news_list[i] df.loc[i , 'label'] = results[0]["label"] df.loc[i , 'score'] = results[0]["score"] if(i%100 ==0): st.write("Articles Processed Number "+ str(i)) bullish_rows = df[df['label'] == 'bullish'] bullish_score_sum = bullish_rows['score'].sum() num_bullish_rows = len(bullish_rows) average_score_for_bullish = bullish_score_sum / num_bullish_rows bearish_rows = df[df['label'] == 'bearish'] bearish_score_sum = bearish_rows['score'].sum() num_bearish_rows = len(bearish_rows) average_score_for_bearish = bearish_score_sum / num_bearish_rows if(average_score_for_bearish > average_score_for_bullish): st.write("Stock will go down") if(average_score_for_bearish < average_score_for_bullish): st.write("Stock will go up") else: st.warning("Please enter a valid Stock Ticker Symbol.")