File size: 3,985 Bytes
15e48a5 84cc777 c558b11 d062950 c558b11 d062950 84cc777 c558b11 84cc777 c558b11 9e7913b c558b11 84cc777 c558b11 f2f0925 c558b11 84cc777 c558b11 70363ab c558b11 f2f0925 c558b11 22f5b92 c558b11 f2f0925 c558b11 84cc777 c558b11 84cc777 c558b11 0dfdfb5 c558b11 b0bd1b7 c558b11 f2f0925 c558b11 f2f0925 c558b11 efc13b6 971d03b c558b11 84cc777 b131992 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
import numpy as np
import pandas as pd
import yfinance as yf
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
import gradio as gr
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
# Fetch historical stock data
def fetch_data(ticker, start_date, end_date):
data = yf.download(ticker, start=start_date, end=end_date)
return data
# Preprocess data
def preprocess_data(data):
# Use only the 'Close' prices for prediction
data = data[['Close']]
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)
# Prepare training data
x_train, y_train = [], []
for i in range(60, len(scaled_data)):
x_train.append(scaled_data[i-60:i, 0])
y_train.append(scaled_data[i, 0])
x_train, y_train = np.array(x_train), np.array(y_train)
# Reshape for LSTM [samples, time steps, features]
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
return x_train, y_train, scaler
# Build the LSTM model
def build_model():
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(60, 1)))
model.add(Dropout(0.2))
model.add(LSTM(units=50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(units=25))
model.add(Dense(units=1)) # Output layer for price prediction
model.compile(optimizer='adam', loss='mean_squared_error')
return model
# Train the model
def train_model(ticker, start_date, end_date):
data = fetch_data(ticker, start_date, end_date)
x_train, y_train, scaler = preprocess_data(data)
model = build_model()
model.fit(x_train, y_train, batch_size=1, epochs=1)
return model, scaler, data
# Predict the stock price for tomorrow
def predict_next_day(model, scaler, data):
last_60_days = data['Close'][-60:].values
last_60_days_scaled = scaler.transform(last_60_days.reshape(-1, 1))
x_test = []
x_test.append(last_60_days_scaled)
x_test = np.array(x_test)
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))
predicted_price = model.predict(x_test)
predicted_price = scaler.inverse_transform(predicted_price) # Convert back to original scale
return predicted_price[0][0]
# Create a graph of historical and predicted prices
def create_graph(data, predicted_price):
plt.figure(figsize=(14, 5))
plt.plot(data.index, data['Close'], label='Historical Prices', color='blue')
tomorrow = datetime.now() + timedelta(days=1)
plt.scatter(tomorrow, predicted_price, label='Predicted Price for Tomorrow', color='red')
plt.title('Stock Price Prediction')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid()
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('/mnt/data/stock_prediction_graph.png') # Save the graph
plt.close()
# Gradio Interface
def stock_prediction_app(ticker, start_date, end_date):
model, scaler, data = train_model(ticker, start_date, end_date)
predicted_price = predict_next_day(model, scaler, data)
create_graph(data, predicted_price)
return f'The predicted stock price for tomorrow is ${predicted_price:.2f}', '/mnt/data/stock_prediction_graph.png'
# Stock tickers for dropdown
stock_tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'FB', 'TSLA', 'NFLX', 'NVDA', 'INTC', 'AMD']
# Create Gradio Interface
ticker_input = gr.Dropdown(choices=stock_tickers, label="Select Stock Ticker")
start_date_input = gr.Date(label="Start Date") # Corrected date input
end_date_input = gr.Date(label="End Date") # Corrected date input
iface = gr.Interface(
fn=stock_prediction_app,
inputs=[ticker_input, start_date_input, end_date_input],
outputs=["text", "image"],
title="Stock Price Prediction App",
description="Predict tomorrow's stock price based on historical data.",
)
iface.launch() |