| import streamlit as st |
| import requests |
| from bs4 import BeautifulSoup |
| from transformers import pipeline |
|
|
| |
| sentiment_pipeline = pipeline("sentiment-analysis") |
|
|
| |
| def fetch_news(ticker): |
| try: |
| url = f"https://finviz.com/quote.ashx?t={ticker}" |
| headers = {'User-Agent': 'Mozilla/5.0'} |
| response = requests.get(url, headers=headers) |
| soup = BeautifulSoup(response.text, 'html.parser') |
| news_table = soup.find(id='news-table') |
| news = [] |
| for row in news_table.findAll('tr')[:3]: |
| title = row.a.get_text() |
| link = row.a['href'] |
| news.append({'title': title, 'link': link}) |
| return news |
| except Exception as e: |
| st.error(f"Failed to fetch news for {ticker}: {e}") |
| return [] |
|
|
| |
| def analyze_sentiment(text): |
| try: |
| result = sentiment_pipeline(text)[0] |
| return "Positive" if result['label'] == 'POSITIVE' else "Negative" |
| except Exception as e: |
| st.error(f"Sentiment analysis failed: {e}") |
| return "Unknown" |
|
|
| |
| st.title("Stock News Sentiment Analysis") |
|
|
| |
| tickers_input = st.text_input("Enter five stock tickers separated by commas (e.g., AAPL, MSFT, GOOGL, AMZN, TSLA):") |
|
|
| if st.button("Get News and Sentiment"): |
| if tickers_input: |
| tickers = [ticker.strip().upper() for ticker in tickers_input.split(',')] |
| |
| |
| if len(tickers) != 5: |
| st.error("Please enter exactly five stock tickers.") |
| else: |
| |
| for ticker in tickers: |
| st.subheader(f"Top 3 News Articles for {ticker}") |
| news_list = fetch_news(ticker) |
| |
| if news_list: |
| for i, news in enumerate(news_list, 1): |
| sentiment = analyze_sentiment(news['title']) |
| st.markdown(f"{i}. [{news['title']}]({news['link']}) - **{sentiment}**") |
| else: |
| st.write("No news available for this ticker.") |
| else: |
| st.warning("Please enter stock tickers.") |