|
|
import pandas as pd |
|
|
import numpy as np |
|
|
from matplotlib import pyplot as plt |
|
|
import pandas_datareader.data as web |
|
|
import sklearn as sk |
|
|
import datetime as dt |
|
|
from datetime import date |
|
|
import yfinance as yf |
|
|
yf.pdr_override() |
|
|
from keras.models import load_model |
|
|
import streamlit as st |
|
|
|
|
|
|
|
|
st_dt1 = dt.datetime(2010,1,1) |
|
|
end_dt1 = dt.datetime(2019,12,31) |
|
|
st_dt2 = dt.datetime(2021,1,1) |
|
|
end_dt2 = date.today() |
|
|
|
|
|
st.title('Stock Trend Prediction') |
|
|
user_input = st.text_input('Enter Stock Tiker','AAPL') |
|
|
|
|
|
df_stocks1 = web.get_data_yahoo( user_input, st_dt1, end_dt1 ) |
|
|
df_stocks2 = web.get_data_yahoo(user_input, st_dt2, end_dt2 ) |
|
|
df_stocks = pd.concat([df_stocks1,df_stocks2]) |
|
|
|
|
|
df = df_stocks.reset_index() |
|
|
|
|
|
|
|
|
stk_des = "Data for "+str(user_input)+" from 2010 to 2023 exluding the Covid Year" |
|
|
st.subheader(stk_des) |
|
|
st.write(df.describe()) |
|
|
|
|
|
|
|
|
st.subheader('The Closing price vs Time Chart') |
|
|
fig = plt.figure(figsize=(12,6)) |
|
|
plt.plot(df.Close) |
|
|
st.pyplot(fig) |
|
|
|
|
|
|
|
|
st.subheader('The Closing price vs Time Chart with MA') |
|
|
ma100 = df.Close.rolling(100).mean() |
|
|
ma200 = df.Close.rolling(200).mean() |
|
|
fig = plt.figure(figsize=(12,6)) |
|
|
plt.plot(df.Close,'b',label='Original Price') |
|
|
plt.plot(ma100,'r',label='MA100') |
|
|
plt.plot(ma200,'g',label='MA200') |
|
|
plt.xlabel('Time') |
|
|
plt.ylabel('Price') |
|
|
plt.legend() |
|
|
st.pyplot(fig) |
|
|
|
|
|
|
|
|
df_train = pd.DataFrame(df['Close'][0:int(df.shape[0]*0.7)]) |
|
|
df_test = pd.DataFrame(df['Close'][int(df.shape[0]*0.7):int(df.shape[0])]) |
|
|
|
|
|
from sklearn.preprocessing import MinMaxScaler |
|
|
scaler = MinMaxScaler(feature_range=(0,1)) |
|
|
df_train_array = scaler.fit_transform(df_train) |
|
|
|
|
|
|
|
|
x_train = [] |
|
|
y_train = [] |
|
|
|
|
|
for i in range(100,df_train_array.shape[0]): |
|
|
x_train.append(df_train_array[i-100:i]) |
|
|
y_train.append(df_train_array[i,0]) |
|
|
|
|
|
x_train,y_train = np.array(x_train), np.array(y_train) |
|
|
|
|
|
model = load_model("keras_model.h5") |
|
|
|
|
|
past_100_days = df_train.tail(100) |
|
|
df_final = pd.concat([past_100_days,df_test],ignore_index=True) |
|
|
|
|
|
df_final = scaler.fit_transform(df_final) |
|
|
x_test = [] |
|
|
y_test = [] |
|
|
|
|
|
for i in range(100,(int(df_final.shape[0])+1) ): |
|
|
x_test.append(df_final[i-100:i]) |
|
|
|
|
|
|
|
|
for i in range(100,df_final.shape[0]): |
|
|
|
|
|
y_test.append(df_final[i]) |
|
|
|
|
|
x_test, y_test = np.array(x_test), np.array(y_test) |
|
|
|
|
|
y_pred = model.predict(x_test) |
|
|
|
|
|
y_pred_tmp = y_pred |
|
|
y_test_tmp = y_test |
|
|
y_pred_tmp = scaler.inverse_transform(y_pred_tmp) |
|
|
y_test_tmp = np.reshape(y_test_tmp,(-1,1)) |
|
|
y_test_tmp = scaler.inverse_transform(y_test_tmp) |
|
|
|
|
|
scaler_val = scaler.scale_ |
|
|
scale_factor = 1/scaler_val |
|
|
y_pred = y_pred*scale_factor |
|
|
y_test = y_test*scale_factor |
|
|
|
|
|
|
|
|
st.subheader("Forecasted Trends vs Original Prie") |
|
|
fig2 = plt.figure(figsize=(12,6)) |
|
|
plt.plot(y_test,'b',label='Original Price') |
|
|
plt.plot(y_pred,'r',label='Predicted Price') |
|
|
plt.xlabel('Time') |
|
|
plt.ylabel('Price') |
|
|
plt.legend() |
|
|
st.pyplot(fig2) |
|
|
|
|
|
|
|
|
last_predicted_price = round(float(y_pred_tmp[-1]),2) |
|
|
actual_closing_price = round(float(y_test_tmp[-1]),2) |
|
|
|
|
|
|
|
|
st.subheader("Predicted Upcoming Trading Day Closing Price: ") |
|
|
st.write(last_predicted_price) |
|
|
st.subheader("Last Closing Price: ") |
|
|
st.write(actual_closing_price) |