Spaces:
Runtime error
Runtime error
Upload 8 files
Browse files- .gitattributes +5 -0
- app.py +69 -0
- models/model_bca.keras +3 -0
- models/model_bni.keras +3 -0
- models/model_bri.keras +3 -0
- models/model_bsi.keras +3 -0
- models/model_mri.keras +3 -0
- predictions.py +79 -0
- requirements.txt +6 -0
.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
|