|
import streamlit as st |
|
import pandas as pd |
|
import matplotlib.pyplot as plt |
|
import yfinance as yf |
|
from TSEnsemble.ensemble import Ensemble |
|
from TSEnsemble import arima, nn, utils |
|
|
|
|
|
def get_stock_data(symbol, start_date, end_date): |
|
stock_data = yf.download(symbol, start=start_date, end=end_date) |
|
return stock_data['Close'] |
|
|
|
|
|
symbol = 'AAPL' |
|
start_date = '2020-01-01' |
|
end_date = '2023-01-01' |
|
stock_prices = get_stock_data(symbol, start_date, end_date) |
|
|
|
|
|
ar = arima.auto_arima(stock_prices, method='stepwise', season=12, max_p=3, max_q=3, max_Q=3, max_P=3, train_split=0.8, plot=False) |
|
|
|
transformer = nn.generate_transformer( |
|
look_back=12, |
|
horizon=1, |
|
n_features=1, |
|
num_transformer_blocks=4, |
|
dropout=0.25, |
|
head_size=256, |
|
num_heads=4, |
|
ff_dim=4, |
|
mlp_units=[128], |
|
mlp_dropout=0.4 |
|
) |
|
|
|
lstm = nn.generate_rnn(look_back=12, hidden_layers=1, units=64, type="LSTM", dropout=0.0) |
|
|
|
cnn = nn.generate_cnn(look_back=12, hidden_layers=3, kernel_size=2, filters=64, dilation_rate=1, dilation_mode="multiplicative") |
|
|
|
|
|
ensemble_model = Ensemble(models=[ar, cnn, lstm, transformer], regressor='wmean') |
|
|
|
|
|
ensemble_model.fit(stock_prices, train_size=0.8, look_back=12, val_size=0.2, train_models_size=0.7, epochs=20, batch_size=16, metric="rmse") |
|
|
|
|
|
ensemble_forecast = ensemble_model.forecast(stock_prices, steps=12, fig_size=(10, 6)) |
|
|
|
|
|
st.title("Stock Price Prediction App") |
|
|
|
|
|
st.subheader("Historical Stock Prices") |
|
st.line_chart(stock_prices) |
|
|
|
|
|
st.subheader("Ensemble Forecast") |
|
st.line_chart(ensemble_forecast) |
|
|
|
|
|
arima_forecast = utils.model_forecast(ar, stock_prices, steps=12) |
|
st.subheader("ARIMA Forecast") |
|
st.line_chart(arima_forecast) |