建構公司儀表板,以雷達圖為例

by TibaMe小編
建構公司儀表板,以雷達圖為例

撰文者/台灣經濟新報(TEJ)

本文重點概要

  • 文章難度:★★☆☆☆
  • 建立雷達圖
  • 閱讀建議:本文以百分位數的方式,規模化各項重要財務指標以便呈現在雷達圖上,故能一目了然公司相對於同產業的表現。而由於本文主要採用的是財務數據,因此尚未熟悉撈取財務數據流程的讀者,建議先閱讀【新手上路(六)】- 財務數據撈取,再回來一步一步建構自己專屬的儀錶板!

前言

所謂儀錶板,即是用視覺效果、單一頁面的方式去傳達重要的資訊,讓使用者能在很短的時間內觀察出某個趨勢與做出相關推論。而一個設計良好的儀錶板,除了外觀直覺與畫面不雜亂,最精華、最想傳達出的內容也必須要精準地呈現,才不至於讓使用者找不出該儀表板的重點與價值何在。

雷達圖為儀錶板上常見的圖表,也是常用於分析財務報表的方式。透過比較公司其他年度、或是同產業公司的表現,可以了解公司相關財務指標的趨勢,與同期同產業公司的相對表現,因此對於基本面分析相當有幫助。

編輯環境及模組需求

本文使用 Windows OS 並以 Jupyter Notebook 作為編輯器

#功能模組
import pandas as pd
import numpy as np

#視覺化模組
import plotly.graph_objects as go

#TEJ API
import tejapi
tejapi.ApiConfig.api_key = 'Your Key'
tejapi.ApiConfig.ignoretz = True

資料庫使用

資料處理

Step 1. 財務數據撈取

database = tejapi.get('TWN/AIM1A',
mdate = {'gte':'2020-01-01'},
paginate = True,
opts = {'pivot':True, 'columns': ['coid','mdate','4151','R106','R502', 'R503', 'R509', 'R631', 'K632', 'R103']},
chinese_column_name = True)

從TEJ的財務資料庫裡,撈取所有公司自2020年以來的數據,因為本文雷達圖上呈現的將會是相對表現,而不是單一公司的絕對數值。這邊選取的科目是現金股利、營業利益率、速動比率、利息支出率、借款依存度、收款天數、售貨天數以及ROE

database

Step 2. 處理現金股利

dps_date = database[database['財報年月'].dt.month == 12].groupby(by = '公司代碼').last()['財報年月'].mode().values[0]

因為現金股利為年頻率資料,所以僅12月份有資料。接著利用groupby將資料以公司進行分群,每群的最後一筆資料last為該公司最新的資料。而為了避免部分公司先行公布資料,而有可比公司過少的問題,這裡再利用[‘財報年月’].mode取得出現次數最多最新日期,來當作我們的比較基準日

dps_date
dps_radar= database[database['財報年月'] == dps_date].loc[:,['公司代碼','普通股每股現金股利(盈餘及公積)']].reset_index(drop=True)

再以此日期,篩選出2020年所有公司的現金股利資料

dps_radar

Step 3. 處理其餘季頻率的資料

database = database.drop(axis =1, columns = '普通股每股現金股利(盈餘及公積)')
com_date = database.groupby(by = '公司代碼').last()['財報年月'].mode().values[0]
adj_radar = database[database['財報年月'] == com_date].reset_index(drop=True)

先刪除現金股利欄位,而校正比較基準日期的方式如同 Step2

adj_radar

Step 4. 合併資料並進行排序

adj_radar = adj_radar.merge(dps_radar, on = '公司代碼')
adj_radar = adj_radar.dropna().reset_index(drop=True)
ranked_radar = adj_radar.loc[:, ['普通股每股現金股利(盈餘及公積)', '營業利益率','速動比率','利息支出率','借款依存度','季底收款天數','季底售貨天數','ROE(A)-稅後']].rank(pct=True)
ranked_radar.insert(0, '公司代碼', adj_radar['公司代碼'])

首先將所有財務數據合併成一表並刪除有缺失值的資料,接著利用 rank(pct=True)將各欄的數值轉成 0 ~ 1之間的百分位數,舉例來說,若有5間公司的現金股利分別為1, 2.5, 3.3, 4.2, 35,則透過轉換後,會變成 0.2, 0.4, 0.6, 0.8, 1,最後再用 insert 補上公司欄位

ranked_radar

視覺化

Step 1. 選擇欲查詢公司與對應產業表現

firm_radar_list = ranked_radar[ranked_radar['公司代碼'] == '2330'].iloc[0, 1:].tolist()

這裡選擇台積電 (2330),並將規模化後的財務數據轉成列表儲存

firm_radar_list
firms = tejapi.get('TWN/AIND',
paginate = True,
opts = {'columns':['coid','tejind2_c']},
chinese_column_name = True)industry = firms[firms['公司簡稱'] == '2330'].iloc[0,1]
peers = firms[firms['TEJ產業名'] == industry]['公司簡稱'].tolist()

接著到TEJ資料庫撈取該公司所屬產業 industry,接著再以此產業選出同產業所有公司的股票代碼 peers

peers 部分內容
industry_radar = ranked_radar[ranked_radar['公司代碼'].isin(peers)].loc[:, ['普通股每股現金股利(盈餘及公積)', '營業利益率','速動比率','利息支出率','借款依存度','季底收款天數','季底售貨天數','ROE(A)-稅後']].mean()
industry_radar_list = industry_radar.tolist()

接著計算同儕公司的平均百分位,用以代表整體產業的表現

industry_radar_list

Step 2. 畫出雷達圖

categories = ['現金股利','營業利益率','速動比率', '利息支出率','借款依存度', '收款天數', '售貨天數', 'ROE']fig = go.Figure()fig.add_trace(go.Scatterpolar( r= firm_radar_list,
theta= categories,
fill='toself',
name='公司'))
fig.add_trace(go.Scatterpolar( r=industry_radar_list,
theta=categories,
fill='toself',
name='產業'))fig.show()

首先定義 catogories,科目名稱的順序必須對應到firm_radar_list與 industry_radar_list 列表裡的數值,為雷達上顯示的文字,並使用 toself 將圖形內顏色塗滿

有了上述雷達圖,即可得到許多訊息,其一是整個半導體產業的財務數據表現,其二是台積電的營業利益率、現金股利與ROE明顯優於同業,收款天數也較短,但借款依存度卻高於同業。

結論

藉由TEJ的財務資料庫,即可利用上述方式建構雷達圖,而財務指標的選擇、資料標準化的方式、產業的分類方式都可以按照自身需求進行調整,雖然本文以同期、不同公司為基礎繪出雷達圖,但讀者也可以試著以同公司、不同期的雷達圖來看出公司的變化趨勢。透過這個雷達圖,將能以更宏觀的角度看待一家公司,若想多了解財報細節,推薦讀者參加TEJ於TibaMe上推出的課程,快速培養出財務分析能力。而讀者若對於本文使用的資料庫有興趣,也歡迎到TEJ E-Shop 選取最適合的方案,做出自己專屬的儀表板!

完整程式碼

https://gist.github.com/tej87681088/85e765bb1e3779867fdf62b5846f0ab4#file-tejapi_medium-7-ipynb

推薦活動與課程

還學不夠「理財情報」?快來參加11/30 晚上20:30的直播活動,一小時帶你「透過中國恒大個案,帶你探詢公司不想告訴你的財報秘密」!

點我報名:https://tibame.cc/GxUGD

想知道更多,以下與台灣經濟新報TEJ 合作的三堂課程,輸入【 PP6BOG1 】 都可以折抵 $300 哦!

分享這篇文章:
0 留言
3

您也許會喜歡

發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料