Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -12,12 +12,15 @@ import requests
|
|
| 12 |
|
| 13 |
st.set_page_config(page_title="Stock News Sentiment Analyzer", layout="wide")
|
| 14 |
|
| 15 |
-
def verify_link(url):
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
def get_news(ticker):
|
| 23 |
finviz_url = 'https://finviz.com/quote.ashx?t='
|
|
@@ -83,15 +86,33 @@ def plot_daily_sentiment(parsed_and_scored_news, ticker):
|
|
| 83 |
fig = px.bar(mean_scores, x=mean_scores.index, y='sentiment_score', title=f'{ticker} Daily Sentiment Scores')
|
| 84 |
return fig
|
| 85 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
st.header("Stock News Sentiment Analyzer")
|
| 87 |
|
| 88 |
ticker = st.text_input('Enter Stock Ticker', '').upper()
|
| 89 |
|
| 90 |
try:
|
| 91 |
-
st.subheader(f"
|
| 92 |
news_table = get_news(ticker)
|
| 93 |
parsed_news_df = parse_news(news_table)
|
| 94 |
parsed_and_scored_news = score_news(parsed_news_df)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
fig_hourly = plot_hourly_sentiment(parsed_and_scored_news, ticker)
|
| 96 |
fig_daily = plot_daily_sentiment(parsed_and_scored_news, ticker)
|
| 97 |
|
|
@@ -99,7 +120,7 @@ try:
|
|
| 99 |
st.plotly_chart(fig_daily)
|
| 100 |
|
| 101 |
description = f"""
|
| 102 |
-
The above
|
| 103 |
The table below gives each of the most recent headlines of the stock and the negative, neutral, positive and an aggregated sentiment score.
|
| 104 |
The news headlines are obtained from the FinViz website.
|
| 105 |
Sentiments are given by the nltk.sentiment.vader Python library.
|
|
|
|
| 12 |
|
| 13 |
st.set_page_config(page_title="Stock News Sentiment Analyzer", layout="wide")
|
| 14 |
|
| 15 |
+
def verify_link(url, timeout=10, retries=3):
|
| 16 |
+
for _ in range(retries):
|
| 17 |
+
try:
|
| 18 |
+
response = requests.head(url, timeout=timeout, allow_redirects=True)
|
| 19 |
+
if 200 <= response.status_code < 300:
|
| 20 |
+
return True
|
| 21 |
+
except requests.RequestException:
|
| 22 |
+
continue
|
| 23 |
+
return False
|
| 24 |
|
| 25 |
def get_news(ticker):
|
| 26 |
finviz_url = 'https://finviz.com/quote.ashx?t='
|
|
|
|
| 86 |
fig = px.bar(mean_scores, x=mean_scores.index, y='sentiment_score', title=f'{ticker} Daily Sentiment Scores')
|
| 87 |
return fig
|
| 88 |
|
| 89 |
+
def get_recommendation(sentiment_scores):
|
| 90 |
+
avg_sentiment = sentiment_scores['sentiment_score'].mean()
|
| 91 |
+
|
| 92 |
+
if avg_sentiment >= 0.05:
|
| 93 |
+
return f"Positive sentiment (Score: {avg_sentiment:.2f}). The recent news suggests a favorable outlook for this stock. Consider buying or holding if you already own it."
|
| 94 |
+
elif avg_sentiment <= -0.05:
|
| 95 |
+
return f"Negative sentiment (Score: {avg_sentiment:.2f}). The recent news suggests caution. Consider selling or avoiding this stock for now."
|
| 96 |
+
else:
|
| 97 |
+
return f"Neutral sentiment (Score: {avg_sentiment:.2f}). The recent news doesn't show a strong bias. Consider holding if you own the stock, or watch for more definitive trends before making a decision."
|
| 98 |
+
|
| 99 |
st.header("Stock News Sentiment Analyzer")
|
| 100 |
|
| 101 |
ticker = st.text_input('Enter Stock Ticker', '').upper()
|
| 102 |
|
| 103 |
try:
|
| 104 |
+
st.subheader(f"Sentiment Analysis and Recommendation for {ticker} Stock")
|
| 105 |
news_table = get_news(ticker)
|
| 106 |
parsed_news_df = parse_news(news_table)
|
| 107 |
parsed_and_scored_news = score_news(parsed_news_df)
|
| 108 |
+
|
| 109 |
+
# Generate and display recommendation
|
| 110 |
+
recommendation = get_recommendation(parsed_and_scored_news)
|
| 111 |
+
st.write(recommendation)
|
| 112 |
+
|
| 113 |
+
# Display a disclaimer
|
| 114 |
+
st.warning("Disclaimer: This recommendation is based solely on recent news sentiment and should not be considered as financial advice. Always do your own research and consult with a qualified financial advisor before making investment decisions.")
|
| 115 |
+
|
| 116 |
fig_hourly = plot_hourly_sentiment(parsed_and_scored_news, ticker)
|
| 117 |
fig_daily = plot_daily_sentiment(parsed_and_scored_news, ticker)
|
| 118 |
|
|
|
|
| 120 |
st.plotly_chart(fig_daily)
|
| 121 |
|
| 122 |
description = f"""
|
| 123 |
+
The above charts average the sentiment scores of {ticker} stock hourly and daily.
|
| 124 |
The table below gives each of the most recent headlines of the stock and the negative, neutral, positive and an aggregated sentiment score.
|
| 125 |
The news headlines are obtained from the FinViz website.
|
| 126 |
Sentiments are given by the nltk.sentiment.vader Python library.
|