|
import pandas as pd |
|
import streamlit as st |
|
from vnstock import * |
|
import seaborn as sns |
|
import matplotlib.pyplot as plt |
|
import plotly.express as px |
|
import plotly.graph_objects as go |
|
import statsmodels.api as sm |
|
from statsmodels.tsa.arima.model import ARIMA |
|
from prophet import Prophet |
|
from datetime import datetime, timedelta |
|
import pytz |
|
|
|
|
|
|
|
start_date = str((datetime.now(pytz.timezone('Asia/Ho_Chi_Minh')) - timedelta(days=365)).strftime("%Y-%m-%d")) |
|
end_date = str((datetime.now(pytz.timezone('Asia/Ho_Chi_Minh')) - timedelta(days=0)).strftime("%Y-%m-%d")) |
|
|
|
def prophet_ts(symbol, periods = 10): |
|
data = stock_historical_data(symbol=symbol, |
|
start_date=start_date, |
|
end_date=end_date, resolution='1D', type='stock') |
|
m = Prophet() |
|
pdf = pd.DataFrame() |
|
pdf['ds'] = data.index |
|
pdf['y'] = data.close.values |
|
m.fit(pdf) |
|
future = m.make_future_dataframe(periods=periods) |
|
forecast = m.predict(future) |
|
fig = go.Figure() |
|
fig.add_trace(go.Scatter(x= pdf.ds, |
|
y=pdf.y, |
|
name = f"{symbol}_true" |
|
)) |
|
fig.add_trace(go.Scatter(x= forecast.ds, |
|
y=forecast.yhat, |
|
name = f"{symbol}_pred" |
|
)) |
|
return fig |
|
class TS: |
|
def __init__(self, symbol): |
|
self.symbol = symbol |
|
def get_data(self): |
|
data = stock_historical_data(symbol=self.symbol, |
|
start_date=start_date, |
|
end_date=end_date, resolution='1D', type='stock') |
|
pdf = pd.DataFrame() |
|
pdf['ds'] = data.index |
|
pdf['ds'] = pd.to_datetime(pdf['ds']) |
|
pdf['y'] = data.close.values |
|
return pdf |
|
def prophet(self, period = 28): |
|
df = self.get_data() |
|
model = Prophet() |
|
model.fit(df) |
|
future = model.make_future_dataframe(periods=period) |
|
forecast = model.predict(future) |
|
return self.viz(df, forecast) |
|
def viz(self, data, future): |
|
fig = go.Figure() |
|
fig.add_trace(go.Scatter(x= data.ds, |
|
y=data.y, |
|
name = f"{self.symbol}" |
|
)) |
|
fig.add_trace(go.Scatter(x= future.ds, |
|
y=future.yhat, |
|
name = f"{self.symbol}_pred" |
|
)) |
|
return fig |
|
def arima(self, period = 3): |
|
df = self.get_data() |
|
df.index = df.ds |
|
model = ARIMA(df.y, order = (1, 0, 7)) |
|
model = model.fit() |
|
forecast = pd.DataFrame() |
|
predictions = model.forecast(period) |
|
forecast["yhat"] = predictions |
|
forecast["ds"] = pd.date_range(start = df.index.max() + timedelta(days = 1), end = df.index.max() + timedelta(days = period)) |
|
|
|
return self.viz(df, forecast) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
st.title("Vietnam Trading by Time Series") |
|
model = st.selectbox("model", ["Prophet", "ARIMA"]) |
|
sb = st.text_input('Symbol', 'VIC') |
|
period = st.slider('Period', 1, 365, 28) |
|
|
|
ts = TS(symbol = sb) |
|
fig = None |
|
with st.spinner('Wait for it...'): |
|
if model == "Prophet": |
|
fig = ts.prophet(period = period) |
|
elif model == "ARIMA": |
|
fig = ts.arima(period = period) |
|
st.success('Done!') |
|
st.plotly_chart(fig, use_container_width=True) |
|
|