财务数据捞取

财务数据捞取
Photo Credits: Unsplash

前言

财务数据为公司每季公布的财务面资料,或是以此为基础的延伸出的指标。一般常见的数据主要是源自于资产负债表、损益表、现金流量表等财务报表,除此之外, TEJ API 财务资料库亦涵盖财务比率、关系人交易、存货明细等更全面的资讯,搭配著规格化的资料格式,可以更有效率地进行财务分析、基本面筛选公司或是实证研究,因此本周我们将介绍如何捞取财务资料,以及示范基本的财务数据操作。

编辑环境及模组需求

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

import tejapi
import pandas as pd
tejapi.ApiConfig.api_key = "Your Key"
tejapi.ApiConfig.ignoretz = True

本文重点概要

  • 示范不同情境下的捞取流程
  • 常用的财务数据操作

试用资料库 vs. 付费资料库

注解一 : 例如想在试用资料库取得 2000 多笔资料,直接呼叫捞取的话只会取得前 1000 笔即停止。故建议捞取时习惯加入 paginate = True 以确保最后资料的完整性

注解二 : 单次呼叫 tejapi.get() 的总资料笔数上限。如果要解决这个问题,可以参考【新手上路(四)】TEJ REST API 使用手册 里的魔鬼藏在细节区块。建议当资料量庞大时,可以 for 回圈进行多次呼叫,并逐圈合并每次结果

注解三 : pivot转置功能将使得会计科目以更清楚方式呈现,且格式上更为方便进行资料处理与分析,以下将有更详细的介绍。

付费资料库使用

Note: 举例来说,单季 Q2 仅有第二季期间的财务数据;而累计 Q2 代表的是从第一季累计到第二季的财务数据,以此类推

Case 1: 取得单一公司的所有财务数据

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} 后,公司各季度的所有会计科目数值一目了然

Case 2: 取得多家公司的特定财务数据

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 选取符合自身需求的方案,在众多财务数据中挖掘出更多有价值的资讯!

完整程式码

延伸阅读

相关连结

返回总览页