目录
财务数据为公司每季公布的财务面资料,或是以此为基础的延伸出的指标。一般常见的数据主要是源自于资产负债表、损益表、现金流量表等财务报表,除此之外, TEJ API 财务资料库亦涵盖财务比率、关系人交易、存货明细等更全面的资讯,搭配著规格化的资料格式,可以更有效率地进行财务分析、基本面筛选公司或是实证研究,因此本周我们将介绍如何捞取财务资料,以及示范基本的财务数据操作。
本文章使用 Windows OS 并以 Jupyter Notebook 作为编辑器
import tejapi import pandas as pd tejapi.ApiConfig.api_key = "Your Key" tejapi.ApiConfig.ignoretz = True
注解一 : 例如想在试用资料库取得 2000 多笔资料,直接呼叫捞取的话只会取得前 1000 笔即停止。故建议捞取时习惯加入
paginate = True
以确保最后资料的完整性
注解二 : 单次呼叫
tejapi.get()
的总资料笔数上限。如果要解决这个问题,可以参考【新手上路(四)】TEJ REST API 使用手册 里的魔鬼藏在细节区块。建议当资料量庞大时,可以for
回圈进行多次呼叫,并逐圈合并每次结果
注解三 :
pivot
转置功能将使得会计科目以更清楚方式呈现,且格式上更为方便进行资料处理与分析,以下将有更详细的介绍。
Note: 举例来说,单季 Q2 仅有第二季期间的财务数据;而累计 Q2 代表的是从第一季累计到第二季的财务数据,以此类推
au_no_pivot = tejapi.get('TWN/AIM1A', coid = '2409', paginate = True, chinese_column_name = True)
以捞取友达 (2409) 所有年度的累计财务数据为例
可以看到仅有四栏,其中日期栏的 03/01 、06/01 、09/01 与 12/01 分别代表累计 Q1 、 Q2 、 Q3 与 Q4;会计科目则以代号呈现,整体而言并不太直观且不好操作。因此,我们必须加上付费财务资料库专属的 pivot
转置功能,使得会计科目以独立栏方式呈现
au_pivot = tejapi.get('TWN/AIM1A', coid = '2409', paginate = True, opts = {'pivot':True}, chinese_column_name = True)
在参数中增加 opts = {‘pivot’:True}
后,公司各季度的所有会计科目数值一目了然
panel = ['2409', '3481', '6116']
panel
列表存放的是欲捞取的公司代码,这边我们选择的是面板三雄,友达 ( 2409 )、群创 ( 3481) 与彩晶 (6116)
finance = pd.DataFrame()
首先我们建立一个空的表格,用以当作每个回圈捞取结果的容器
for firm in panel: finance = finance.append(tejapi.get('TWN/AIM1A', coid = firm, paginate = True, opts = {'pivot':True}, chinese_column_name = True))
使用 for
回圈,搭配 append()
累加每次呼叫捞取结果,而每次捞取的是一家公司的所有财务数据
可以发现三家公司捞取的资料时间就有一点久了,所以我们必须事先选取需要的会计科目,以加速整个捞取速度。为了达到以上目的,首先要查询会计科目的代码
accounting = tejapi.get('TWN/AIACC', id = 'AIM1A', paginate = True, chinese_column_name = True)
这边使用到的是财务会计科目说明档资料库,比较特别的是这边加上 id = ‘AIMIA’
,代表我们只要IFRS以合并为主简表 ( 累计 ) — 全产业 ( TWN/AIM1A ) 的会计科目
可以看到所有会计科目代码与中英文全称、表次,因此可以利用资料筛选的方式,找寻我们要的科目代码。举例来说,若想要查看折旧相关科目,可利用中文全称栏位搭配 str.contains()
来达成。
depreciation = accounting[accounting['中文全称'].str.contains('折旧')]
若找不到预期科目,可改用英文全称栏位以英文查询。如果筛选后资料笔数仍多,可利用中英文表次再进行进一步筛选,例如我们要的是现金流量表里的折旧
depreciation[depreciation['中文表次'].str.contains('现金流量')]
此时即可确认折旧的会计科目代码为 7211。如果今日我们要的是资产负债表的所有科目代码,可从中文表次栏搜寻资产负债相关的资料。
balance_sheet = accounting[accounting['中文表次'].str.contains('资产负债')]
此时显示的会计科目皆是源自于资产负债表
BS_list = balance_sheet['会计科目'].tolist()
接著针对会计科目栏,将所有值储存成一个 BS_list
列表
finance = pd.DataFrame() for firm in panel: finance = finance.append(tejapi.get('TWN/AIM1A', coid = firm, paginate = True, opts = {'pivot':True, 'columns': ['coid','mdate'] + BS_list}, chinese_column_name = True))
接著将 BS_list
列表附加到 opts
选取栏位的列表里,此时这些会计科目的栏位就会出现在公司代码与财报年月栏位之后
fin = finance.copy()
备份的目的在于避免进行资料整理时,不小心修改到原资料而需要重新捞取,尤其是当资料量一大时,重新捞取不但浪费时间,也可能会因此超过当日资料量下载上限。而备份后以 fin
备份档进行操作,若要重置成原资料内容,从这行开始重新执行即可
fin['月'] = fin['财报年月'].dt.month
首先利用 dt.month
提取出日期栏位的月份,并额外形成新的一栏
fin = fin[fin['月'] == 12]
因为是累计财务资料,所以只要选出累计 Q4 ( 12 月),即可得到年资料
fin = fin.sort_values(by = ['财报年月'], ascending = True)
利用 sort_values()
针对日期以 ascending = True
升幂方式排序
如果想要在同一日期中,进一步以资产总额由大至小 (降幂) 排序
fin = fin.sort_values(by = ['财报年月','资产总额'], ascending = [True, False])
可以看到排序后,索引整个被打乱,因此排序完通常会重置索引
fin = fin.reset_index(drop=True)
财务数据可用于评估企业的财务状况与经营成果,进而影响投资人的投资决策。因此财务数据越全面、越直观,越有利于进行量化分析,于是今日我们示范如何使用 TEJ API付费资料库的转置功能、一次捞取多家公司资料并进行简单的资料整理。若读者有兴趣,可到 E-shop 选取符合自身需求的方案,在众多财务数据中挖掘出更多有价值的资讯!