Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| from sklearn.preprocessing import MinMaxScaler | |
| from sklearn.metrics import mean_squared_error, r2_score | |
| from tensorflow.keras.models import load_model | |
| import streamlit as st | |
| # Step 1: Load the datasets | |
| def load_data(): | |
| options_path = 'BANKNIFTY_Option.csv' | |
| futures_path = 'BANKNIFTY_Future.csv' | |
| options_data = pd.read_csv(options_path) | |
| futures_data = pd.read_csv(futures_path) | |
| return options_data, futures_data | |
| # Step 2: Preprocessing and Merging | |
| def preprocess_data(options_data, futures_data): | |
| options_data['lasttradetime'] = pd.to_datetime(options_data['lasttradetime'], unit='s') | |
| futures_data['lasttradetime'] = pd.to_datetime(futures_data['lasttradetime'], unit='s') | |
| # Merge datasets on lasttradetime | |
| merged_data = pd.merge(options_data, futures_data, on='lasttradetime', how='inner', suffixes=('_options', '_futures')) | |
| # Create new features | |
| merged_data['price_diff'] = merged_data['close_options'] - merged_data['close_futures'] | |
| merged_data['volume_ratio'] = merged_data['tradedqty'] / merged_data['volume'] | |
| merged_data['openinterest_diff'] = merged_data['openinterest_options'] - merged_data['openinterest_futures'] | |
| # Drop unnecessary columns | |
| merged_data = merged_data[['lasttradetime', 'close_options', 'price_diff', 'volume_ratio', 'openinterest_diff']] | |
| merged_data = merged_data.set_index('lasttradetime') | |
| return merged_data | |
| # Step 3: Load Pre-Trained Model and Scaler | |
| def load_trained_model_and_scaler(): | |
| model = load_model('banknifty_model.h5') | |
| scaler = np.load('scaler.npy', allow_pickle=True).item() | |
| return model, scaler | |
| # Step 4: Predict Future Prices | |
| def predict_future_prices(model, scaler, X, last_date, steps=5): | |
| last_sequence = X[-1:, :, :] | |
| future_forecast = [] | |
| future_dates = pd.date_range(start=last_date, periods=steps + 1, freq='5min')[1:] | |
| for _ in range(steps): | |
| next_pred = model.predict(last_sequence)[0, 0] | |
| future_forecast.append(next_pred) | |
| next_input = np.concatenate([last_sequence[:, 1:, :], np.array([[[next_pred, 0, 0, 0]]])], axis=1) | |
| last_sequence = next_input | |
| future_forecast_rescaled = scaler.inverse_transform( | |
| np.hstack((np.array(future_forecast).reshape(-1, 1), np.zeros((steps, X.shape[2] - 1)))) | |
| )[:, 0] | |
| return future_forecast_rescaled, future_dates | |
| # Step 5: Evaluate Model | |
| def evaluate_model(model, X_test, y_test, scaler): | |
| y_pred = model.predict(X_test) | |
| y_pred_rescaled = scaler.inverse_transform( | |
| np.hstack((y_pred, np.zeros((y_pred.shape[0], X_test.shape[2] - 1)))) | |
| )[:, 0] | |
| y_test_rescaled = scaler.inverse_transform( | |
| np.hstack((y_test.reshape(-1, 1), np.zeros((y_test.shape[0], X_test.shape[2] - 1)))) | |
| )[:, 0] | |
| mse = mean_squared_error(y_test_rescaled, y_pred_rescaled) | |
| r2 = r2_score(y_test_rescaled, y_pred_rescaled) | |
| # Calculate accuracy | |
| accuracy = 1 - (np.abs(y_test_rescaled - y_pred_rescaled).mean() / y_test_rescaled.mean()) | |
| return mse, r2, accuracy | |
| # Streamlit App | |
| def main(): | |
| st.title("Bank Nifty Options & Futures Forecasting") | |
| # Load and preprocess data | |
| options_data, futures_data = load_data() | |
| merged_data = preprocess_data(options_data, futures_data) | |
| st.write("### Merged Dataset") | |
| st.dataframe(merged_data.head(10)) | |
| # Feature Scaling | |
| model, scaler = load_trained_model_and_scaler() | |
| scaled_data = scaler.transform(merged_data) | |
| # Create Sequences | |
| time_steps = 72 | |
| X = np.array([scaled_data[i:i + time_steps] for i in range(len(scaled_data) - time_steps)]) | |
| y = scaled_data[time_steps:, 0] | |
| # Evaluate Model | |
| mse, r2, accuracy = evaluate_model(model, X, y, scaler) | |
| st.write(f"### Model Evaluation") | |
| st.write(f"Mean Squared Error (MSE): {mse:.2f}") | |
| st.write(f"R² Score: {r2:.2f}") | |
| st.write(f"Accuracy: {accuracy * 100:.2f}%") | |
| # Predict Future Prices | |
| st.write("### Predicting Future Prices...") | |
| last_date = merged_data.index[-1] | |
| steps = st.slider("Select Number of Future Steps to Predict", min_value=1, max_value=20, value=5) | |
| future_prices, future_dates = predict_future_prices(model, scaler, X, last_date, steps) | |
| st.write("### Predicted Future Prices") | |
| for date, price in zip(future_dates, future_prices): | |
| st.write(f"{date}: {price:.2f}") | |
| # Plot Results | |
| st.write("### Predicted Prices Plot") | |
| fig, ax = plt.subplots(figsize=(12, 6)) | |
| ax.plot(future_dates, future_prices, marker='o', label="Predicted Prices") | |
| ax.set_title("Future Predicted Prices") | |
| ax.set_xlabel("Date") | |
| ax.set_ylabel("Price") | |
| ax.legend() | |
| st.pyplot(fig) | |
| if __name__ == "__main__": | |
| main() | |