stockstream / app.py
mistermprah's picture
Update app.py
f6a2537 verified
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)