Abhisesh7 commited on
Commit
c558b11
·
verified ·
1 Parent(s): 6c4af81

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +89 -75
app.py CHANGED
@@ -1,97 +1,111 @@
1
- import yfinance as yf
2
  import numpy as np
3
  import pandas as pd
4
- import tensorflow as tf
5
  from sklearn.preprocessing import MinMaxScaler
 
 
6
  import gradio as gr
7
  import matplotlib.pyplot as plt
 
8
 
9
- # Define stock tickers for the dropdown
10
- tickers = ['AAPL', 'MSFT', 'GOOGL', 'TSLA', 'AMZN', 'FB', 'NFLX', 'NVDA', 'INTC', 'IBM']
 
 
11
 
12
- # Function to fetch stock data and make predictions
13
- def stock_prediction_app(ticker, start_date, end_date):
14
- # Fetch historical stock data from Yahoo Finance
15
- stock_data = yf.download(ticker, start=start_date, end=end_date)
16
-
17
- # Check if data is fetched correctly
18
- if stock_data.empty:
19
- return "No data available for the selected date range.", None
20
-
21
- # Prepare the data for LSTM model
22
- df_close = stock_data[['Close']] # Use only the 'Close' column for prediction
23
  scaler = MinMaxScaler(feature_range=(0, 1))
24
- scaled_data = scaler.fit_transform(df_close)
 
 
 
 
 
 
 
25
 
26
- # Create datasets for training the LSTM model
27
- def create_dataset(data, time_step=60):
28
- X_train, y_train = [], []
29
- for i in range(len(data)-time_step-1):
30
- X_train.append(data[i:(i+time_step), 0])
31
- y_train.append(data[i + time_step, 0])
32
- return np.array(X_train), np.array(y_train)
33
 
34
- X_train, y_train = create_dataset(scaled_data)
35
 
36
- # Reshape the data for LSTM [samples, time steps, features]
37
- X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
- # Define LSTM model
40
- lstm_model = tf.keras.Sequential([
41
- tf.keras.layers.LSTM(50, return_sequences=True, input_shape=(60, 1)),
42
- tf.keras.layers.LSTM(50, return_sequences=False),
43
- tf.keras.layers.Dense(25),
44
- tf.keras.layers.Dense(1)
45
- ])
46
 
47
- # Compile the model
48
- lstm_model.compile(optimizer='adam', loss='mean_squared_error')
 
 
 
 
49
 
50
- # Train the model
51
- lstm_model.fit(X_train, y_train, batch_size=1, epochs=1)
 
 
52
 
53
- # Predict on the same data (just for demonstration)
54
- predictions = lstm_model.predict(X_train)
55
- predictions = scaler.inverse_transform(predictions) # Convert back to original scale
56
 
57
- # Create a plot to show predictions
58
- plt.figure(figsize=(10, 5))
59
- plt.plot(df_close.values, label='Actual Stock Price')
60
- plt.plot(predictions, label='Predicted Stock Price')
61
- plt.title(f'{ticker} Stock Price Prediction')
62
- plt.xlabel('Days')
63
- plt.ylabel('Stock Price')
 
 
64
  plt.legend()
65
-
66
- # Save the plot to display in Gradio app
67
- plt.savefig('stock_prediction_plot.png')
 
 
68
 
69
- # Return a message and the path to the saved plot
70
- return f"Prediction complete for {ticker} from {start_date} to {end_date}", 'stock_prediction_plot.png'
 
 
 
 
 
71
 
72
- # Create the Gradio UI for the app
73
- app = gr.Blocks()
74
 
75
- with app:
76
- gr.Markdown("# Stock Buy/Sell Prediction App")
77
-
78
- # Dropdown for stock tickers
79
- ticker = gr.Dropdown(tickers, label="Select Stock Ticker")
80
-
81
- # Textboxes for manual date input
82
- start_date = gr.Textbox(label="Start Date (YYYY-MM-DD)")
83
- end_date = gr.Textbox(label="End Date (YYYY-MM-DD)")
84
-
85
- # Button to trigger the prediction
86
- predict_button = gr.Button("Predict")
87
-
88
- # Output fields for text and image
89
- output_text = gr.Textbox(label="Prediction Result")
90
- output_image = gr.Image(label="Stock Price Graph")
91
-
92
- # Set up button click event to run the prediction function
93
- predict_button.click(fn=stock_prediction_app, inputs=[ticker, start_date, end_date], outputs=[output_text, output_image])
94
 
95
- # Launch the Gradio app
96
- app.launch()
 
 
 
 
 
97
 
 
 
 
1
  import numpy as np
2
  import pandas as pd
3
+ import yfinance as yf
4
  from sklearn.preprocessing import MinMaxScaler
5
+ from tensorflow.keras.models import Sequential
6
+ from tensorflow.keras.layers import LSTM, Dense, Dropout
7
  import gradio as gr
8
  import matplotlib.pyplot as plt
9
+ from datetime import datetime, timedelta
10
 
11
+ # Fetch historical stock data
12
+ def fetch_data(ticker, start_date, end_date):
13
+ data = yf.download(ticker, start=start_date, end=end_date)
14
+ return data
15
 
16
+ # Preprocess data
17
+ def preprocess_data(data):
18
+ # Use only the 'Close' prices for prediction
19
+ data = data[['Close']]
 
 
 
 
 
 
 
20
  scaler = MinMaxScaler(feature_range=(0, 1))
21
+ scaled_data = scaler.fit_transform(data)
22
+
23
+ # Prepare training data
24
+ x_train, y_train = [], []
25
+ for i in range(60, len(scaled_data)):
26
+ x_train.append(scaled_data[i-60:i, 0])
27
+ y_train.append(scaled_data[i, 0])
28
+ x_train, y_train = np.array(x_train), np.array(y_train)
29
 
30
+ # Reshape for LSTM [samples, time steps, features]
31
+ x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
 
 
 
 
 
32
 
33
+ return x_train, y_train, scaler
34
 
35
+ # Build the LSTM model
36
+ def build_model():
37
+ model = Sequential()
38
+ model.add(LSTM(units=50, return_sequences=True, input_shape=(60, 1)))
39
+ model.add(Dropout(0.2))
40
+ model.add(LSTM(units=50, return_sequences=False))
41
+ model.add(Dropout(0.2))
42
+ model.add(Dense(units=25))
43
+ model.add(Dense(units=1)) # Output layer for price prediction
44
+ model.compile(optimizer='adam', loss='mean_squared_error')
45
+ return model
46
+
47
+ # Train the model
48
+ def train_model(ticker, start_date, end_date):
49
+ data = fetch_data(ticker, start_date, end_date)
50
+ x_train, y_train, scaler = preprocess_data(data)
51
 
52
+ model = build_model()
53
+ model.fit(x_train, y_train, batch_size=1, epochs=1)
 
 
 
 
 
54
 
55
+ return model, scaler, data
56
+
57
+ # Predict the stock price for tomorrow
58
+ def predict_next_day(model, scaler, data):
59
+ last_60_days = data['Close'][-60:].values
60
+ last_60_days_scaled = scaler.transform(last_60_days.reshape(-1, 1))
61
 
62
+ x_test = []
63
+ x_test.append(last_60_days_scaled)
64
+ x_test = np.array(x_test)
65
+ x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))
66
 
67
+ predicted_price = model.predict(x_test)
68
+ predicted_price = scaler.inverse_transform(predicted_price) # Convert back to original scale
69
+ return predicted_price[0][0]
70
 
71
+ # Create a graph of historical and predicted prices
72
+ def create_graph(data, predicted_price):
73
+ plt.figure(figsize=(14, 5))
74
+ plt.plot(data.index, data['Close'], label='Historical Prices', color='blue')
75
+ tomorrow = datetime.now() + timedelta(days=1)
76
+ plt.scatter(tomorrow, predicted_price, label='Predicted Price for Tomorrow', color='red')
77
+ plt.title('Stock Price Prediction')
78
+ plt.xlabel('Date')
79
+ plt.ylabel('Price')
80
  plt.legend()
81
+ plt.grid()
82
+ plt.xticks(rotation=45)
83
+ plt.tight_layout()
84
+ plt.savefig('/mnt/data/stock_prediction_graph.png') # Save the graph
85
+ plt.close()
86
 
87
+ # Gradio Interface
88
+ def stock_prediction_app(ticker, start_date, end_date):
89
+ model, scaler, data = train_model(ticker, start_date, end_date)
90
+ predicted_price = predict_next_day(model, scaler, data)
91
+ create_graph(data, predicted_price)
92
+
93
+ return f'The predicted stock price for tomorrow is ${predicted_price:.2f}', '/mnt/data/stock_prediction_graph.png'
94
 
95
+ # Stock tickers for dropdown
96
+ stock_tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'FB', 'TSLA', 'NFLX', 'NVDA', 'INTC', 'AMD']
97
 
98
+ # Create Gradio Interface
99
+ ticker_input = gr.Dropdown(choices=stock_tickers, label="Select Stock Ticker")
100
+ start_date_input = gr.Date(label="Start Date")
101
+ end_date_input = gr.Date(label="End Date")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
 
103
+ iface = gr.Interface(
104
+ fn=stock_prediction_app,
105
+ inputs=[ticker_input, start_date_input, end_date_input],
106
+ outputs=["text", "image"],
107
+ title="Stock Price Prediction App",
108
+ description="Predict tomorrow's stock price based on historical data.",
109
+ )
110
 
111
+ iface.launch()