Spaces:
Configuration error
Configuration error
import streamlit as st | |
import pandas as pd | |
import yfinance as yf | |
from ta.volatility import BollingerBands | |
from ta.trend import MACD, EMAIndicator, SMAIndicator | |
from ta.momentum import RSIIndicator | |
import datetime | |
from datetime import date | |
from sklearn.preprocessing import StandardScaler | |
from sklearn.model_selection import train_test_split | |
from sklearn.linear_model import LinearRegression | |
from sklearn.neighbors import KNeighborsRegressor | |
from xgboost import XGBRegressor | |
from sklearn.ensemble import RandomForestRegressor | |
from sklearn.ensemble import ExtraTreesRegressor | |
from sklearn.metrics import r2_score, mean_absolute_error,accuracy_score | |
st.title('Stock Price Analysis') | |
st.sidebar.info('Welcome to the Stock Price Prediction App. Choose your options below') | |
def main(): | |
option = st.sidebar.selectbox('Make a choice', ['Visualize','Recent Data', 'Predict']) | |
if option == 'Visualize': | |
tech_indicators() | |
elif option == 'Recent Data': | |
dataframe() | |
else: | |
predict() | |
def download_data(op, start_date, end_date): | |
df = yf.download(op, start=start_date, end=end_date, progress=False) | |
return df | |
option = st.sidebar.text_input('Enter a Stock Symbol', value='SPY') | |
option = option.upper() | |
today = datetime.date.today() | |
duration = st.sidebar.number_input('Enter the duration', value=3000) | |
before = today - datetime.timedelta(days=duration) | |
start_date = st.sidebar.date_input('Start Date', value=before) | |
end_date = st.sidebar.date_input('End date', today) | |
if st.sidebar.button('Send'): | |
if start_date < end_date: | |
st.sidebar.success('Start date: `%s`\n\nEnd date: `%s`' %(start_date, end_date)) | |
download_data(option, start_date, end_date) | |
else: | |
st.sidebar.error('Error: End date must fall after start date') | |
data = download_data(option, start_date, end_date) | |
scaler = StandardScaler() | |
def tech_indicators(): | |
st.header('Technical Indicators') | |
option = st.radio('Choose a Technical Indicator to Visualize', ['Close', 'BB', 'MACD', 'RSI', 'SMA', 'EMA']) | |
bb_indicator = BollingerBands(data.Close) | |
bb = data | |
bb['bb_h'] = bb_indicator.bollinger_hband() | |
bb['bb_l'] = bb_indicator.bollinger_lband() | |
bb = bb[['Close', 'bb_h', 'bb_l']] | |
macd = MACD(data.Close).macd() | |
rsi = RSIIndicator(data.Close).rsi() | |
sma = SMAIndicator(data.Close, window=14).sma_indicator() | |
ema = EMAIndicator(data.Close).ema_indicator() | |
if option == 'Close': | |
st.write('Close Price') | |
st.line_chart(data.Close) | |
elif option == 'BB': | |
st.write('BollingerBands') | |
st.line_chart(bb) | |
elif option == 'MACD': | |
st.write('Moving Average Convergence Divergence') | |
st.line_chart(macd) | |
elif option == 'RSI': | |
st.write('Relative Strength Indicator') | |
st.line_chart(rsi) | |
elif option == 'SMA': | |
st.write('Simple Moving Average') | |
st.line_chart(sma) | |
else: | |
st.write('Expoenetial Moving Average') | |
st.line_chart(ema) | |
def dataframe(): | |
st.header('Recent Data') | |
st.dataframe(data.tail(10)) | |
def predict(): | |
model = st.radio('Choose a model', ['LinearRegression', 'RandomForestRegressor', 'ExtraTreesRegressor', 'KNeighborsRegressor', 'XGBoostRegressor']) | |
num = st.number_input('How many days forecast?', value=5) | |
num = int(num) | |
if st.button('Predict'): | |
if model == 'LinearRegression': | |
engine = LinearRegression() | |
model_engine(engine, num) | |
elif model == 'RandomForestRegressor': | |
engine = RandomForestRegressor() | |
model_engine(engine, num) | |
elif model == 'ExtraTreesRegressor': | |
engine = ExtraTreesRegressor() | |
model_engine(engine, num) | |
elif model == 'KNeighborsRegressor': | |
engine = KNeighborsRegressor() | |
model_engine(engine, num) | |
else: | |
engine = XGBRegressor() | |
model_engine(engine, num) | |
def model_engine(model, num): | |
df = data[['Close']] | |
df['preds'] = data.Close.shift(-num) | |
x = df.drop(['preds'], axis=1).values | |
x = scaler.fit_transform(x) | |
x_forecast = x[-num:] | |
x = x[:-num] | |
y = df.preds.values | |
y = y[:-num] | |
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=.2, random_state=7) | |
model.fit(x_train, y_train) | |
preds = model.predict(x_test) | |
st.text(f'R2_SCORE: {r2_score(y_test, preds)} \ | |
\nMAE: {mean_absolute_error(y_test, preds)}' | |
) | |
forecast_pred = model.predict(x_forecast) | |
day = 1 | |
for i in forecast_pred: | |
st.text(f'Day {day}: {i}') | |
day += 1 | |
if __name__ == '__main__': | |
main() | |