Anupam251272's picture
Create app.py
9998dca verified
raw
history blame
6.14 kB
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from prophet import Prophet
import gradio as gr
from ta.trend import SMAIndicator, EMAIndicator, MACD
from ta.momentum import RSIIndicator
# Function for trading strategy signals
def trading_signals(df, strategy="day trading"):
signals = ""
df = df.copy()
try:
if strategy.lower() == "day trading":
# Use Bollinger Bands and RSI for intraday trades
df['RSI'] = RSIIndicator(df['Close'], window=14).rsi()
df['EMA_9'] = EMAIndicator(df['Close'], window=9).ema_indicator()
df['EMA_21'] = EMAIndicator(df['Close'], window=21).ema_indicator()
df['Signal'] = (df['EMA_9'] > df['EMA_21']).astype(int)
signals = f"Day Trading Signals: {'Buy' if df['Signal'].iloc[-1] else 'Sell'}"
elif strategy.lower() == "swing trading":
# Swing Trading: SMA crossover
df['SMA_50'] = SMAIndicator(df['Close'], window=50).sma_indicator()
df['SMA_200'] = SMAIndicator(df['Close'], window=200).sma_indicator()
df['Signal'] = (df['SMA_50'] > df['SMA_200']).astype(int)
signals = f"Swing Trading Signals: {'Bullish' if df['Signal'].iloc[-1] else 'Bearish'}"
elif strategy.lower() == "momentum trading":
# Momentum Trading: RSI + MACD
df['RSI'] = RSIIndicator(df['Close'], window=14).rsi()
macd = MACD(df['Close'])
df['MACD'] = macd.macd()
df['MACD_signal'] = macd.macd_signal()
# Simplified momentum condition
df['Momentum'] = ((df['RSI'] > 50) & (df['MACD'] > df['MACD_signal'])).astype(int)
signals = f"Momentum Trading Signal: {'Strong Momentum' if df['Momentum'].iloc[-1] else 'Weak Momentum'}"
elif strategy.lower() == "scalping":
# Scalping: EMA crossover on 1-min data
df['EMA_3'] = EMAIndicator(df['Close'], window=3).ema_indicator()
df['EMA_9'] = EMAIndicator(df['Close'], window=9).ema_indicator()
df['Signal'] = (df['EMA_3'] > df['EMA_9']).astype(int)
signals = f"Scalping Signal: {'Buy' if df['Signal'].iloc[-1] else 'Sell'}"
else:
signals = "Invalid Strategy"
except Exception as e:
signals = f"Error in trading signals: {e}"
return signals
# Main function to fetch data, generate trends, and trading signals
def stock_analysis_with_trading(ticker, period="6mo", interval="1d", analysis_type="closing price trend", strategy=None):
try:
# Fetch historical stock data with enhanced error handling
stock = yf.Ticker(ticker)
# Try different methods to fetch data
try:
df = stock.history(period=period, interval=interval)
except Exception as initial_error:
# Fallback to different periods or intervals
try:
df = stock.history(period="1y", interval="1d")
except Exception as fallback_error:
return f"Error fetching data: {initial_error} | Fallback Error: {fallback_error}", None
if df is None or df.empty:
return f"No data found for ticker: {ticker}. Check ticker symbol and network connection.", None
if analysis_type.lower() == "closing price trend":
# Plot Closing Price Trend
plt.figure(figsize=(10, 6))
plt.plot(df.index, df['Close'], label='Closing Price')
plt.title(f"Closing Price Trend for {ticker}")
plt.xlabel("Date")
plt.ylabel("Closing Price (USD)")
plt.grid()
plt.legend()
plot_path = f"{ticker}_closing_price_trend.png"
plt.savefig(plot_path)
plt.close()
return f"Closing Price Analysis for {ticker}", plot_path
elif analysis_type.lower() == "forecast":
# Forecast with Prophet
forecast_df = df.reset_index()[['Date', 'Close']]
forecast_df.columns = ['ds', 'y']
model = Prophet()
model.fit(forecast_df)
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)
plt.figure(figsize=(10, 6))
model.plot(forecast)
plt.title(f"Forecasted Closing Price for {ticker}")
plt.xlabel("Date")
plt.ylabel("Price (USD)")
plot_path = f"{ticker}_forecast_trend.png"
plt.savefig(plot_path)
plt.close()
return "Forecast Generated Successfully", plot_path
elif strategy:
signals = trading_signals(df, strategy)
return signals, None
else:
return "Invalid analysis type or strategy provided.", None
except Exception as e:
return f"Comprehensive Error: {e}", None
# Gradio Interface
def chat_with_agent(ticker, period, interval, query, strategy):
response, plot_path = stock_analysis_with_trading(ticker, period, interval, query, strategy)
return response, plot_path if plot_path else None
# Define Gradio Interface
iface = gr.Interface(
fn=chat_with_agent,
inputs=[
gr.Textbox(label="Stock Ticker (e.g., AAPL, MSFT)"),
gr.Textbox(label="Time Period (e.g., 6mo, 1d)", value="6mo"),
gr.Textbox(label="Data Interval (e.g., 1d, 1h)", value="1d"),
gr.Textbox(label="Query (e.g., closing price trend, forecast)", value="closing price trend"),
gr.Textbox(label="Trading Strategy (optional)", value=""),
],
outputs=[
gr.Textbox(label="Analysis Result or Trading Signal"),
gr.Image(label="Trend or Forecast Visualization")
],
title="Stock Analysis & Trading Strategy Agent",
description="Analyze stock trends, forecast prices, and generate trading signals using technical indicators."
)
# Launch the interface
iface.launch(share=True)