目录
TEJ 提供许多透过程式语言来去存取 TEJ 资料库的方式,像是可以使用 Python 搭配 https存取的 REST API、TEJ 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'
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也会变化
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,不需要另外合并股价资料与栏位