File size: 3,880 Bytes
0dfdfb5
b0bd1b7
22f5b92
0dfdfb5
22f5b92
 
 
9e7913b
22f5b92
 
 
 
b0bd1b7
22f5b92
 
 
 
 
 
 
 
 
 
b0bd1b7
22f5b92
 
 
 
 
 
 
b0bd1b7
22f5b92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70363ab
22f5b92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70363ab
22f5b92
 
 
 
70363ab
22f5b92
 
 
 
 
 
 
 
 
 
 
 
0dfdfb5
22f5b92
0dfdfb5
22f5b92
 
b0bd1b7
22f5b92
 
 
 
b0bd1b7
22f5b92
 
 
b0bd1b7
22f5b92
 
 
 
 
 
971d03b
22f5b92
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
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

# Fetch stock data using yfinance
def get_stock_data(ticker, start_date, end_date):
    stock_data = yf.download(ticker, start=start_date, end=end_date)
    return stock_data

# Example usage:
ticker = 'AAPL'
start_date = '2022-01-01'
end_date = '2023-01-01'
stock_data = get_stock_data(ticker, start_date, end_date)
print(stock_data.head())
def preprocess_data(data):
    scaler = MinMaxScaler(feature_range=(0, 1))
    scaled_data = scaler.fit_transform(data[['Close']].values)
    return scaled_data, scaler

# Preprocess stock data
scaled_data, scaler = preprocess_data(stock_data)
def create_lstm_model(input_shape):
    model = Sequential()
    model.add(LSTM(units=50, return_sequences=True, input_shape=input_shape))
    model.add(LSTM(units=50))
    model.add(Dense(units=1))  # Predict the stock price
    model.compile(optimizer='adam', loss='mean_squared_error')
    return model

# Train the LSTM model
def train_model(stock_data, window_size=60):
    X_train, y_train = [], []
    for i in range(window_size, len(stock_data)):
        X_train.append(stock_data[i-window_size:i, 0])
        y_train.append(stock_data[i, 0])
    X_train, y_train = np.array(X_train), np.array(y_train)
    X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
    
    model = create_lstm_model((X_train.shape[1], 1))
    model.fit(X_train, y_train, epochs=5, batch_size=32)
    
    return model

# Train and prepare the model
model = train_model(scaled_data)
def make_prediction(model, scaler, stock_data, last_data, prediction_days=90):
    # Prepare last data for prediction
    input_data = last_data[-60:].reshape(1, 60, 1)
    predicted_prices = []
    
    for _ in range(prediction_days):
        predicted_price = model.predict(input_data)
        predicted_prices.append(predicted_price[0, 0])
        input_data = np.append(input_data[:, 1:], [[predicted_price]], axis=1)
    
    # Rescale to original prices
    predicted_prices = scaler.inverse_transform(np.array(predicted_prices).reshape(-1, 1))
    return predicted_prices

# Predict future prices
last_data = scaled_data[-60:]  # Last 60 days data
future_prices = make_prediction(model, scaler, scaled_data, last_data)
import gradio as gr

def predict_stock(ticker, start_date, end_date):
    stock_data = get_stock_data(ticker, start_date, end_date)
    scaled_data, scaler = preprocess_data(stock_data)
    model = train_model(scaled_data)
    future_prices = make_prediction(model, scaler, scaled_data, scaled_data[-60:])
    
    # Generate a plot of historical and future prices
    plt.figure(figsize=(14,5))
    plt.plot(stock_data['Close'], label='Historical Prices')
    future_dates = pd.date_range(end=end_date, periods=90, freq='B')
    plt.plot(future_dates, future_prices, label='Predicted Prices', linestyle='--')
    plt.title(f"Stock Prices for {ticker}")
    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.legend()
    plt.savefig('stock_plot.png')
    return future_prices, 'stock_plot.png'

# Define UI components
tickers = ['AAPL', 'MSFT', 'GOOGL', 'TSLA', 'AMZN', 'FB', 'NFLX', 'NVDA', 'INTC', 'IBM']
with gr.Blocks() as app:
    gr.Markdown("## Stock Buy/Sell Prediction App")
    
    ticker = gr.Dropdown(tickers, label="Stock Ticker")
    start_date = gr.Date(label="Start Date")
    end_date = gr.Date(label="End Date")
    
    predict_btn = gr.Button("Predict")
    
    predicted_values = gr.Textbox(label="Predicted Stock Values")
    stock_plot = gr.Image(label="Stock Performance Graph")
    
    predict_btn.click(fn=predict_stock, inputs=[ticker, start_date, end_date], outputs=[predicted_values, stock_plot])

app.launch()