File size: 3,933 Bytes
b21a05e 965165e b21a05e ec29b9c af6ca4b b21a05e af6ca4b b6df53a 965165e 4c984de b21a05e b6df53a b21a05e a3399ca 965165e a3399ca e7033ac 59b3004 9830929 59b3004 a3399ca 59b3004 cb6b7ad 59b3004 a3399ca e2fb478 a3399ca f0d7454 2ae26f6 f0d7454 4f06acc 2ae26f6 f0d7454 2ae26f6 f0d7454 a3399ca f0d7454 7e8e2d0 7a0be88 9830929 a3399ca 37e5735 a3399ca 6311776 7a0be88 f0d7454 6311776 b21a05e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
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["time"] = data["time"]
pdf['ds'] = data["time"]
pdf['ds'] = pd.to_datetime(pdf['ds'])
pdf["open"] = data["open"]
pdf["close"] = data["close"]
pdf["high"] = data["high"]
pdf["low"] = data["low"]
pdf['y'] = data.close
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.Candlestick(x = data["time"],
open = data["open"],
high = data["high"],
low = data["low"],
close = data["close"],
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)
# ts = TS(symbol = "FPT")
# data = ts.arima()
# print(data.index.min(), data.index.max())
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)
# fig = prophet_ts(symbol=sb, periods = periods)
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)
|