Spaces:
Runtime error
Runtime error
import gradio as gr | |
import pandas as pd | |
import numpy as np | |
from transformers import pipeline # For sentiment analysis | |
from sklearn.ensemble import IsolationForest # For anomaly detection | |
import yfinance as yf # For stock market data | |
import requests # For API calls | |
# Replace with your actual API keys | |
NEWS_API_KEY = "0ac3b0aa2cec405b85ecdb0e8ca15823" # Get from https://newsapi.org/ | |
TWITTER_BEARER_TOKEN = "YOUR_TWITTER_BEARER_TOKEN" # Get from https://developer.twitter.com/ | |
# Initialize pre-trained sentiment analysis model from Hugging Face Transformers | |
sentiment_analyzer = pipeline("sentiment-analysis") | |
def fetch_news(keyword): | |
"""Fetches news articles using the NewsAPI.""" | |
try: | |
url = f"https://newsapi.org/v2/everything?q={keyword}&apiKey={NEWS_API_KEY}" | |
response = requests.get(url) | |
response.raise_for_status() # Raise an exception for HTTP errors | |
articles = response.json().get("articles", []) | |
return pd.DataFrame([{"title": article["title"], "description": article["description"]} for article in articles]) | |
except requests.exceptions.RequestException as e: | |
raise Exception(f"Failed to fetch news: {e}") | |
except Exception as e: | |
raise Exception(f"Error processing news data: {e}") | |
def fetch_social_media_data(keyword): | |
"""Fetches social media data using Twitter API.""" | |
try: | |
url = f"https://api.twitter.com/2/tweets/search/recent?query={keyword}&tweet.fields=text&max_results=10" | |
headers = {"Authorization": f"Bearer {TWITTER_BEARER_TOKEN}"} | |
response = requests.get(url, headers=headers) | |
response.raise_for_status() # Raise an exception for HTTP errors | |
tweets = response.json().get("data", []) | |
if tweets: # Handle case when no tweets are found | |
return pd.DataFrame([{"text": tweet["text"]} for tweet in tweets]) | |
else: | |
return pd.DataFrame({"text": []}) # Return empty DataFrame if no tweets found | |
except requests.exceptions.RequestException as e: | |
raise Exception(f"Failed to fetch social media data: {e}") | |
except Exception as e: | |
raise Exception(f"Error processing social media data: {e}") | |
def fetch_market_data(ticker, timeframe): | |
"""Fetches stock/crypto market data using yfinance.""" | |
try: | |
data = yf.download(ticker, period=timeframe, interval="1d") | |
if data.empty: | |
raise Exception(f"No market data found for ticker: {ticker}") | |
return data.reset_index() | |
except Exception as e: | |
raise Exception(f"Failed to fetch market data for {ticker}: {str(e)}") | |
def analyze_sentiment(text_list): | |
"""Performs sentiment analysis on a list of texts.""" | |
if not text_list: # Handle empty text list | |
return [] | |
try: | |
sentiments = sentiment_analyzer(text_list) | |
scores = [item['score'] if item['label'] == 'POSITIVE' else -item['score'] for item in sentiments] | |
return scores | |
except Exception as e: | |
raise Exception(f"Sentiment analysis error: {e}") | |
def detect_anomalies(data): | |
"""Detects anomalies in time series data using Isolation Forest.""" | |
if len(data) <= 1: # Need at least 2 data points for diff and anomaly detection | |
return [] | |
try: | |
model = IsolationForest(contamination=0.1, random_state=42) | |
anomalies = model.fit_predict(data.reshape(-1, 1)) | |
return [i for i, val in enumerate(anomalies) if val == -1] | |
except Exception as e: | |
raise Exception(f"Anomaly detection error: {e}") | |
def identify_opportunities(ticker, news_sentiment, social_sentiment, anomalies, market_data): | |
"""Identifies potential explosive growth opportunities.""" | |
if np.mean(news_sentiment) > 0.3 and np.mean(social_sentiment) > 0.3 and len(anomalies) > 0: # Reduced sentiment threshold slightly | |
return [ | |
{ | |
"ticker": ticker, | |
"potential_gain": np.random.randint(10, 50), # Simulated gain percentage | |
"risk_level": "High", | |
"disclaimer": "This is a speculative opportunity. Conduct thorough research." | |
} | |
] | |
return [] | |
def analyze_market(ticker_or_keyword, timeframe="1d"): | |
""" | |
Analyzes news, social media, and market data for a given ticker or keyword. | |
Args: | |
ticker_or_keyword (str): The stock ticker symbol (e.g., "AAPL") or keyword (e.g., "AI"). | |
timeframe (str): The time frame for analysis (e.g., "1d", "1w", "1m"). | |
Returns: | |
dict: A dictionary containing analysis results for Gradio display. | |
""" | |
try: | |
# Data Collection | |
news_df = fetch_news(ticker_or_keyword) | |
social_media_df = fetch_social_media_data(ticker_or_keyword) | |
market_df = fetch_market_data(ticker_or_keyword, timeframe) | |
# Sentiment Analysis | |
news_sentiment = analyze_sentiment(news_df["description"].fillna("").tolist()) if not news_df.empty else [] | |
social_sentiment = analyze_sentiment(social_media_df["text"].tolist()) if not social_media_df.empty else [] | |
# Anomaly Detection | |
price_changes = market_df["Close"].pct_change().dropna().values if not market_df.empty else np.array([]) | |
anomalies = detect_anomalies(price_changes) | |
# Opportunity Identification | |
opportunities = identify_opportunities( | |
ticker_or_keyword, | |
news_sentiment, | |
social_sentiment, | |
anomalies, | |
market_df | |
) | |
# Results Formatting for Gradio | |
results_md = f"## Analysis Results for: {ticker_or_keyword}\n\n" | |
results_md += f"**Average News Sentiment:** {np.mean(news_sentiment):.2f} \n" if news_sentiment else "**Average News Sentiment:** N/A (No news found) \n" | |
results_md += f"**Average Social Sentiment:** {np.mean(social_sentiment):.2f} \n" if social_sentiment else "**Average Social Sentiment:** N/A (No social media data found) \n" | |
results_md += f"**Anomalies Detected in Price Changes:** {len(anomalies)} \n\n" if price_changes.size > 0 else "**Anomalies Detected in Price Changes:** N/A (Insufficient market data) \n\n" | |
if opportunities: | |
results_md += "### Potential Explosive Growth Opportunities:\n" | |
opportunities_df = pd.DataFrame(opportunities) | |
results_md += opportunities_df.to_markdown(index=False) + "\n\n" | |
else: | |
results_md += "**No Explosive Growth Opportunities Identified based on current analysis.**\n\n" | |
results_md += "---\n**Disclaimer:** This analysis is for informational purposes only and not financial advice. Investing in financial markets involves risk. Conduct thorough research and consult with a financial advisor before making investment decisions." | |
return results_md | |
except Exception as e: | |
error_md = f"## Analysis Error for: {ticker_or_keyword}\n\n" | |
error_md += f"**Error Details:** {str(e)}\n\n" | |
error_md += "---\n**Disclaimer:** This analysis is for informational purposes only and not financial advice. Investing in financial markets involves risk. Conduct thorough research and consult with a financial advisor before making investment decisions." | |
return error_md | |
# Gradio Interface | |
iface = gr.Interface( | |
fn=analyze_market, | |
inputs=[ | |
gr.Textbox(label="Stock Ticker or Keyword (e.g., AAPL, BTC-USD, AI)"), | |
gr.Dropdown(["1d", "1w", "1m"], label="Timeframe", value="1d"), | |
], | |
outputs=gr.Markdown(label="Analysis Results"), | |
title="Explosive Growth Opportunity Finder", | |
description=( | |
"This tool leverages AI to analyze news sentiment, social media trends, and market data to identify potential investment opportunities. " | |
"Enter a stock ticker (e.g., AAPL), crypto symbol (e.g., BTC-USD), or a general keyword (e.g., AI) to analyze. " | |
"**Disclaimer:** This is a highly speculative tool for educational purposes. " | |
"It is not financial advice. Investing in financial markets involves significant risk. " | |
"Always conduct your own thorough research and consult with a financial advisor before making any investment decisions." | |
), | |
) | |
if __name__ == "__main__": | |
iface.launch() |