Spaces:
Runtime error
Runtime error
import gradio as gr | |
import numpy as np | |
import pandas as pd | |
import matplotlib.pyplot as plt | |
from statsmodels.tsa.seasonal import seasonal_decompose | |
from sklearn.preprocessing import MinMaxScaler | |
from keras.preprocessing.sequence import TimeseriesGenerator | |
from keras.models import Sequential | |
from keras.layers import Dense, LSTM | |
import yfinance as yf | |
# Function to execute the entire code, handling potential errors | |
def forecast_stock(ticker, period, interval): | |
try: | |
# Download data | |
df = yf.download(ticker, period=period, interval=interval) | |
df = df.asfreq('D').fillna(method='ffill') | |
# Filter columns | |
ts = df[['Close']] | |
# Perform seasonal decomposition | |
decomposition = seasonal_decompose(ts, model='additive') | |
# Train/test split | |
ts_train = ts.iloc[:int(ts.size * .8)] | |
ts_test = ts.iloc[int(ts.size * .8):] | |
# Normalize the data | |
scaler = MinMaxScaler() | |
scaler.fit(ts_train.values) | |
scaled_ts_train_values = scaler.transform(ts_train.values) | |
scaled_ts_test_values = scaler.transform(ts_test.values) | |
# Create LSTM model | |
n_input = 24 | |
n_features = 1 | |
generator = TimeseriesGenerator(scaled_ts_train_values, scaled_ts_train_values, length=n_input, batch_size=1) | |
model = Sequential() | |
model.add(LSTM(100, activation='relu', input_shape=(n_input, n_features))) | |
model.add(Dense(1)) | |
model.compile(optimizer='adam', loss='mse') | |
model.fit(generator, epochs=50, verbose=0) | |
# Make predictions | |
test_predictions = [] | |
first_eval_batch = scaled_ts_train_values[-n_input:] | |
current_batch = first_eval_batch.reshape((1, n_input, n_features)) | |
for i in range(len(ts_test)): | |
current_pred = model.predict(current_batch, verbose=0)[0] | |
test_predictions.append(current_pred) | |
current_batch = np.append(current_batch[:, 1:, :], [[current_pred]], axis=1) | |
true_predictions = scaler.inverse_transform(test_predictions) | |
# # Plot results | |
# plt.figure(figsize=(10, 6)) | |
# plt.plot(ts.index, ts.values, label='Original Data') | |
# plt.plot(ts_test.index, true_predictions, label='Forecasted Data') | |
# plt.legend() | |
# plt.xlabel('Time') | |
# plt.ylabel('Value') | |
# plt.title('Stock Price Forecast') | |
# plt.switch_backend("TkAgg") | |
# return plt.show() # Indicate successful execution | |
fig = plt.figure(figsize=(10, 6)) | |
plt.plot(ts.index, ts.values, label='Original Data') | |
plt.plot(ts_test.index, true_predictions, label='Forecasted Data') | |
plt.legend() | |
plt.xlabel('Time') | |
plt.ylabel('Value') | |
plt.title('Stock Price Forecast') | |
return fig | |
except Exception as e: | |
er=f"An error occurred: {e}" | |
return er # Indicate error | |
tickers_info=""" | |
**Ticker Examples** | |
--- | |
**Common Stocks** | |
- **AAPL:** Apple Inc. | |
- **MSFT:** Microsoft Corp. | |
- **GOOG:** Alphabet Inc. (Google) | |
- **AMZN:** Amazon.com Inc. | |
- **TSLA:** Tesla Inc. | |
- **FB:** Meta Platforms Inc. | |
**Indices** | |
- **^GSPC:** S&P 500 Index | |
- **^IXIC:** Nasdaq Composite Index | |
- **^DJI:** Dow Jones Industrial Average | |
**ETFs ️** | |
- **SPY:** SPDR S&P 500 ETF Trust | |
- **QQQ:** Invesco QQQ Trust | |
- **IWM:** iShares Russell 2000 ETF | |
""" | |
examples = """This table demonstrates examples of stock forecasts you can generate using the application: | |
| Ticker | Period | Interval | | |
|---|---|---| | |
| AAPL | 2mo | 1d | | |
| GOOG | 1y | 1d | | |
| MSFT | 5y | 1wk | | |
| TSLA | max | 1h | | |
| AMZN | 1y | 1h | | |
| NVDA | 3mo | 1d | | |
| FB | 1y | 1wk | | |
| JNJ | 2y | 1d | | |
| BAC | 6mo | 1d | | |
| XOM | 1y | 1wk | | |
To generate a forecast for a specific stock, simply enter the ticker symbol, desired period, and interval into the interface. | |
""" | |
with gr.Blocks() as demo: | |
gr.Interface( | |
forecast_stock, # Function to execute on submit | |
[ | |
gr.Textbox(label="Ticker", placeholder="e.g., AAPL, MSFT, GOOG"), | |
gr.Textbox(label="Period", placeholder="e.g., 1mo, 5y, max"), | |
gr.Textbox(label="Interval", placeholder="e.g., 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo"), | |
], | |
"plot", # Output type | |
live=False, # Disable live updates | |
title="Stock Price Forecast", | |
description="Enter a stock ticker, desired data period, and interval to generate a forecast.", | |
) | |
with gr.Accordion("Example Stock Forecasts"): | |
gr.Markdown(examples) | |
with gr.Accordion("Open for More info"): | |
gr.Markdown(tickers_info) | |
demo.launch() | |