目录
所谓仪表板,即是用视觉效果、单一页面的方式去传达重要的资讯,让使用者能在很短的时间内观察出某个趋势与做出相关推论。而一个设计良好的仪表板,除了外观直觉与画面不杂乱,最精华、最想传达出的内容也必须要精准地呈现,才不至于让使用者找不出该仪表板的重点与价值何在。
雷达图为仪表板上常见的图表,也是常用于分析财务报表的方式。透过比较公司其他年度、或是同产业公司的表现,可以了解公司相关财务指标的趋势,与同期同产业公司的相对表现,因此对于基本面分析相当有帮助。
本文使用 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 选取最适合的方案,做出自己专属的仪表板!