import yfinance as yf import pandas as pd import numpy as np import plotly.graph_objs as go from prophet import Prophet import gradio as gr # Function to fetch stock data def fetch_stock_data(ticker, start_date, end_date): stock_data = yf.download(ticker, start=start_date, end=end_date) return stock_data # Train the model using Prophet def train_prophet_model(stock_data): df = stock_data.reset_index()[['Date', 'Close']] df.columns = ['ds', 'y'] model = Prophet() model.fit(df) future = model.make_future_dataframe(periods=90) # Predict for the next 3 months forecast = model.predict(future) return forecast # Function to display stock information and prediction def predict_stock(ticker, start_date, end_date): # Fetch stock data stock_data = fetch_stock_data(ticker, start_date, end_date) # Train the model and get predictions forecast = train_prophet_model(stock_data) # Calculate metrics: % change, highest, lowest start_price = stock_data['Close'].iloc[0] current_price = stock_data['Close'].iloc[-1] percentage_change = ((current_price - start_price) / start_price) * 100 highest_price = stock_data['Close'].max() lowest_price = stock_data['Close'].min() # Buy/Sell prediction (if price is predicted to increase, suggest Buy) predicted_next_value = forecast['yhat'].iloc[-1] suggestion = "Buy" if predicted_next_value > current_price else "Sell" # Plot historical and predicted prices fig = go.Figure() fig.add_trace(go.Scatter(x=stock_data.index, y=stock_data['Close'], mode='lines', name='Historical')) fig.add_trace(go.Scatter(x=forecast['ds'], y=forecast['yhat'], mode='lines', name='Predicted')) return fig, percentage_change, highest_price, lowest_price, suggestion # Define Gradio UI components tickers = ['AAPL', 'GOOG', 'MSFT', 'AMZN', 'TSLA', 'META', 'NVDA', 'NFLX', 'BABA', 'ORCL'] start_date = gr.components.DatePicker(label="Start Date", value="2023-01-01") end_date = gr.components.DatePicker(label="End Date", value="2023-09-30") ticker_dropdown = gr.components.Dropdown(choices=tickers, label="Stock Ticker") # Gradio function to wrap the prediction def gradio_interface(ticker, start_date, end_date): fig, percentage_change, highest_price, lowest_price, suggestion = predict_stock(ticker, start_date, end_date) return fig, f"{percentage_change:.2f}%", f"{highest_price:.2f}", f"{lowest_price:.2f}", suggestion # Gradio interface and launch output = [gr.components.Plot(label="Stock Price Plot"), gr.components.Textbox(label="Percentage Change"), gr.components.Textbox(label="Highest Price"), gr.components.Textbox(label="Lowest Price"), gr.components.Textbox(label="Prediction (Buy/Sell)")] demo = gr.Interface(fn=gradio_interface, inputs=[ticker_dropdown, start_date, end_date], outputs=output, title="Stock Predictor App") demo.launch()