目录
在之前的教学中,我们已经学会如何创建自己的 TEJAPI 资料库,详细资料可以参考这篇文章,接下来这篇文章将用利用 TEJAPI 资料库串联 STREAMLIT 套件将资料视觉化,并利用套件中的选择日期、下拉式选单、勾选资料、数据滑杆来与资料做连动,使资料变成可以互动的 APP。
STREAMLIT 是一个在 2018 年诞生的 python 套件,它有许多内建工具提供使用者进行操作,由下方范例显示,左侧的控制台可以针对右侧dashboard进行设置,工具包含下拉式选项、滑杆…种种工具让使用者可以自由编排、调整版面,轻松完成一个小型的 APP 专案,更多工具可以参考以下网站,接下来将以实作展示如何使用 Streamlit 套件结合 TEJ API 达成视觉化应用。
连结任意门:STREAMLIT官网
本文使用 Windows 并以 VScode 作为编辑器
# STREAMLIT套件
import streamlit as st
# 可以互动的PLOT套件
import plotly.graph_objects as go
# 设置日期格式的套件
import datetime
from datetime import datetime as dt
from datetime import timedelta
import tejapi
# 登入TEJ API
tejapi.ApiConfig.api_key = "your_key"
#把时间取消保留日期 (无视)
tejapi.ApiConfig.ignoretz = True
接下来就要开始设置左侧的 sidebar 跟 小工具了,我们将会分为5个区块做说明。
使用with st.sidebar:将整个框架设置出来
with st.sidebar:
2. 第二区块 标题设置
使用st.title将标题呈现出来
st.title('TEJAPI股票学习')
3. 第三区块 日期选取工具
我们先设置左右的 “col1”、“col2” 并放在一个 columns 中,使用 with 去设置 col1 中的内容 ,在使用 st.data_input 工具将日期选取工具叫出来并设置里面的参数。
col1, col2 = st.columns(2)
with col1:
# 将股票起使日期设置为变数d1
d1 = st.date_input(
"股票起始日期",
# 并将预设资料设定为2022年的1/1
datetime.date(2022, 1, 1))
with col2:
# 将股票起使日期设置为变数d2
d2= st.date_input(
"股票结束日期",
datetime.date(2023, 2, 3))
4. 第四区块 下拉式选项
接著设置下拉式选项,并让它可以呈现所有股票的代码,本次使用的资料库为交易资料-股价资料,锁定资料库后并利用 date 套件将我们要捞取的 TEJAPI 资料内建的 “mdate” 日期指定在昨天,并使用 “opts” 参数,将资料的栏位设定为股票代码,再将股票代码那一栏的资料转换成 list 资料并放入st.selectboc 中,使所有股票代码成为下拉式选项中的选项。再来将选取到的股票资料设定为 “stock_code” 变数。
#输入股价
# 使用date套件的date获取今天日期资料
current_date = dt.now().date()
# 使用date套件的timedelta获取昨天的日期资料
previous_date = current_date - timedelta(days=1)
data = tejapi.get('TWN/APIPRCD',
mdate=previous_date,
opts={'columns':['coid']},
paginate=True)
coids = data['coid'].tolist()
stock_code = st.selectbox('选择股票代码', data)
st.write('你选择股票是: ', stock_code)
再将刚刚设定的 “d1”、“d2”、“stock_code” 放到我们筛选 TEJAPI 股票资料的变数中,下面介绍到右边的股票图表时就会用到这笔新的资料了。
stock_id = {stock_code}
gte, lte = {d1}, {d2}
tejdata= tejapi.get('TWN/APIPRCD',
paginate = True,
coid = stock_id,
mdate = {'gte':gte, 'lte':lte},
chinese_column_name=True
)
df = tejdata
df.reset_index(drop=True, inplace=True)
5. 第五区块 checkbox 以及 slider 进度条
这边将 st.checkbox 设定为变数 EMA1_checked,这个变数将会连动到图表上面的 EMA 短线的开关,在下方右图图表呈现那块会说明到。slider 的部分使用将 EMA 参数设置为 1~31 并将预设的参数设定为 7。
# 预设选取 checkbox,并将结果储存到变数 is_checked 中
EMA1_checked = st.checkbox("发散指标(EMA1)(短线)", value=True,key="EMA1")
# Add a slider to the sidebar:
slider1 = st.sidebar.slider(
'设置EMA1参数',
1, 31, 7
)
EMA2_checked = st.checkbox("发散指标(EMA2)(长线)", value=True,key='EMA2')
# Add a slider to the sidebar:
slider2 = st.sidebar.slider(
'设置EMA2参数',
1, 31, 21
)
接下来我们将介绍 APP 的右半部分,图表以及资料库的呈现。这次分为三大区块去进行说明。
1. 第一区块 标题设置
这边 st.title 可以设置 title ,同时使用 write 将设置空一行
st.title('🌐STREAMLIT股票资料EMA应用')
st.write("")
2. 第二区块 图表呈现、EMA 计算
这里首先要使用 plotly.graph_objects 这个套件将整个图表的框架框出,使呈现的图表可以设定缩放功能。
df[‘EMA1’] 的部分就是将左边 slider 进度条的数值输入 EMA 计算中,并使用 IF 判断式 来设定断触发条件,当左边的进度条被选取时, EMA (短线) 的走势曲线就会呈现出来,同理我们可以将此应用用到 EMA (长线) 的走势曲线中,最后加上标题以及 X、Y 轴名称。
fig = go.Figure()
# 根据 slider 的值来计算 EMA,并加入到图表中
df['EMA1'] = df['收盘价'].ewm(span=slider1, adjust=False).mean()
df['EMA2'] = df['收盘价'].ewm(span=slider2, adjust=False).mean()
# 如果 checkbox 被选取,则画出 EMA1 的线
if EMA1_checked:
fig.add_trace(go.Scatter(x=df['资料日'], y=df['EMA1'],
mode='lines',
name=f'EMA{slider1}'))
if EMA2_checked:
fig.add_trace(go.Scatter(x=df['资料日'], y=df['EMA2'],
mode='lines',
name=f'EMA{slider2}'))
fig.add_trace(go.Scatter(x=df['资料日'], y=df['收盘价'],
mode='lines',
name='收盘价'))
fig.update_layout(
title=f"{stock_code} 股票价格走势图",
xaxis_title="股票时间",
yaxis_title="股票价格",
legend_title="指标",
autosize=True
)
st.plotly_chart(fig, use_container_width=True)
3. 第三区块 下拉式分页、资料库的呈现
我们可以使用下拉式选单 st.expander 使资料表收合、设置函式将资料表转换成 csv 档、利用 st.download_button 下载档案。
with st.expander("🌐点此查看股票资料"):
st.dataframe(df, height=500)
@st.cache_data
def convert_df(df):
# IMPORTANT: Cache the conversion to prevent computation on every rerun
return df.to_csv().encode("utf-8")
csv = convert_df(df)
st.download_button(
label="点此下载资料范例",
data=csv,
file_name="股价资料.csv",
mime="text/csv",
)
设定完成后,我们可以借由终端机来启动 STREAMLIT 专案,透过在终端机输入 streamlit run app.py 即可执行。
streamlit run app.py
本次实作使用 STREAMLIT 套件,让 TEJAPI 的资料库能够以互动式 APP 的方式呈现数据,增进与使用者的互动。读者在实作时也可以去 STREAMLIT 的官网中找取其他小工具加入自己的程式中。此外 ,TEJ API 提供广泛的台湾企业和金融市场相关资料,包括财务、股票、基金、宏观经济、产业等领域,并提供专业报告和研究,帮助公司研究、投资决策和市场预测。
温馨提醒,本次介绍与标的仅供参考,不代表任何商品或投资上的建议。之后也会介绍使用 TEJ 资料库来建构各式选择权模型,所以欢迎对选择权交易有兴趣的读者,选购 TEJ E-Shop 的相关方案,用高品质的资料库,建构出适合自己的订价模型。
电子报订阅