|
import numpy as np |
|
import pandas as pd |
|
import matplotlib.pyplot as plt |
|
from pandas_datareader import data |
|
from keras.models import load_model |
|
import streamlit as st |
|
import plotly.graph_objects as go |
|
import datetime as dt |
|
import yfinance as yf |
|
import pandas_ta as ta |
|
from plotly.subplots import make_subplots |
|
from datetime import timedelta |
|
from sklearn.preprocessing import MinMaxScaler |
|
|
|
st.set_page_config(page_title='CryptoPredict 2.0', page_icon=':chart_with_upwards_trend:') |
|
st.title('CryptoCurrency Price Prediction') |
|
|
|
|
|
stocks = [ 'BTC-USD', 'ETH-USD', 'BNB-USD', 'SOL-USD', 'ADA-USD', 'XRP-USD', 'DOT-USD', 'DOGE-USD', |
|
'AVAX-USD', 'LTC-USD', 'MATIC-USD', 'SHIB-USD'] |
|
|
|
|
|
|
|
st.markdown('#') |
|
|
|
with st.expander(""): |
|
col1, col2, col3 = st.columns([1, 1, 1]) |
|
|
|
|
|
|
|
col2.markdown("###### CRYPTO CURRENCIES") |
|
col2.markdown(""" |
|
| Cryptocurrency | Ticker Symbol | |
|
| --- | --- | |
|
| Bitcoin | BTC-USD | |
|
| Ethereum | ETH-USD | |
|
| Binance Coin | BNB-USD | |
|
| Solana | SOL-USD | |
|
| Cardano | ADA-USD | |
|
| XRP | XRP-USD | |
|
| Polkadot | DOT-USD | |
|
| Dogecoin | DOGE-USD | |
|
| Avalanche | AVAX-USD | |
|
| Litecoin | LTC-USD | |
|
| Polygon | MATIC-USD | |
|
| Shiba Inu | SHIB-USD | |
|
""") |
|
|
|
|
|
|
|
|
|
user_input = st.selectbox('Enter Stock Ticker', stocks) |
|
|
|
st.markdown('# ') |
|
|
|
st.markdown('##### Select The Date Range For Technical Analysis') |
|
|
|
START = st.date_input('START:', value=pd.to_datetime("2017-01-01")) |
|
TODAY = st.date_input('END (Today):', value=pd.to_datetime("today")) |
|
|
|
stock_info = yf.Ticker(user_input).fast_info |
|
|
|
|
|
|
|
|
|
st.subheader(user_input) |
|
|
|
|
|
def load_data(user_input): |
|
yf.pdr_override() |
|
daata = data.get_data_yahoo(user_input, start=START, end=TODAY) |
|
daata.reset_index(inplace=True) |
|
return daata |
|
|
|
|
|
df = load_data(user_input) |
|
|
|
|
|
|
|
st.subheader('Data Range 2017-Today') |
|
|
|
|
|
st.write(df.tail(10)) |
|
st.write(df.describe()) |
|
|
|
df.columns = [x.lower() for x in df.columns] |
|
|
|
|
|
|
|
st.subheader("Prediction of Stock Price") |
|
|
|
|
|
data_training = pd.DataFrame(df['close'][0:int(len(df) * 0.70)]) |
|
data_testing = pd.DataFrame(df['close'][int(len(df) * 0.70): int(len(df))]) |
|
|
|
st.write("training data: ", data_training.shape) |
|
st.write("testing data: ", data_testing.shape) |
|
|
|
|
|
|
|
|
|
scaler = MinMaxScaler(feature_range=(0, 1)) |
|
|
|
data_training_array = scaler.fit_transform(data_training) |
|
|
|
|
|
model = load_model("lstm_model_2.h5") |
|
|
|
|
|
past_100_days = data_training.tail(30) |
|
|
|
final_df = past_100_days.append(data_testing, ignore_index=True) |
|
|
|
input_data = scaler.fit_transform(final_df) |
|
|
|
x_test = [] |
|
y_test = [] |
|
|
|
for i in range(100, input_data.shape[0]): |
|
x_test.append(input_data[i - 100: i]) |
|
y_test.append(input_data[i, 0]) |
|
x_test, y_test = np.array(x_test), np.array(y_test) |
|
|
|
y_predicted = model.predict(x_test) |
|
|
|
scaler = scaler.scale_ |
|
|
|
scale_factor = 1 / scaler[0] |
|
|
|
y_predicted = y_predicted * scale_factor |
|
|
|
y_test = y_test * scale_factor |
|
|
|
|
|
|
|
st.subheader('Stock Price Prediction by Date') |
|
|
|
df1 = df.reset_index()['close'] |
|
scaler = MinMaxScaler(feature_range=(0, 1)) |
|
df1 = scaler.fit_transform(np.array(df1).reshape(-1, 1)) |
|
|
|
|
|
datemax = dt.datetime.strftime(dt.datetime.now() - timedelta(1), "%d/%m/%Y") |
|
datemax = dt.datetime.strptime(datemax, "%d/%m/%Y") |
|
x_input = df1[:].reshape(1, -1) |
|
temp_input = list(x_input) |
|
temp_input = temp_input[0].tolist() |
|
|
|
date1 = st.date_input("Enter Date in this format yyyy-mm-dd") |
|
|
|
result = st.button("Predict") |
|
|
|
if result: |
|
from datetime import datetime |
|
|
|
my_time = datetime.min.time() |
|
date1 = datetime.combine(date1, my_time) |
|
|
|
|
|
|
|
nDay = date1 - datemax |
|
nDay = nDay.days |
|
|
|
date_rng = pd.date_range(start=datemax, end=date1, freq='D') |
|
date_rng = date_rng[1:date_rng.size] |
|
lst_output = [] |
|
n_steps = x_input.shape[1] |
|
i = 0 |
|
|
|
while i <= nDay: |
|
|
|
if len(temp_input) > n_steps: |
|
|
|
x_input = np.array(temp_input[1:]) |
|
print("{} day input {}".format(i, x_input)) |
|
x_input = x_input.reshape(1, -1) |
|
x_input = x_input.reshape((1, n_steps, 1)) |
|
|
|
yhat = model.predict(x_input, verbose=0) |
|
print("{} day output {}".format(i, yhat)) |
|
temp_input.extend(yhat[0].tolist()) |
|
temp_input = temp_input[1:] |
|
|
|
lst_output.extend(yhat.tolist()) |
|
i = i + 1 |
|
else: |
|
x_input = x_input.reshape((1, n_steps, 1)) |
|
yhat = model.predict(x_input, verbose=0) |
|
print(yhat[0]) |
|
temp_input.extend(yhat[0].tolist()) |
|
print(len(temp_input)) |
|
lst_output.extend(yhat.tolist()) |
|
i = i + 1 |
|
res = scaler.inverse_transform(lst_output) |
|
|
|
|
|
output = res[nDay] |
|
|
|
st.write("*Predicted Price for Date :*", date1, "*is*", np.round(output[0], 2)) |
|
st.success('The Price is {}'.format(np.round(output[0], 2))) |
|
|
|
|
|
|
|
predictions = res[res.size - nDay:res.size] |
|
print(predictions.shape) |
|
predictions = predictions.ravel() |
|
print(type(predictions)) |
|
print(date_rng) |
|
print(predictions) |
|
print(date_rng.shape) |
|
|
|
|
|
@st.cache_data |
|
def convert_df(df): |
|
return df.to_csv().encode('utf-8') |
|
|
|
|
|
df = pd.DataFrame(data=date_rng) |
|
df['Predictions'] = predictions.tolist() |
|
df.columns = ['Date', 'Price'] |
|
st.write(df) |
|
csv = convert_df(df) |
|
st.download_button( |
|
"Press to Download", |
|
csv, |
|
"file.csv", |
|
"text/csv", |
|
key='download-csv' |
|
) |
|
|
|
|
|
fig = plt.figure(figsize=(10, 6)) |
|
xpoints = date_rng |
|
ypoints = predictions |
|
|
|
plt.plot(xpoints, ypoints, color='blue', marker='o', linestyle='-', linewidth=2, |
|
markersize=5) |
|
plt.xticks(rotation=45, fontsize=10) |
|
plt.yticks(fontsize=10) |
|
plt.xlabel('Date', fontsize=12) |
|
plt.ylabel('Price', fontsize=12) |
|
plt.title('Cryptocurrency Price Prediction', fontsize=14) |
|
plt.grid(True, linestyle='--', alpha=0.5) |
|
plt.tight_layout() |
|
|
|
|
|
st.pyplot(fig) |
|
|