【新手上路(六)】- 財務數據撈取

示範從 TEJ API 財務資料庫撈取數據

TEJ 台灣經濟新報
TEJ-API 金融資料分析
9 min readAug 3, 2021

--

Photo Creds: 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 選取符合自身需求的方案,在眾多財務數據中挖掘出更多有價值的資訊!

完整程式碼

延伸閱讀

相關連結

給我們鼓勵
之後會持續分享更多財金資料庫的應用
如果你的覺得今天的文章不錯,可以幫我們在下面的 掌聲 icon 點 1下
如果覺得超讚,可以按住 掌聲 icon 不放直到 50 下
有任何想法歡迎點選 留言 icon和我們討論

--

--

TEJ 台灣經濟新報
TEJ-API 金融資料分析

TEJ 為台灣本土第一大財經資訊公司,成立於 1990 年,提供金融市場基本分析所需資訊,以及信用風險、法遵科技、資產評價、量化分析及 ESG 等解決方案及顧問服務。鑒於財務金融領域日趨多元與複雜,TEJ 結合實務與學術界的精英人才,致力於開發機器學習、人工智慧 AI 及自然語言處理 NLP 等新技術,持續提供創新服務