# pip install streamlit fbprophet yfinance plotly # !pip install yfinance # !pip install prophet import streamlit as st from datetime import date, datetime, timedelta import yfinance as yf from prophet import Prophet from prophet.plot import plot_plotly from plotly import graph_objs as go import pandas as pd # TODAY = date.today().strftime("%Y-%m-%d") TODAY = datetime.today() st.title('Stock Forecast') st.markdown('This app is built to predict the stock market performance') stocks = ('TSLA', 'FB', 'NVDA', 'BABA', 'GOOG', 'AAPL', 'MSFT', 'GME', 'AMZN', 'XIACF') selected_stock = st.selectbox('Select dataset for prediction', stocks) n_years = st.slider('Years of prediction:', 1, 4) period = n_years * 365 new_resolution = st.radio( "Do you want to get the higher resolution or short time interval, please choose one:", ('In 1 day', 'In 1 hour', 'In 5 minutes')) if new_resolution == 'In 5 minutes': new_interval = "5m" START = TODAY - timedelta(days=30) elif new_resolution == 'In 1 hour': new_interval = "1h" START = TODAY - timedelta(days=365) else: new_interval = "1d" START = "2018-01-01" @st.cache def load_data(ticker): data = yf.download(ticker, START, TODAY, interval = new_interval) data.reset_index(inplace=True) return data data_load_state = st.text('Loading data...') data = load_data(selected_stock) data_load_state.text('... Data loaded, well done!') @st.cache def convert_df(df): # IMPORTANT: Cache the conversion to prevent computation on every rerun return df.to_csv().encode('utf-8') csv = convert_df(data) st.download_button( label="Download data as CSV", data=csv, file_name='stock_data.csv', mime='text/csv', ) st.subheader('Raw data') st.write(data.tail()) # Plot raw data def plot_raw_data(): fig = go.Figure() fig.add_trace(go.Scatter(x=data['Date'], y=data['Open'], name="stock_open")) fig.add_trace(go.Scatter(x=data['Date'], y=data['Close'], name="stock_close")) fig.layout.update(title_text='Time Series data with Rangeslider', xaxis_rangeslider_visible=True) st.plotly_chart(fig) plot_raw_data() # Predict forecast with Prophet. df_train = data[['Date','Close']] df_train = df_train.rename(columns={"Date": "ds", "Close": "y"}) m = Prophet() m.fit(df_train) future = m.make_future_dataframe(periods=period) forecast = m.predict(future) # Show and plot forecast st.subheader('Forecast data') st.write(forecast.tail()) st.write(f'Forecast plot for {n_years} years') fig1 = plot_plotly(m, forecast) st.plotly_chart(fig1) st.write("Forecast components") fig2 = m.plot_components(forecast) st.write(fig2)