import streamlit as st from func import ( get_sentiment_pipeline, get_ner_pipeline, fetch_news, analyze_sentiment, extract_org_entities, ) import time # ----------- Page Config ----------- st.set_page_config( page_title="EquiPulse: Stock Sentiment Tracker", layout="centered", initial_sidebar_state="collapsed" ) # ----------- Custom Styling ----------- st.markdown(""" """, unsafe_allow_html=True) # ----------- Header Title (Centered + Bold + Large + Professional) ----------- st.markdown("""
📊 EquiPulse: Stock Sentiment Tracker
""", unsafe_allow_html=True) # ----------- Description Section ----------- st.markdown("""
Analyze real-time financial sentiment from news headlines related to companies you're interested in.
""", unsafe_allow_html=True) # ----------- Input Area ----------- st.markdown("#### 🎯 Enter Your Target Company Tickers (Up to 5 Tickers)") free_text = st.text_area("Example: AAPL, NVDA, TSLA", height=90) # ----------- Ticker Extraction ----------- ner_pipeline = get_ner_pipeline() tickers = extract_org_entities(free_text, ner_pipeline) if tickers: st.markdown(f"✅ **Recognized Tickers:** `{', '.join(tickers)}`") else: tickers = [] # ----------- Action Button ----------- if st.button("🔍 Get News and Sentiment"): if not tickers: st.warning("⚠️ Please enter at least one recognizable company name or ticker.") else: sentiment_pipeline = get_sentiment_pipeline() progress_bar = st.progress(0) total_stocks = len(tickers) for idx, ticker in enumerate(tickers): st.markdown(f"---\n#### 🔍 Analyzing `{ticker}`") news_list = fetch_news(ticker) if news_list: # ------------------------------------------------------ sentiments = [ analyze_sentiment(news["title"], pipe=sentiment_pipeline) for news in news_list ] # ------------------------------------------------------ pos_count = sentiments.count("Positive") neg_count = sentiments.count("Negative") total = len(sentiments) pos_ratio = pos_count / total if total else 0 neg_ratio = neg_count / total if total else 0 # Simple heuristic for overall sentiment if pos_ratio >= 0.5: overall = "Positive" elif neg_ratio >= 0.5: overall = "Negative" else: overall = "Neutral" # Display news st.markdown(f"**📰 Top News for `{ticker}`:**") for i, news in enumerate(news_list[:3]): st.markdown(f"{i + 1}. [{news['title']}]({news['link']}) — **{sentiments[i]}**") st.success(f"📈 **Overall Sentiment for `{ticker}`: {overall}**") else: st.info(f"No recent news found for `{ticker}`.") progress_bar.progress((idx + 1) / total_stocks) time.sleep(0.1)