docchi commited on
Commit
546b08c
1 Parent(s): c261b81

Upload 8 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,8 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ models/model_bca.keras filter=lfs diff=lfs merge=lfs -text
37
+ models/model_bni.keras filter=lfs diff=lfs merge=lfs -text
38
+ models/model_bri.keras filter=lfs diff=lfs merge=lfs -text
39
+ models/model_bsi.keras filter=lfs diff=lfs merge=lfs -text
40
+ models/model_mri.keras filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Import necessary libraries
2
+ from datetime import datetime
3
+ import streamlit as st
4
+ import yfinance as yf
5
+ from predictions import feature_engineering, load_custom_model, run_inference
6
+
7
+ # Main function to run the app
8
+ def main():
9
+ st.title("Stock Prediction App")
10
+
11
+ # Define the ticker symbols
12
+ ticker_symbols = ['BCA', 'BRI', 'Mandiri', 'BNI', 'BSI']
13
+
14
+ # Create a dropdown menu for selecting a ticker symbol
15
+ selected_ticker = st.selectbox('Select a Ticker', ticker_symbols)
16
+
17
+ # Button to trigger prediction
18
+ if st.button("Predict the following bank company"):
19
+ with st.spinner('Loading...'):
20
+ # Fetch stock data for the selected ticker symbol
21
+ stock_data = fetch_stock_data(selected_ticker)
22
+
23
+ if stock_data is not None:
24
+ # Perform model inference
25
+ predicted_price = perform_inference(stock_data, selected_ticker)
26
+
27
+ # Display the predicted price
28
+ st.write(f"Predicted Close Price for {selected_ticker}: {predicted_price}")
29
+ else:
30
+ st.error("Failed to retrieve data for the selected ticker. Please try again.")
31
+
32
+ # Function to perform inference on the stock data
33
+ def perform_inference(stock_data, selected_ticker):
34
+ # Perform feature engineering
35
+ X_test = feature_engineering(stock_data)
36
+
37
+ # Load the corresponding model
38
+ model = load_custom_model(selected_ticker)
39
+
40
+ if model is not None:
41
+ # Run inference
42
+ predicted_prices = run_inference(model, X_test)
43
+ return predicted_prices[-1] # Return the last predicted price
44
+ else:
45
+ return None
46
+
47
+ # Function to fetch stock data for the selected ticker symbol
48
+ def fetch_stock_data(selected_ticker):
49
+ # Define the start date (1 year ago) and end date (today)
50
+ start_date = datetime(2023, 1, 1)
51
+ end_date = datetime.now()
52
+
53
+ # Fetch stock data based on the selected ticker symbol
54
+ if selected_ticker == 'BCA':
55
+ return yf.download('BBCA.JK', start=start_date, end=end_date)
56
+ elif selected_ticker == 'BRI':
57
+ return yf.download('BBRI.JK', start=start_date, end=end_date)
58
+ elif selected_ticker == 'Mandiri':
59
+ return yf.download('BMRI.JK', start=start_date, end=end_date)
60
+ elif selected_ticker == 'BNI':
61
+ return yf.download('BBNI.JK', start=start_date, end=end_date)
62
+ elif selected_ticker == 'BSI':
63
+ return yf.download('BRIS.JK', start=start_date, end=end_date)
64
+ else:
65
+ return None
66
+
67
+ # Run the main function
68
+ if __name__ == "__main__":
69
+ main()
models/model_bca.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b09fb494658563e2432e9dd3a0a77f86a184dc1b89d58d74885835bda116a050
3
+ size 4105007
models/model_bni.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1ceadf438fdbc73ad49fc27405629878823203df33913df1f7c05a42d55b54c8
3
+ size 4105007
models/model_bri.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ecd756f519b3118691fd77b90472a0c26f51ae86c7c4bec6e96f9d5741b352eb
3
+ size 4105007
models/model_bsi.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0e5849af3421ffc307ac2446b45fc1c13fc62a6ab9a3699f095ea38090b352fb
3
+ size 4105007
models/model_mri.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4122396e29b69f6b1a4e949dce3c7d616be4a495fe747522ffa0c9b59605500a
3
+ size 4105007
predictions.py ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from sklearn.preprocessing import MinMaxScaler
2
+ import numpy as np
3
+ import pandas as pd
4
+ from datetime import datetime, timedelta
5
+ import tensorflow as tf
6
+ from tensorflow.keras.models import load_model as tf_load_model
7
+
8
+ # Define the scaler globally
9
+ scaler = MinMaxScaler(feature_range=(0, 1))
10
+
11
+ def feature_engineering(stock_data):
12
+
13
+ # Define the end date for fetching data (yesterday's date)
14
+ end_date = datetime.now() - timedelta(days=1)
15
+
16
+ # Fetch data until yesterday's date
17
+ dataset = stock_data["Close"].loc[:end_date]
18
+ dataset = pd.DataFrame(dataset)
19
+ data = dataset.values
20
+
21
+ # 75% to Train, 25% to Test
22
+ train_size = int(len(data) * 0.85)
23
+ test_size = len(data) - train_size
24
+
25
+ train_data = data[:train_size]
26
+ test_data = data[train_size-5:]
27
+
28
+ scaled_train = scaler.fit_transform(np.array(train_data).reshape(-1, 1))
29
+ scaled_test = scaler.transform(np.array(test_data).reshape(-1, 1))
30
+
31
+ # Create dataset with 60 time steps and (59 input and only 1 output in each) as this is a regression problem
32
+ X_train = []
33
+ y_train = []
34
+
35
+ for i in range(60, len(scaled_train)):
36
+ X_train.append(scaled_train[i-5:i, 0])
37
+ y_train.append(scaled_train[i, 0])
38
+
39
+ # Convert Xs, y to arrays
40
+ X_train, y_train = np.array(X_train), np.array(y_train)
41
+
42
+ # Reshape data
43
+ X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
44
+
45
+ # Creating a testing set with 60 time-steps and 1 output
46
+ X_test = []
47
+ y_test = []
48
+
49
+ for i in range(5, len(scaled_test)):
50
+ X_test.append(scaled_test[i-5:i, 0])
51
+ y_test.append(scaled_test[i, 0])
52
+
53
+ X_test, y_test = np.array(X_test), np.array(y_test)
54
+ X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
55
+
56
+ return X_test
57
+
58
+ # Function to load a specific model
59
+ def load_custom_model(selected_model):
60
+ if selected_model == 'BCA':
61
+ model = tf_load_model('model_bca.keras')
62
+ elif selected_model == 'BNI':
63
+ model = tf_load_model('model_bni.keras')
64
+ elif selected_model == 'BRI':
65
+ model = tf_load_model('model_bri.keras')
66
+ elif selected_model == 'Mandiri':
67
+ model = tf_load_model('model_mri.keras')
68
+ else:
69
+ model = None
70
+ return model
71
+
72
+ def run_inference(model, X_test):
73
+ # Perform inference using the loaded model
74
+ predicted_prices = model.predict(X_test)
75
+
76
+ # Inverse scaling to get the actual prices
77
+ predicted_prices = scaler.inverse_transform(predicted_prices)
78
+
79
+ return predicted_prices
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ scikit-learn==1.3.2
2
+ yfinance==0.2.37
3
+ tensorflow==2.15.0
4
+ numpy==1.26.3
5
+ streamlit
6
+ seaborn