|
|
| 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() |
|
|