Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| import yfinance as yf | |
| import matplotlib.pyplot as plt | |
| import pickle | |
| import io | |
| # Load pickled models | |
| with open("arima_model.pkl", "rb") as f: | |
| arima_model = pickle.load(f) | |
| with open("prophet_daily.pkl", "rb") as f: | |
| prophet_daily_model = pickle.load(f) | |
| with open("prophet_seasonal.pkl", "rb") as f: | |
| prophet_seasonal_model = pickle.load(f) | |
| def forecast_stock(ticker, model_type, days=1): | |
| # Fetch recent data for plotting | |
| df = yf.download(ticker, start="2010-01-01", interval="1d") | |
| df.columns = df.columns.get_level_values(0) | |
| df = df[['Close']].sort_index() | |
| df = df.asfreq('B').ffill() | |
| # Forecast | |
| if model_type == "ARIMA": | |
| forecast = arima_model.forecast(steps=days) | |
| elif model_type == "Prophet Daily": | |
| future = prophet_daily_model.make_future_dataframe(periods=days, freq='B') | |
| forecast_df = prophet_daily_model.predict(future) | |
| forecast = forecast_df['yhat'].iloc[-days:].values | |
| else: # Prophet Seasonal | |
| future = prophet_seasonal_model.make_future_dataframe(periods=days, freq='B') | |
| forecast_df = prophet_seasonal_model.predict(future) | |
| forecast = forecast_df['yhat'].iloc[-days:].values | |
| # Plot | |
| plt.figure(figsize=(10,5)) | |
| plt.plot(df.index[-50:], df['Close'].values[-50:], label='Recent Actual') | |
| plt.plot(pd.date_range(df.index[-1]+pd.Timedelta(days=1), periods=days, freq='B'), | |
| forecast, label='Forecast', marker='o') | |
| plt.legend() | |
| plt.title(f"{ticker} Stock Forecast ({model_type})") | |
| plot_path = "temp_plot.png" # temporary file | |
| plt.savefig(plot_path) | |
| plt.close() | |
| return plot_path | |
| # Gradio interface | |
| ticker_input = gr.Textbox(label="Ticker Symbol", value="AAPL") | |
| model_input = gr.Radio(["ARIMA", "Prophet Daily", "Prophet Seasonal"], label="Model") | |
| days_input = gr.Slider(1, 30, step=1, label="Days Ahead") | |
| gr.Interface( | |
| forecast_stock, | |
| inputs=[ticker_input, model_input, days_input], | |
| outputs=gr.Image(type="pil"), | |
| live=True, | |
| title="Stock Price Forecasting", | |
| description="Forecast next n days stock prices using ARIMA or Prophet" | |
| ).launch() | |