內容目錄
所謂儀錶板,即是用視覺效果、單一頁面的方式去傳達重要的資訊,讓使用者能在很短的時間內觀察出某個趨勢與做出相關推論。而一個設計良好的儀錶板,除了外觀直覺與畫面不雜亂,最精華、最想傳達出的內容也必須要精準地呈現,才不至於讓使用者找不出該儀表板的重點與價值何在。
雷達圖為儀錶板上常見的圖表,也是常用於分析財務報表的方式。透過比較公司其他年度、或是同產業公司的表現,可以了解公司相關財務指標的趨勢,與同期同產業公司的相對表現,因此對於基本面分析相當有幫助。
本文使用 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
Step 2. 處理現金股利
dps_date = database[database['財報年月'].dt.month == 12].groupby(by = '公司代碼').last()['財報年月'].mode().values[0]
因為現金股利為年頻率資料,所以僅12月份有資料。接著利用groupby
將資料以公司進行分群,每群的最後一筆資料last
為該公司最新的資料。而為了避免部分公司先行公布資料,而有可比公司過少的問題,這裡再利用[‘財報年月’].mode
取得出現次數最多的最新日期,來當作我們的比較基準日。
dps_radar= database[database['財報年月'] == dps_date].loc[:,['公司代碼','普通股每股現金股利(盈餘及公積)']].reset_index(drop=True)
再以此日期,篩選出2020年所有公司的現金股利資料
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
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
補上公司欄位
Step 1. 選擇欲查詢公司與對應產業表現
firm_radar_list = ranked_radar[ranked_radar['公司代碼'] == '2330'].iloc[0, 1:].tolist()
這裡選擇台積電 (2330),並將規模化後的財務數據轉成列表儲存
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
industry_radar = ranked_radar[ranked_radar['公司代碼'].isin(peers)].loc[:, ['普通股每股現金股利(盈餘及公積)', '營業利益率','速動比率','利息支出率','借款依存度','季底收款天數','季底售貨天數','ROE(A)-稅後']].mean() industry_radar_list = industry_radar.tolist()
接著計算同儕公司的平均百分位,用以代表整體產業的表現
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 選取最適合的方案,做出自己專屬的儀表板!
電子報訂閱