import pandas as pd import pandas_datareader as data import numpy as np import plotly.graph_objects as go import streamlit as st import yfinance as yf import datetime as dt from pandas_datareader import data as pdr from keras.models import load_model from sklearn.preprocessing import MinMaxScaler from tensorflow.python import tf2 from datetime import timedelta default_ticker = 'NVDA' yf.pdr_override() st.set_page_config( page_title="Future Stock Price Prediction", initial_sidebar_state="auto", page_icon=":computer:", layout="wide", ) today = dt.date.today() def create_dataset(df, days): x = [] y = [] for i in range(days, df.shape[0]): x.append(df[i-days:i, 0]) y.append(df[i, 0]) x = np.array(x) y = np.array(y) return x,y def predict(model_file, x_data, y_data): model = load_model(model_file) predictions = model.predict(x_data) predictions = scaler.inverse_transform(predictions) y_data_scaled = scaler.inverse_transform(y_data.reshape(-1, 1)) df_y_data_scaled = pd.DataFrame(y_data_scaled, columns = ['Close']) df_predictions = pd.DataFrame(predictions, columns = ['Close']) return df_y_data_scaled, df_predictions def prediction_chart(model_file, x_data, original_y_data, predicted_y_data): chart = go.Figure() chart.add_trace(go.Scatter(x = x_data, y = original_y_data.Close, name='Price', mode='lines', marker_color='black')) chart.add_trace(go.Scatter(x = x_data, y = predicted_y_data.Close, name='Prediction', mode='lines', marker_color='red')) chart.update_layout(title='Stock Price vs Predicted Price with loaded model: ' + model_file, xaxis_title='Date', yaxis_title='Price') chart.show() st.plotly_chart(chart, use_container_width=True) def show_prediction(model_file, x_data, dataset_test, days): #Creating dataset x_test, y_test = create_dataset(dataset_test, days) x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1)) #Load model and predict original_y_data, predicted_y_data = predict(model_file, x_test, y_test) prediction_chart(model_file, x_data[days:], original_y_data, predicted_y_data) with st.sidebar: user_input = st.text_input("Ticker", default_ticker) user_date = st.date_input("Prediction start date", dt.date(2021, 1, 1)) ticker=True try: df = pdr.get_data_yahoo(user_input, start=user_date, end=today).reset_index() current_price = df['Close'].tail(1) except: ticker=False if ticker==True: st.header(current_price.iloc[0].round(2)) else: st.write("Wrong ticker. Select again") st.markdown("""---""") st.title("S&P FUTURES") spval=True try: sp = pdr.get_data_yahoo('ES=F', start=today - timedelta(7), end=today)['Close'].tail(1) except: spval=False if spval==True: st.header(sp.iloc[0].round(2)) else: st.write("Can't load right now") st.markdown("""---""") st.title("NASDAQ") nasval=True try: nas = pdr.get_data_yahoo('NQ=F', start=today - timedelta(7), end=today)['Close'].tail(1) except: nasval=False if nasval==True: st.header(nas.iloc[0].round(2)) else: st.write("Can't load right now") st.markdown("""---""") st.title("DOW") dowval=True try: dow = pdr.get_data_yahoo('YM=F', start=today - timedelta(7), end=today)['Close'].tail(1) except: dowval=False if dowval==True: st.header(dow.iloc[0].round(2)) else: st.write("Can't load right now") st.markdown("""---""") st.title("GOLD") goldval=True try: gold = pdr.get_data_yahoo('GC=F', start=today - timedelta(7), end=today)['Close'].tail(1) except: goldval=False if goldval==True: st.header(gold.iloc[0].round(2)) else: st.write("Can't load right now") st.markdown("""---""") st.title("CRUDE OIL") oilval=True try: oil = pdr.get_data_yahoo('CL=F', start=today - timedelta(7), end=today)['Close'].tail(1) except: oilval=False if oilval==True: st.header(oil.iloc[0].round(2)) else: st.write("Can't load right now") st.markdown("""---""") if ticker==True: date = df.Date close = df.Close.fillna(method='ffill') fig = go.Figure() fig.add_trace(go.Scatter(x = date, y = close, name='Price', mode='lines', marker_color='black')) ma1 = close.ewm(span=100, adjust=False).mean() fig.add_trace(go.Scatter(x = date, y = ma1, name='MA 100', mode='lines', marker_color='red')) ma2 = close.ewm(span=365, adjust=False).mean() fig.add_trace(go.Scatter(x = date, y = ma2, name='MA 365', mode='lines', marker_color='blue')) fig.update_layout(title='Stock Price vs Moving averages', xaxis_title='Date', yaxis_title='Price') fig.show() st.plotly_chart(fig, use_container_width=True) #Start prediction data_training = pd.DataFrame(close[0:int(len(close)*0.7)]) data_testing = pd.DataFrame(close[int(len(close)*0.7):int(len(close))]) x_data = date[int(len(date)*0.7):int(len(date))].reset_index(drop=True) #normalising data scaler = MinMaxScaler(feature_range=(0,1)) dataset_train = scaler.fit_transform(data_training) dataset_test = scaler.transform(data_testing) show_prediction('stock_prediction.h5', x_data, dataset_test, 50) show_prediction('stock_prediction_test.h5', x_data, dataset_test, 7) show_prediction('stock_prediction_longer_train.h5', x_data, dataset_test, 7)