Rahul-Crudcook's picture
Upload 6 files
23d7fd2 verified
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()