Spaces:
Sleeping
Sleeping
added download history button and some other QOL stuff
Browse files- app.py +133 -47
- model_30m.py +0 -1
app.py
CHANGED
@@ -10,16 +10,18 @@ st.set_page_config(
|
|
10 |
)
|
11 |
|
12 |
st.title('๐ฎ Gameday Model for $SPX')
|
13 |
-
st.markdown('**PLEASE NOTE:** Model should be run at or after market open. Documentation and information about model coming soon.')
|
14 |
-
|
15 |
-
if st.button("๐งน Clear All"):
|
16 |
-
st.cache_data.clear()
|
17 |
col1, col2 = st.columns(2)
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
option = st.selectbox(
|
20 |
'Select a model, then run.',
|
21 |
('', '๐ At Open', 'โ 30 Mins', 'โณ 60 Mins'))
|
22 |
-
|
23 |
if option == '':
|
24 |
st.write('Gotta pick one.')
|
25 |
|
@@ -188,23 +190,51 @@ elif option == '๐ At Open':
|
|
188 |
return 'โ'
|
189 |
else:
|
190 |
return '๐จ'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
191 |
|
192 |
perf_daily = res1.copy()
|
|
|
193 |
perf_daily['Accuracy'] = [get_acc(t, p) for t, p in zip(perf_daily['True'], perf_daily['Predicted'])]
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
208 |
|
209 |
elif option == 'โ 30 Mins':
|
210 |
if st.button('๐๐ฝโโ๏ธ Run'):
|
@@ -381,23 +411,51 @@ elif option == 'โ 30 Mins':
|
|
381 |
return 'โ'
|
382 |
else:
|
383 |
return '๐จ'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
384 |
|
385 |
perf_daily = res1.copy()
|
|
|
386 |
perf_daily['Accuracy'] = [get_acc(t, p) for t, p in zip(perf_daily['True'], perf_daily['Predicted'])]
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
|
397 |
-
|
398 |
-
|
399 |
-
|
400 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
401 |
|
402 |
elif option == 'โณ 60 Mins':
|
403 |
if st.button('๐๐ฝโโ๏ธ Run'):
|
@@ -573,20 +631,48 @@ elif option == 'โณ 60 Mins':
|
|
573 |
return 'โ'
|
574 |
else:
|
575 |
return '๐จ'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
576 |
|
577 |
perf_daily = res1.copy()
|
|
|
578 |
perf_daily['Accuracy'] = [get_acc(t, p) for t, p in zip(perf_daily['True'], perf_daily['Predicted'])]
|
579 |
-
|
580 |
-
|
581 |
-
|
582 |
-
|
583 |
-
|
584 |
-
|
585 |
-
|
586 |
-
|
587 |
-
|
588 |
-
|
589 |
-
|
590 |
-
|
591 |
-
|
592 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
)
|
11 |
|
12 |
st.title('๐ฎ Gameday Model for $SPX')
|
|
|
|
|
|
|
|
|
13 |
col1, col2 = st.columns(2)
|
14 |
+
with col1:
|
15 |
+
st.markdown('**PLEASE NOTE:** Model should be run at or after market open. Documentation on the model and its features [can be found here.](https://huggingface.co/spaces/boomsss/gamedayspx/blob/main/README.md)')
|
16 |
+
with col2:
|
17 |
+
st.caption('Clear before next run.')
|
18 |
+
if st.button("๐งน Clear All"):
|
19 |
+
st.cache_data.clear()
|
20 |
|
21 |
option = st.selectbox(
|
22 |
'Select a model, then run.',
|
23 |
('', '๐ At Open', 'โ 30 Mins', 'โณ 60 Mins'))
|
24 |
+
|
25 |
if option == '':
|
26 |
st.write('Gotta pick one.')
|
27 |
|
|
|
190 |
return 'โ'
|
191 |
else:
|
192 |
return '๐จ'
|
193 |
+
|
194 |
+
def get_acc_text(t, p):
|
195 |
+
if t == False and p <= 0.4:
|
196 |
+
return 'Correct'
|
197 |
+
elif t == True and p > 0.6:
|
198 |
+
return 'Correct'
|
199 |
+
elif t == False and p > 0.6:
|
200 |
+
return 'Incorrect'
|
201 |
+
elif t == True and p <= 0.4:
|
202 |
+
return 'Incorrect'
|
203 |
+
else:
|
204 |
+
return 'No Action'
|
205 |
|
206 |
perf_daily = res1.copy()
|
207 |
+
perf_daily['TargetDate'] = perf_daily.index + BDay(1)
|
208 |
perf_daily['Accuracy'] = [get_acc(t, p) for t, p in zip(perf_daily['True'], perf_daily['Predicted'])]
|
209 |
+
perf_daily['AccuracyText'] = [get_acc_text(t, p) for t, p in zip(perf_daily['True'], perf_daily['Predicted'])]
|
210 |
+
perf_daily['ConfidenceScore'] = [x if x > 0.6 else 1-x if x <= 0.4 else x for x in perf_daily['Predicted']]
|
211 |
+
perf_daily = perf_daily[['TargetDate','Predicted','True','Accuracy','AccuracyText','ConfidenceScore']]
|
212 |
+
|
213 |
+
def convert_df(df):
|
214 |
+
# IMPORTANT: Cache the conversion to prevent computation on every rerun
|
215 |
+
return df.to_csv()
|
216 |
+
|
217 |
+
csv = convert_df(perf_daily)
|
218 |
+
|
219 |
+
with tab1:
|
220 |
+
st.subheader(f'Pred for {curr_date} as of 6:30AM PST')
|
221 |
+
st.write(results)
|
222 |
+
st.write(df_probas)
|
223 |
+
with tab2:
|
224 |
+
st.subheader('Latest Data for Pred')
|
225 |
+
st.write(new_pred)
|
226 |
+
with tab3:
|
227 |
+
st.subheader('Historical Data')
|
228 |
+
st.write(df_final)
|
229 |
+
with tab4:
|
230 |
+
st.subheader('Performance')
|
231 |
+
st.write(df_performance)
|
232 |
+
st.write(perf_daily[['TargetDate','Predicted','True','Accuracy']])
|
233 |
+
st.download_button(
|
234 |
+
label="Download Historical Performance",
|
235 |
+
data=csv,
|
236 |
+
file_name='performance_for_at_open_model.csv',
|
237 |
+
)
|
238 |
|
239 |
elif option == 'โ 30 Mins':
|
240 |
if st.button('๐๐ฝโโ๏ธ Run'):
|
|
|
411 |
return 'โ'
|
412 |
else:
|
413 |
return '๐จ'
|
414 |
+
|
415 |
+
def get_acc_text(t, p):
|
416 |
+
if t == False and p <= 0.4:
|
417 |
+
return 'Correct'
|
418 |
+
elif t == True and p > 0.6:
|
419 |
+
return 'Correct'
|
420 |
+
elif t == False and p > 0.6:
|
421 |
+
return 'Incorrect'
|
422 |
+
elif t == True and p <= 0.4:
|
423 |
+
return 'Incorrect'
|
424 |
+
else:
|
425 |
+
return 'No Action'
|
426 |
|
427 |
perf_daily = res1.copy()
|
428 |
+
perf_daily['TargetDate'] = perf_daily.index + BDay(1)
|
429 |
perf_daily['Accuracy'] = [get_acc(t, p) for t, p in zip(perf_daily['True'], perf_daily['Predicted'])]
|
430 |
+
perf_daily['AccuracyText'] = [get_acc_text(t, p) for t, p in zip(perf_daily['True'], perf_daily['Predicted'])]
|
431 |
+
perf_daily['ConfidenceScore'] = [x if x > 0.6 else 1-x if x <= 0.4 else x for x in perf_daily['Predicted']]
|
432 |
+
perf_daily = perf_daily[['TargetDate','Predicted','True','Accuracy','AccuracyText','ConfidenceScore']]
|
433 |
+
|
434 |
+
def convert_df(df):
|
435 |
+
# IMPORTANT: Cache the conversion to prevent computation on every rerun
|
436 |
+
return df.to_csv()
|
437 |
+
|
438 |
+
csv = convert_df(perf_daily)
|
439 |
+
|
440 |
+
with tab1:
|
441 |
+
st.subheader(f'Pred for {curr_date} as of 7AM PST')
|
442 |
+
st.write(results)
|
443 |
+
st.write(df_probas)
|
444 |
+
with tab2:
|
445 |
+
st.subheader('Latest Data for Pred')
|
446 |
+
st.write(new_pred)
|
447 |
+
with tab3:
|
448 |
+
st.subheader('Historical Data')
|
449 |
+
st.write(df_final)
|
450 |
+
with tab4:
|
451 |
+
st.subheader('Performance')
|
452 |
+
st.write(df_performance)
|
453 |
+
st.write(perf_daily[['TargetDate','Predicted','True','Accuracy']])
|
454 |
+
st.download_button(
|
455 |
+
label="Download Historical Performance",
|
456 |
+
data=csv,
|
457 |
+
file_name='performance_for_30m_model.csv',
|
458 |
+
)
|
459 |
|
460 |
elif option == 'โณ 60 Mins':
|
461 |
if st.button('๐๐ฝโโ๏ธ Run'):
|
|
|
631 |
return 'โ'
|
632 |
else:
|
633 |
return '๐จ'
|
634 |
+
|
635 |
+
def get_acc_text(t, p):
|
636 |
+
if t == False and p <= 0.4:
|
637 |
+
return 'Correct'
|
638 |
+
elif t == True and p > 0.6:
|
639 |
+
return 'Correct'
|
640 |
+
elif t == False and p > 0.6:
|
641 |
+
return 'Incorrect'
|
642 |
+
elif t == True and p <= 0.4:
|
643 |
+
return 'Incorrect'
|
644 |
+
else:
|
645 |
+
return 'No Action'
|
646 |
|
647 |
perf_daily = res1.copy()
|
648 |
+
perf_daily['TargetDate'] = perf_daily.index + BDay(1)
|
649 |
perf_daily['Accuracy'] = [get_acc(t, p) for t, p in zip(perf_daily['True'], perf_daily['Predicted'])]
|
650 |
+
perf_daily['AccuracyText'] = [get_acc_text(t, p) for t, p in zip(perf_daily['True'], perf_daily['Predicted'])]
|
651 |
+
perf_daily['ConfidenceScore'] = [x if x > 0.6 else 1-x if x <= 0.4 else x for x in perf_daily['Predicted']]
|
652 |
+
perf_daily = perf_daily[['TargetDate','Predicted','True','Accuracy','AccuracyText','ConfidenceScore']]
|
653 |
+
|
654 |
+
def convert_df(df):
|
655 |
+
# IMPORTANT: Cache the conversion to prevent computation on every rerun
|
656 |
+
return df.to_csv()
|
657 |
+
|
658 |
+
csv = convert_df(perf_daily)
|
659 |
+
|
660 |
+
with tab1:
|
661 |
+
st.subheader(f'Pred for {curr_date} as of 7:30AM PST')
|
662 |
+
st.write(results)
|
663 |
+
st.write(df_probas)
|
664 |
+
with tab2:
|
665 |
+
st.subheader('Latest Data for Pred')
|
666 |
+
st.write(new_pred)
|
667 |
+
with tab3:
|
668 |
+
st.subheader('Historical Data')
|
669 |
+
st.write(df_final)
|
670 |
+
with tab4:
|
671 |
+
st.subheader('Performance')
|
672 |
+
st.write(df_performance)
|
673 |
+
st.write(perf_daily[['TargetDate','Predicted','True','Accuracy']])
|
674 |
+
st.download_button(
|
675 |
+
label="Download Historical Performance",
|
676 |
+
data=csv,
|
677 |
+
file_name='performance_for_60m_model.csv',
|
678 |
+
)
|
model_30m.py
CHANGED
@@ -305,7 +305,6 @@ def get_data():
|
|
305 |
data['CurrentHigh30toClose'] = (data['CurrentHigh30'] / data['Close']) - 1
|
306 |
data['CurrentLow30toClose'] = (data['CurrentLow30'] / data['Close']) - 1
|
307 |
data['CurrentClose30toClose'] = (data['CurrentClose30'] / data['Close']) - 1
|
308 |
-
|
309 |
data['CurrentRange30'] = (data['CurrentHigh30'] - data['CurrentLow30']) / data['Close']
|
310 |
data['GapFill30'] = [low <= prev_close if gap > 0 else high >= prev_close for high, low, prev_close, gap in zip(data['CurrentHigh30'], data['CurrentLow30'], data['Close'], data['CurrentGap'])]
|
311 |
|
|
|
305 |
data['CurrentHigh30toClose'] = (data['CurrentHigh30'] / data['Close']) - 1
|
306 |
data['CurrentLow30toClose'] = (data['CurrentLow30'] / data['Close']) - 1
|
307 |
data['CurrentClose30toClose'] = (data['CurrentClose30'] / data['Close']) - 1
|
|
|
308 |
data['CurrentRange30'] = (data['CurrentHigh30'] - data['CurrentLow30']) / data['Close']
|
309 |
data['GapFill30'] = [low <= prev_close if gap > 0 else high >= prev_close for high, low, prev_close, gap in zip(data['CurrentHigh30'], data['CurrentLow30'], data['Close'], data['CurrentGap'])]
|
310 |
|