Anupam251272's picture
Create app.py
8a4020d verified
import gradio as gr
import yfinance as yf
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import plotly.graph_objects as go
from transformers import pipeline
import torch
from textblob import TextBlob
import nltk
from ta.trend import SMAIndicator, MACD
from ta.momentum import RSIIndicator
# Download NLTK data
try:
nltk.download('punkt', quiet=True)
nltk.download('averaged_perceptron_tagger', quiet=True)
except Exception as e:
print(f"NLTK download warning (not critical): {e}")
class StockAnalysisApp:
def __init__(self):
try:
self.sentiment_analyzer = pipeline("sentiment-analysis",
device=0 if torch.cuda.is_available() else -1)
except:
self.sentiment_analyzer = pipeline("sentiment-analysis", device=-1)
def get_stock_data(self, ticker, period='1y'):
"""Fetch stock data"""
try:
stock = yf.Ticker(ticker)
data = stock.history(period=period)
return data, stock.info
except Exception as e:
return None, None
def create_chart(self, data, ticker):
"""Create interactive stock chart"""
try:
fig = go.Figure()
# Candlestick chart
fig.add_trace(go.Candlestick(
x=data.index,
open=data['Open'],
high=data['High'],
low=data['Low'],
close=data['Close'],
name=ticker
))
# Add SMAs
sma20 = SMAIndicator(close=data['Close'], window=20).sma_indicator()
sma50 = SMAIndicator(close=data['Close'], window=50).sma_indicator()
fig.add_trace(go.Scatter(x=data.index, y=sma20,
name='SMA20',
line=dict(color='orange')))
fig.add_trace(go.Scatter(x=data.index, y=sma50,
name='SMA50',
line=dict(color='blue')))
fig.update_layout(
title=f'{ticker} Stock Price',
yaxis_title='Price',
template='plotly_dark',
xaxis_rangeslider_visible=False
)
return fig
except Exception as e:
return None
def get_technical_analysis(self, data):
"""Generate technical analysis"""
try:
current_price = data['Close'].iloc[-1]
prev_price = data['Close'].iloc[-2]
price_change = ((current_price - prev_price) / prev_price) * 100
# Calculate indicators
rsi = RSIIndicator(close=data['Close']).rsi().iloc[-1]
macd = MACD(close=data['Close'])
macd_line = macd.macd().iloc[-1]
signal_line = macd.macd_signal().iloc[-1]
analysis = f"""
Technical Analysis Summary:
Current Price: ${current_price:.2f}
Daily Change: {price_change:.2f}%
Technical Indicators:
- RSI (14): {rsi:.2f} ({'Overbought' if rsi > 70 else 'Oversold' if rsi < 30 else 'Neutral'})
- MACD: {macd_line:.2f}
- Signal Line: {signal_line:.2f}
- MACD Status: {'Bullish' if macd_line > signal_line else 'Bearish'}
Volume Analysis:
- Current Volume: {int(data['Volume'].iloc[-1]):,}
- Avg Volume (20D): {int(data['Volume'].rolling(20).mean().iloc[-1]):,}
"""
return analysis
except Exception as e:
return f"Error in technical analysis: {str(e)}"
def process_query(self, message, history):
"""Process chat queries"""
try:
message = message.strip()
# Extract potential stock ticker
words = message.split()
ticker = None
for word in words:
if word.isupper() and 1 < len(word) <= 5:
ticker = word
break
if ticker:
data, info = self.get_stock_data(ticker)
if data is not None:
analysis = self.get_technical_analysis(data)
return analysis
# General queries
message_lower = message.lower()
if "help" in message_lower:
return """I can help you with:
1. Stock Analysis (e.g., "Analyze AAPL")
2. Technical Indicators (e.g., "What's RSI?")
3. Market Information (e.g., "Tell me about TSLA")
You can also use the interface above to:
- View stock charts
- Get detailed technical analysis
- See price predictions
- Track multiple stocks"""
return "Please provide a stock ticker or ask for help to see what I can do."
except Exception as e:
return f"Error processing query: {str(e)}"
def create_ui():
"""Create the complete Gradio interface"""
app = StockAnalysisApp()
def analyze_stock(ticker, period):
try:
data, info = app.get_stock_data(ticker, period)
if data is None:
return None, "Error fetching stock data"
chart = app.create_chart(data, ticker)
analysis = app.get_technical_analysis(data)
return chart, analysis
except Exception as e:
return None, f"Error: {str(e)}"
# Create the interface
with gr.Blocks(theme=gr.themes.Soft()) as interface:
gr.Markdown("""
# Stock Analysis Dashboard
Enter a stock ticker and select analysis period to get started.
""")
with gr.Row():
with gr.Column(scale=1):
ticker_input = gr.Textbox(
label="Stock Ticker",
placeholder="e.g., AAPL",
value="AAPL"
)
period_input = gr.Dropdown(
choices=["1mo", "3mo", "6mo", "1y", "2y", "5y"],
value="1y",
label="Analysis Period"
)
analyze_button = gr.Button("Analyze Stock")
with gr.Column(scale=2):
with gr.Tab("Chart"):
chart_output = gr.Plot()
with gr.Tab("Analysis"):
analysis_output = gr.Textbox(
label="Technical Analysis",
lines=10
)
gr.Markdown("---")
with gr.Row():
with gr.Column():
gr.Markdown("### Chat with AI Assistant")
chatbot = gr.ChatInterface(
app.process_query,
examples=[
"Analyze AAPL",
"What's the trend for TSLA?",
"Help"
]
)
# Set up event handlers
analyze_button.click(
analyze_stock,
inputs=[ticker_input, period_input],
outputs=[chart_output, analysis_output]
)
return interface
# Launch the application
if __name__ == "__main__":
demo = create_ui()
demo.launch(share=True)