Sonnt commited on
Commit
7067427
·
0 Parent(s):

Duplicate from Sonnt/Forex-Crypto-Prediction

Browse files
.gitattributes ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ftz filter=lfs diff=lfs merge=lfs -text
6
+ *.gz filter=lfs diff=lfs merge=lfs -text
7
+ *.h5 filter=lfs diff=lfs merge=lfs -text
8
+ *.joblib filter=lfs diff=lfs merge=lfs -text
9
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
10
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
11
+ *.model filter=lfs diff=lfs merge=lfs -text
12
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
13
+ *.npy filter=lfs diff=lfs merge=lfs -text
14
+ *.npz filter=lfs diff=lfs merge=lfs -text
15
+ *.onnx filter=lfs diff=lfs merge=lfs -text
16
+ *.ot filter=lfs diff=lfs merge=lfs -text
17
+ *.parquet filter=lfs diff=lfs merge=lfs -text
18
+ *.pb filter=lfs diff=lfs merge=lfs -text
19
+ *.pickle filter=lfs diff=lfs merge=lfs -text
20
+ *.pkl filter=lfs diff=lfs merge=lfs -text
21
+ *.pt filter=lfs diff=lfs merge=lfs -text
22
+ *.pth filter=lfs diff=lfs merge=lfs -text
23
+ *.rar filter=lfs diff=lfs merge=lfs -text
24
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
25
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
26
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
27
+ *.tflite filter=lfs diff=lfs merge=lfs -text
28
+ *.tgz filter=lfs diff=lfs merge=lfs -text
29
+ *.wasm filter=lfs diff=lfs merge=lfs -text
30
+ *.xz filter=lfs diff=lfs merge=lfs -text
31
+ *.zip filter=lfs diff=lfs merge=lfs -text
32
+ *.zst filter=lfs diff=lfs merge=lfs -text
33
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
Bitcoin Analysis Using With Forecasting LSTM,ARIMAX,SARIMAX,FbProphet,Neural Prophet,TFT Model.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
LSTM_build.h5 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f9338093101ceb351a4433d010cbc64ad742e26114109c25b9fc341d504d2fe8
3
+ size 5489056
README.md ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: BTC Prediction Using Auto Trained LSTM Based Model
3
+ emoji: 💲
4
+ colorFrom: green
5
+ colorTo: red
6
+ sdk: streamlit
7
+ sdk_version: 1.10.0
8
+ app_file: app.py
9
+ pinned: false
10
+ license: mit
11
+ duplicated_from: Sonnt/Forex-Crypto-Prediction
12
+ ---
13
+
14
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
15
+
Scheduler.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ from datetime import datetime
3
+ data = requests.get("http://worldtimeapi.org/api/timezone/Asia/Ho_Chi_Minh")
4
+ date = data.json()['datetime'].split('T')[0]
5
+ date = date[2:]
6
+ date = datetime.strptime(date, '%y-%m-%d')
7
+
8
+ # This will check if its more then 19 days for our model to get retrained
9
+ def isscheduled():
10
+ with open('prevdays.txt') as file:
11
+ previous_date = file.readline()
12
+ previous_date = previous_date.strip()
13
+ file.close()
14
+ previous_date = datetime.strptime(previous_date[2:], '%y-%m-%d')
15
+ if str(date-previous_date).split(' ')[0] >= '10':
16
+ return True
17
+ else:
18
+ return False
app.py ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import pandas as pd
3
+ from Scheduler import isscheduled
4
+ from build_model import model_builder
5
+ from sklearn.preprocessing import MinMaxScaler
6
+ import matplotlib.pyplot as plt
7
+ from tensorflow import keras
8
+ import yfinance
9
+ import requests
10
+ import streamlit as st
11
+ from datetime import datetime
12
+ import os
13
+
14
+ # Getting Current Date
15
+ st.title('Forex-Crypto Prediction ($-₿)')
16
+ crypto_symbols = ['GC=F','BTC-USD', 'ETH-USD', 'BNB-USD', 'BZ=F']
17
+ selected_crypto = st.selectbox('Select a cryptocurrency', crypto_symbols)
18
+ st.write(f"You have selected {selected_crypto}")
19
+
20
+ def main():
21
+
22
+ if 'Season' not in st.session_state:
23
+ st.session_state['Season'] = True
24
+ else:
25
+ st.session_state['Season'] = False
26
+ with open("prevdays.txt",'r') as file:
27
+ previous_date = file.readline()
28
+ file.close()
29
+ with open("isdone.txt",'r') as file:
30
+ isdone = file.readline()
31
+ file.close()
32
+ isExist = os.path.exists('LSTM_build.h5')
33
+ data = requests.get("http://worldtimeapi.org/api/timezone/Asia/Ho_Chi_Minh")
34
+ current_date = data.json()['datetime'].split('T')[0]
35
+ if isExist == False and isdone == 'Done':
36
+ with open("isdone.txt",'w') as file:
37
+ file.write("Not Done")
38
+ file.close()
39
+
40
+ with st.spinner(f'Wait for Model Updation It will Retrain Every 10th day from the retraining day which was on {previous_date} \ It Will take only 15-20 mins \ Please Wait **Do not close The window**...'):
41
+ builder = model_builder()
42
+ # We will Schedule Our APP to re build model after 10 days
43
+ with open('isdone.txt') as file:
44
+ isDone = file.readline()
45
+ file.close()
46
+
47
+
48
+ isDone = isDone.strip()
49
+ if isscheduled()==True or isExist==False and isDone != 'Done':
50
+ # Getting The data
51
+ with open('started.txt','w') as file:
52
+ file.write("True")
53
+ file.close()
54
+ X = yfinance.download(selected_crypto,start = '2016-01-01')
55
+ X = X['Close']
56
+ data = X
57
+ # Preprocessing data
58
+
59
+ X = X[:len(X)-30]
60
+ X_test = data[len(X):len(data)]
61
+ # Scaling
62
+ scaled = MinMaxScaler()
63
+ values = scaled.fit_transform(np.array(X).reshape(-1,1))
64
+ X_train = values
65
+ X_test = scaled.fit_transform(np.array(X_test).reshape(-1,1))
66
+
67
+ # Creating Time Series data to Feed To LSTM
68
+ X_train,y_train = builder.preprocess_data(X_train,10)
69
+ X_test,y_test = builder.preprocess_data(X_test,10)
70
+ X_train = X_train[...,np.newaxis]
71
+ X_test = X_test[...,np.newaxis]
72
+
73
+ model = builder.fit(X_train,y_train)
74
+ model.save('LSTM_build.h5',save_format = 'h5',overwrite = True)
75
+ with open('isdone.txt','w') as file:
76
+ file.write('Done')
77
+ file.close()
78
+ with open('prevdays.txt','w') as file:
79
+ data = requests.get("http://worldtimeapi.org/api/timezone/Asia/Ho_Chi_Minh")
80
+ date = data.json()['datetime'].split('T')[0]
81
+ file.write(date)
82
+ file.close()
83
+
84
+ if previous_date != current_date and isscheduled()==False and isExist==True:
85
+ with open('isdone.txt','w') as file:
86
+ file.write('NotDone')
87
+ file.close()
88
+ with open("started.txt",'w') as file:
89
+ file.write("False")
90
+ file.close()
91
+
92
+ model = keras.models.load_model('LSTM_build.h5')
93
+ elif previous_date == current_date and isdone == 'Done' and isExist == True:
94
+ model = keras.models.load_model('LSTM_build.h5')
95
+ elif isExist == False and isdone =='Done':
96
+ st.write("There Might Be some issues or the model is rebuilding in background please try and reload application after 5mins.")
97
+ if st.session_state['Season'] == True:
98
+ if int(current_date.split("-")[1])>=10 or int(current_date.split("-")[1])<=2:
99
+ st.snow()
100
+ st.session_state['season'] = 'Winter'
101
+ else:
102
+ st.balloons()
103
+ st.session_state['season']= 'Summer'
104
+
105
+ with open("prevdays.txt",'r') as file:
106
+ previous_date = file.readline()
107
+ file.close()
108
+ st.success(f"Model Is updated On {previous_date} and will next Update after 10 days ")
109
+
110
+ # Creating Future Outcomes
111
+ def forecast_day():
112
+ df = yfinance.download(selected_crypto,start = '2016-01-01')
113
+ df = df.reset_index()
114
+ X_future = df['Close'].shift(-2)
115
+ X_dates = df['Date'].shift(-2)
116
+ X_dates = X_dates[len(X_dates)-12:len(X_dates)]
117
+ # X_dates = X_dates[...,np.newaxis]
118
+ X_dates = np.array(X_dates)[..., np.newaxis]
119
+ X_dates = builder.preprocess_data(X_dates,10)
120
+
121
+ X_future = X_future[len(X_future)-12:len(X_future)]
122
+ scaled = MinMaxScaler()
123
+ X_future = scaled.fit_transform(np.array(X_future).reshape(-1,1))
124
+ X_future,y_future = builder.preprocess_data(X_future,10)
125
+
126
+ X_future = X_future[...,np.newaxis]
127
+ model = keras.models.load_model('LSTM_build.h5')
128
+ result = model.predict(X_future)
129
+ ans = scaled.inverse_transform(result)
130
+ if ans>df['Close'].iloc[-1]:
131
+ return 'Positive 🟢',ans
132
+ else:
133
+ return 'Negative 🔴 ',ans
134
+
135
+ def create_sample_data(df,days):
136
+ store_index = []
137
+ for day in range(days):
138
+ # Creating Temporary DataFrame
139
+ dt = df.index + pd.Timedelta(days = 1)
140
+ next_data = pd.DataFrame({'Close':[1]},index =[dt[-1]])
141
+ df = pd.concat([df,next_data])
142
+ store_index.append(dt[-1])
143
+ return df,store_index
144
+
145
+ # This function Forecast Prices For 10 Days or less.
146
+ def forecast_timeline(X,days):
147
+ if days>10:
148
+ return False
149
+ final_values = []
150
+ temp_data = X.iloc[-1]
151
+ for day in range(days):
152
+ X = X.shift(-2)
153
+ X_future = X[len(X)-12:len(X)]
154
+ X = X.dropna()
155
+ scaled = MinMaxScaler()
156
+ X_future = scaled.fit_transform(np.array(X_future).reshape(-1,1))
157
+ X_future,y_future = builder.preprocess_data(X_future,10)
158
+ model = keras.models.load_model('LSTM_build.h5')
159
+ result = model.predict(X_future)
160
+ X = X.to_list()
161
+ X.append(scaled.inverse_transform(result).reshape(1)[0])
162
+ X = pd.Series(X)
163
+ final_values.append(scaled.inverse_transform(result).reshape(1)[0])
164
+ final_values.insert(0,temp_data)
165
+ return final_values
166
+
167
+ def predict_future(days):
168
+ df = yfinance.download(selected_crypto,start = '2016-01-01')
169
+ df.reset_index(inplace = True)
170
+ X = df['Close']
171
+ future_Values = forecast_timeline(X,days)
172
+ df = df[['Close','Date']]
173
+ df.set_index('Date',inplace = True)
174
+ final_df,store_index = create_sample_data(df,days)
175
+ for i,index in enumerate(store_index):
176
+ final_df['Close'].loc[index] = future_Values[i]
177
+
178
+ return final_df,future_Values
179
+
180
+ # Output the selected option
181
+
182
+ st.write(f"HOWDY! Wonderfull ***{st.session_state['season']}*** Season. Welcome to Forex-Crypto-currency ($-₿) Price Prediction APP It will Predict Closing Price For Forex-Crypto-currency. These Predictions are based on **LSTM** Model Trained Over Historical Forex-Crypto-currency Data From **2016 till {previous_date}** . the Model retratins every 10th day, The Prediction are totally based on previous Closing Values so do not invest money based on Such Predictions. Its only for Educational Purposes and should not be used for finacial purpose.")
183
+ st.write("Why LSTM ? Because it Performed well on the data, I used LSTM,ArimaMax,SariMax,Temporal Fusion transformer,FbProphet, NeuralProphet many different time series model for predictions in which lstm performed the best so I Selected LSTM. If you want To check how we came to conclusion.")
184
+ one_day = False
185
+ days = int(st.number_input('Enter no of Days for Prediction'))
186
+ st.write("or you can Select one day prediction from below ***IMPORTANT*** After **Checkbox is Clicked** Do Not Press Submit It Will automatically Run")
187
+ if st.checkbox(label = 'One Day Prediction'):
188
+ one_day = True
189
+ if one_day == True:
190
+ days = 1
191
+ if st.button('Submit') and days<=10 and days>0:
192
+ dataframe,values = predict_future(days)
193
+ data = requests.get("http://worldtimeapi.org/api/timezone/Asia/Kolkata")
194
+ date = data.json()['datetime'].split('T')[0]
195
+ st.line_chart(data=dataframe)
196
+ for i in range(len(values)-1):
197
+ if values[i+1]>values[i]:
198
+ st.write(f'Day{i+1}:Positive Growth 🟢')
199
+ else:
200
+ st.write(f'Day{i+1}:Negative Growth 🔴')
201
+ if days == 1:
202
+ result,ans = forecast_day()
203
+ st.markdown(f"Tommorow **Bitcoin** Can Show {result} Movement.")
204
+ st.markdown(f"And Price Can Be Around : $ {ans.reshape(1)[0]}.")
205
+ elif days>10 or days<0:
206
+ st.write("Please Renter Days As you have exceeded 10 days limit or the input is too small, If you think everything is correct still it's showing wront output please check if you are entering any spaces while input or send us feedback")
207
+ if __name__ == '__main__':
208
+ main()
build_model.py ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import pandas as pd
3
+ from tensorflow import keras
4
+ from keras import Sequential
5
+ from keras.layers import Dense,Dropout,LSTM
6
+
7
+
8
+ class model_builder:
9
+ def __init__(self):
10
+ self.model = None
11
+
12
+ def preprocess_data(self,dataset,time_step):
13
+ dataX, dataY = [], []
14
+ for i in range(len(dataset)-time_step-1):
15
+ a = dataset[i:(i+time_step), 0]
16
+ dataX.append(a)
17
+ dataY.append(dataset[i + time_step, 0])
18
+ return np.array(dataX), np.array(dataY)
19
+
20
+ def create_model(self,X_train):
21
+ model = Sequential()
22
+ model.add(LSTM(150,return_sequences=True,input_shape=(X_train.shape[1],X_train.shape[2])))
23
+ model.add(Dropout(0.2))
24
+
25
+ model.add(LSTM(150,return_sequences=True))
26
+ model.add(Dropout(0.2))
27
+
28
+ model.add(LSTM(150))
29
+ model.add(Dropout(0.2))
30
+
31
+ model.add(Dense(1))
32
+ model.compile(loss='mean_squared_error' , metrics = ['mse', 'mae'],optimizer='adam')
33
+ return model
34
+
35
+ def fit(self,X_train,y_train):
36
+ model = self.create_model(X_train)
37
+ model.fit(X_train,y_train,epochs=300,batch_size=64,verbose=1)
38
+ self.model = model
39
+ return model
40
+
isdone.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ Done
prevdays.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ 2016-1-1
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ tensorflow
2
+ streamlit
3
+ yfinance
4
+ pandas
5
+ matplotlib
6
+ scikit-learn
7
+ altair==4.0.0
started.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ False