Spaces:
Sleeping
Sleeping
import streamlit as st | |
import numpy as np | |
import pandas as pd | |
import yfinance as yf | |
from datetime import datetime | |
from tensorflow.keras.models import load_model | |
from joblib import load | |
# Load the saved LSTM model and scaler | |
lstm_model = load_model('lstm_model.h5') | |
scaler = load('scaler.joblib') | |
# Dictionary of stock tickers and their full names | |
stock_dict = { | |
'GOOG': 'Alphabet Inc.', | |
'AAPL': 'Apple Inc.', | |
'TSLA': 'Tesla, Inc.', | |
'AMZN': 'Amazon.com, Inc.', | |
'MSFT': 'Microsoft Corporation' | |
} | |
# Function to get the last row of stock data | |
def get_last_stock_data(ticker): | |
try: | |
start_date = '2010-01-01' | |
end_date = datetime.now().strftime('%Y-%m-%d') | |
data = yf.download(ticker, start=start_date, end=end_date) | |
last_row = data.iloc[-1] | |
return last_row.to_dict() | |
except Exception as e: | |
return str(e) | |
# Function to make predictions | |
def predict_stock_price(ticker, open_price, close_price): | |
try: | |
start_date = '2010-01-01' | |
end_date = datetime.now().strftime('%Y-%m-%d') | |
data = yf.download(ticker, start=start_date, end=end_date) | |
# Prepare the data | |
data = data[['Close']] | |
dataset = data.values | |
scaled_data = scaler.transform(dataset) | |
# Append the user inputs as the last row in the data | |
user_input = np.array([[close_price]]) | |
user_input_scaled = scaler.transform(user_input) | |
scaled_data = np.vstack([scaled_data, user_input_scaled]) | |
# Prepare the data for LSTM | |
x_test_lstm = [] | |
for i in range(60, len(scaled_data)): | |
x_test_lstm.append(scaled_data[i-60:i]) | |
x_test_lstm = np.array(x_test_lstm) | |
x_test_lstm = np.reshape(x_test_lstm, (x_test_lstm.shape[0], x_test_lstm.shape[1], 1)) | |
# LSTM Predictions | |
lstm_predictions = lstm_model.predict(x_test_lstm) | |
lstm_predictions = scaler.inverse_transform(lstm_predictions) | |
next_day_lstm_price = lstm_predictions[-1][0] | |
result = f"Predicted future price for {ticker}: ${next_day_lstm_price:.2f}" | |
return result | |
except Exception as e: | |
return str(e) | |
# Function to predict next month's price | |
def predict_next_month_price(ticker, close_price): | |
try: | |
start_date = '2010-01-01' | |
end_date = datetime.now().strftime('%Y-%m-%d') | |
data = yf.download(ticker, start=start_date, end=end_date) | |
# Prepare the data | |
data = data[['Close']] | |
dataset = data.values | |
scaled_data = scaler.transform(dataset) | |
# Append the user inputs as the last row in the data | |
user_input = np.array([[close_price]]) | |
user_input_scaled = scaler.transform(user_input) | |
scaled_data = np.vstack([scaled_data, user_input_scaled]) | |
# Prepare the data for LSTM | |
x_test_lstm = [] | |
for i in range(60, len(scaled_data)): | |
x_test_lstm.append(scaled_data[i-60:i]) | |
x_test_lstm = np.array(x_test_lstm) | |
x_test_lstm = np.reshape(x_test_lstm, (x_test_lstm.shape[0], x_test_lstm.shape[1], 1)) | |
# Predicting the next 30 days | |
predictions = [] | |
for _ in range(30): | |
pred = lstm_model.predict(x_test_lstm[-1].reshape(1, 60, 1)) | |
predictions.append(pred[0]) | |
new_input = np.append(x_test_lstm[-1][1:], pred) | |
x_test_lstm = np.append(x_test_lstm, new_input.reshape(1, 60, 1), axis=0) | |
predictions = np.array(predictions) | |
next_month_predictions = scaler.inverse_transform(predictions) | |
next_month_price = next_month_predictions[-1][0] | |
result = f"Predicted price for {ticker} next month: ${next_month_price:.2f}" | |
return result | |
except Exception as e: | |
return str(e) | |
# Function to display historical data | |
def display_historical_data(ticker): | |
try: | |
start_date = '2010-01-01' | |
end_date = datetime.now().strftime('%Y-%m-%d') | |
data = yf.download(ticker, start=start_date, end=end_date) | |
return data.tail(30).iloc[::-1] # Reverse to have the latest date on top | |
except Exception as e: | |
return str(e) | |
# Streamlit interface | |
st.title("Stockstream") | |
# Sidebar for adding new stocks | |
st.sidebar.header("Add a New Stock Ticker") | |
new_ticker = st.sidebar.text_input("Stock Ticker", value="") | |
new_full_name = st.sidebar.text_input("Full Name", value="") | |
if st.sidebar.button("Add Stock Ticker"): | |
if new_ticker and new_full_name: | |
stock_dict[new_ticker.upper()] = new_full_name | |
# Sidebar for viewing historical trends | |
st.sidebar.header("View Historical Trends") | |
historical_ticker_input = st.sidebar.selectbox("Stock Ticker", [f"{key} - {value}" for key, value in stock_dict.items()], key="sidebar_historical_ticker") | |
if st.sidebar.button("View Historical Data"): | |
ticker = historical_ticker_input.split(' - ')[0] | |
data = display_historical_data(ticker) | |
st.sidebar.line_chart(data['Close']) | |
# Tabs for different functionalities | |
tab1, tab2, tab3 = st.tabs(["Today's Price", "Next Month's Price", "Historical Data"]) | |
with tab1: | |
st.header("Today's Price") | |
ticker_input = st.selectbox("Stock Ticker", [f"{key} - {value}" for key, value in stock_dict.items()], key="today_ticker") | |
open_price = st.number_input("Open Price", value=0.0, key="today_open_price") | |
close_price = st.number_input("Close Price", value=0.0, key="today_close_price") | |
if st.button("Predict Today's Price"): | |
ticker = ticker_input.split(' - ')[0] | |
result = predict_stock_price(ticker, open_price, close_price) | |
st.write(result) | |
with tab2: | |
st.header("Next Month's Price") | |
next_month_ticker_input = st.selectbox("Stock Ticker", [f"{key} - {value}" for key, value in stock_dict.items()], key="next_month_ticker") | |
next_month_close_price = st.number_input("Close Price", value=0.0, key="next_month_close_price") | |
if st.button("Predict Next Month's Price"): | |
ticker = next_month_ticker_input.split(' - ')[0] | |
result = predict_next_month_price(ticker, next_month_close_price) | |
st.write(result) | |
with tab3: | |
st.header("Historical Data") | |
historical_ticker_input = st.selectbox("Stock Ticker", [f"{key} - {value}" for key, value in stock_dict.items()], key="historical_ticker") | |
if st.button("View Data"): | |
ticker = historical_ticker_input.split(' - ')[0] | |
data = display_historical_data(ticker) | |
st.dataframe(data) | |