REST API 与 TEJ API 使用差异

TEJ API Rest API
Photo Credits: Unsplash

本文重点概要

  • 文章难度:★☆☆☆☆
  • 以两种方式捞取股价与财务资料
  • 阅读建议:本篇文章尝试找出 REST API 与 TEJ API 在资料捞取、处理上的异同,以帮助读者选择最符合自身习惯的捞取资料方式,故在阅读本文之前可以先浏览 透过TEJ API打造自己的资料库TEJ REST API 使用手册 先对两者有初步的了解

前言

TEJ 提供许多透过程式语言来去存取 TEJ 资料库的方式,像是可以使用 Python 搭配 https存取的 REST APITEJ API模组导入,或是利用 R语言的 R API,以及 NET语言的 .Net API虽然运作原理有些不同,但捞取资料的逻辑、参数的读取还是有许多类似的地方,进而方便使用者能随时转换。因此本文以先前做过介绍的REST API、TEJ API进行探讨, 看看两者串接 TEJ 资料库的差异吧 !

编辑环境及模组需求

本文使用 Windows OS 并以 Jupyter Notebook 作为编辑器

#通用功能模组
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#REST API 所需功能模组
import requests, json
#TEJ API 所需模组与参数设定(将Your Key替换成当初购买的金钥编码)
import tejapi
tejapi.ApiConfig.api_key = 'Your Key'

资料库使用

主要差异

Case1: 非完整(单页)股价资料捞取

方法A: REST API

  • 网页连结设定与读取
key = "&api_key=" + "Your Key" 
database = 'TWN/APRCD'                               
coid = "&coid=" + "2454,3034,2379"                    
date_start = "&mdate.gte=" + "2000-01-01"           
date_end = "&mdate.lte=" + "2020-12-31"         
columns = "&opts.columns="+ "coid,mdate,open_d,high_d,low_d,close_d" 
paginate = ''

key: 资料库金钥,将Your Key改成当初购买取得的金钥

database: 资料库代码,选取的是未调整股价(日)资料库

coid: 股价代码,这边选择的是 2454、3034、2379 这三家公司,若想选取所有公司,则填入空字串 coid = “”

date_start: 资料起始时间,若无限制则填入空字串 date_start = “”

date_end: 资料结束时间,若无限制则填入空字串 date_end = “”

columns: 选取栏位,栏位代码参考该资料库栏位说明,若想选取所有栏位,则填入空字串 columns = “”

paginate: 这边一律预设为空字串,之后会随著回圈做变动

url = "https://api.tej.com.tw/api/datatables/" + database + ".json?" + coid + date_start + date_end + columns + key + paginate 
rq = requests.get(url)

将上面建立的变数,附加在网页基本连结后方,中间穿插的 .json? 代表的是我们选择的资料输出格式为 json,并以 requests.get() 读取该网站,并存入 rq ,接著用json()显示内容,可以看到是以字典的方式呈现

rq.json()
  • 捞取中文栏位
column_info = rq.json()['datatable']['columns']

这边以字典取值的方式,先取得 key 为 datatable 的对应值,因为该对应值也是字典,因此进一步取得该字典 key 为 columns 的值,内容为栏位资讯

chinese_columns = [i['cname'] for i in column_info]

取得这个栏位资讯的中文栏位

  • 取得股价资料,并与中文栏位形成表格
data = rq.json()['datatable']['data']

这边则是取得第二层字典 key 为 data 的值,此即为股价资料

data_table_a = pd.DataFrame(data, columns = chinese_columns)

形成 DataFrame格式的资料,故可与方法 B的结果进行对照

因为TEJ单次取得资料限制最多10,000笔,故上述资料可能不完整

next_cursor_id = rq.json()['meta']['next_cursor_id']
print(next_cursor_id)

可以此方式确认该页资料是否为最后一页,若不是则会如同上方显示一串编码,可以把它想成下一页的连结;若印出 None则代表该页为最后一页。要注意的是每次呼叫 requests.get(),next_cursor_id都会改变,即使重新 requests.get() 读取同个网页连结,next_cursor_id也会变化

方法B: TEJ API

data_table_b = tejapi.get('TWN/APRCD',
                          coid = ['2454','3034','2379'],
                          mdate = {'gte':'2000-01-01', 'lte':'2020-12-31'},
                          opts = {'columns':['coid','mdate','open_d','high_d','low_d','close_d']},
                          chinese_column_name = True)

对照REST API的格式,可以发现两者资料的范围选取方式极为类似,而TEJ API输出的资料格式即是 DataFrame,不需要另外合并股价资料与栏位

完整程式码

返回总览页