TEJ API 遇上STREAMLIT App

Photo by Carlos Muza on Unsplash

前言

在之前的教学中,我们已经学会如何创建自己的 TEJAPI 资料库,详细资料可以参考这篇文章,接下来这篇文章将用利用 TEJAPI 资料库串联 STREAMLIT 套件将资料视觉化,并利用套件中的选择日期、下拉式选单、勾选资料、数据滑杆来与资料做连动,使资料变成可以互动的 APP。

本文重点概要

  • 文章难度:★★☆☆☆
  • STREAMLIT APP 视觉化应用

STREAMLIT 简介

STREAMLIT 是一个在 2018 年诞生的 python 套件,它有许多内建工具提供使用者进行操作,由下方范例显示,左侧的控制台可以针对右侧dashboard进行设置,工具包含下拉式选项、滑杆…种种工具让使用者可以自由编排、调整版面,轻松完成一个小型的 APP 专案,更多工具可以参考以下网站,接下来将以实作展示如何使用 Streamlit 套件结合 TEJ API 达成视觉化应用。

连结任意门:STREAMLIT官网

STREAMLIT APP范例画面
STREAMLIT APP范例画面

套件导入

本文使用 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 与 小工具设置

接下来就要开始设置左侧的 sidebar 跟 小工具了,我们将会分为5个区块做说明。

sidebar说明图示
sidebar说明图示
  1. 第一区块 sidebar版面

使用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 进度条

checkbox、slider进度条应用
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
)

右侧图表呈现与EMA参数设置

接下来我们将介绍 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. 第三区块 下拉式分页、资料库的呈现

expander、资料表呈现
expander、资料表呈现

我们可以使用下拉式选单 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 专案,透过在终端机输入 streamlit run app.py 即可执行。

streamlit run app.py

结语

本次实作使用 STREAMLIT 套件,让 TEJAPI 的资料库能够以互动式 APP 的方式呈现数据,增进与使用者的互动。读者在实作时也可以去 STREAMLIT 的官网中找取其他小工具加入自己的程式中。此外 ,TEJ API 提供广泛的台湾企业和金融市场相关资料,包括财务、股票、基金、宏观经济、产业等领域,并提供专业报告和研究,帮助公司研究、投资决策和市场预测。

温馨提醒,本次介绍与标的仅供参考,不代表任何商品或投资上的建议。之后也会介绍使用 TEJ 资料库来建构各式选择权模型,所以欢迎对选择权交易有兴趣的读者,选购 TEJ E-Shop 的相关方案,用高品质的资料库,建构出适合自己的订价模型。

完整程式码

延伸阅读

相关连结

返回总览页