| def fetch_data(ticker, start_date, end_date): | |
| # Fetch data using yfinance | |
| data = yf.download(ticker, start=start_date, end=end_date) | |
| return data | |
| def preprocess_data(data): | |
| # Select 'Close' prices for prediction | |
| prices = data['Close'].values.reshape(-1, 1) | |
| # Normalize the data | |
| from sklearn.preprocessing import MinMaxScaler | |
| scaler = MinMaxScaler(feature_range=(0, 1)) | |
| scaled_prices = scaler.fit_transform(prices) | |
| # Create dataset with features and labels | |
| x_data, y_data = [], [] | |
| for i in range(60, len(scaled_prices)): | |
| x_data.append(scaled_prices[i-60:i, 0]) | |
| y_data.append(scaled_prices[i, 0]) | |
| return np.array(x_data), np.array(y_data), scaler | |
| 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=1)) # Prediction for the next price | |
| model.compile(optimizer='adam', loss='mean_squared_error') | |
| return model | |
| def train_model(x_data, y_data): | |
| # Reshape data for LSTM | |
| x_data = np.reshape(x_data, (x_data.shape[0], x_data.shape[1], 1)) | |
| model = build_model() | |
| model.fit(x_data, y_data, epochs=50, batch_size=32) | |
| return model | |
| def make_prediction(model, data, scaler): | |
| # Prepare the last 60 days of data | |
| last_data = data['Close'].values[-60:].reshape(-1, 1) | |
| last_data_scaled = scaler.transform(last_data) | |
| x_test = [] | |
| x_test.append(last_data_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] | |
| def stock_prediction(ticker, start_date, end_date): | |
| data = fetch_data(ticker, start_date, end_date) | |
| x_data, y_data, scaler = preprocess_data(data) | |
| model = train_model(x_data, y_data) | |
| predicted_price = make_prediction(model, data, scaler) | |
| # Calculate percentage change, highest and lowest values | |
| percentage_change = ((predicted_price - data['Close'].iloc[-1]) / data['Close'].iloc[-1]) * 100 | |
| highest_price = data['Close'].max() | |
| lowest_price = data['Close'].min() | |
| # Visualization | |
| plt.figure(figsize=(14, 5)) | |
| plt.plot(data['Close'], label='Historical Prices') | |
| plt.axhline(y=predicted_price, color='r', linestyle='--', label='Predicted Price') | |
| plt.title(f'{ticker} Price Prediction') | |
| plt.xlabel('Date') | |
| plt.ylabel('Price') | |
| plt.legend() | |
| plt.show() | |
| return { | |
| 'Predicted Price': predicted_price, | |
| 'Percentage Change': percentage_change, | |
| 'Highest Price': highest_price, | |
| 'Lowest Price': lowest_price | |
| } | |
| # Gradio Interface | |
| ticker_options = ['AAPL', 'GOOGL', 'AMZN', 'MSFT', 'TSLA', 'FB', 'NFLX', 'NVDA', 'BRK.B', 'DIS'] | |
| iface = gr.Interface( | |
| fn=stock_prediction, | |
| inputs=[ | |
| gr.inputs.Dropdown(choices=ticker_options, label='Stock Ticker'), | |
| gr.inputs.Date(label='Start Date'), | |
| gr.inputs.Date(label='End Date') | |
| ], | |
| outputs='json' | |
| ) | |
| iface.launch() | |