File size: 3,505 Bytes
c558b11
a1b9452
 
 
edde84b
a1b9452
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62424e6
 
a1b9452
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
import yfinance as yf
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler
import gradio as gr
import matplotlib.pyplot as plt

# Define stock tickers for the dropdown
tickers = ['AAPL', 'MSFT', 'GOOGL', 'TSLA', 'AMZN', 'FB', 'NFLX', 'NVDA', 'INTC', 'IBM']

# Function to fetch stock data and make predictions
def stock_prediction_app(ticker, start_date, end_date):
    # Fetch historical stock data from Yahoo Finance
    stock_data = yf.download(ticker, start=start_date, end=end_date)
    
    # Check if data is fetched correctly
    if stock_data.empty:
        return "No data available for the selected date range.", None
    
    # Prepare the data for LSTM model
    df_close = stock_data[['Close']]  # Use only the 'Close' column for prediction
    scaler = MinMaxScaler(feature_range=(0, 1))
    scaled_data = scaler.fit_transform(df_close)

    # Create datasets for training the LSTM model
    def create_dataset(data, time_step=60):
        X_train, y_train = [], []
        for i in range(len(data)-time_step-1):
            X_train.append(data[i:(i+time_step), 0])
            y_train.append(data[i + time_step, 0])
        return np.array(X_train), np.array(y_train)
    
    X_train, y_train = create_dataset(scaled_data)

    # Reshape the data for LSTM [samples, time steps, features]
    X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
    
    # Define LSTM model
    lstm_model = tf.keras.Sequential([
        tf.keras.layers.LSTM(50, return_sequences=True, input_shape=(60, 1)),
        tf.keras.layers.LSTM(50, return_sequences=False),
        tf.keras.layers.Dense(25),
        tf.keras.layers.Dense(1)
    ])
    
    # Compile the model
    lstm_model.compile(optimizer='adam', loss='mean_squared_error')
    
    # Train the model
    lstm_model.fit(X_train, y_train, batch_size=1, epochs=1)

    # Predict on the same data (just for demonstration)
    predictions = lstm_model.predict(X_train)
    predictions = scaler.inverse_transform(predictions)  # Convert back to original scale

    # Create a plot to show predictions
    plt.figure(figsize=(10, 5))
    plt.plot(df_close.values, label='Actual Stock Price')
    plt.plot(predictions, label='Predicted Stock Price')
    plt.title(f'{ticker} Stock Price Prediction')
    plt.xlabel('Days')
    plt.ylabel('Stock Price')
    plt.legend()
    
    # Save the plot to display in Gradio app
    plt.savefig('stock_prediction_plot.png')

    # Return a message and the path to the saved plot
    return f"Prediction complete for {ticker} from {start_date} to {end_date}", 'stock_prediction_plot.png'

# Create the Gradio UI for the app
app = gr.Blocks()

with app:
    gr.Markdown("# Stock Buy/Sell Prediction App")
    
    # Dropdown for stock tickers
    ticker = gr.Dropdown(tickers, label="Select Stock Ticker")
    
    # Textboxes for manual date input
    start_date = gr.Textbox(label="Start Date (YYYY-MM-DD)")
    end_date = gr.Textbox(label="End Date (YYYY-MM-DD)")
    
    # Button to trigger the prediction
    predict_button = gr.Button("Predict")
    
    # Output fields for text and image
    output_text = gr.Textbox(label="Prediction Result")
    output_image = gr.Image(label="Stock Price Graph")
    
    # Set up button click event to run the prediction function
    predict_button.click(fn=stock_prediction_app, inputs=[ticker, start_date, end_date], outputs=[output_text, output_image])

# Launch the Gradio app
app.launch()