防御型股票填权息探讨

Photo by Alexander Schimmeck on Unsplash

本文重点概要

前言

台湾人的投资人偏好具备高现金流的股票,也就是我们常提到的高殖利率股,且高殖利股也通常俱备低波动这样的特性,也就是俗称的低beta值。

beta值代表与大盘连动的相关性,大家所熟知的0050,beta值大概在于1左右,也能说明他能反映大盘的涨跌,高股息etf 0056,beta值介于0.75~1之间,说明了他的变动程度稍微较0050低一点,

近期地缘政治以及升息导致的股市不确定性加剧,进而造成最近的暴涨暴跌,虽然对于一般投资人最好的方式就是,减码或是降低风险,然根据富达的研究报告,一个美国投资人只要错失过去40年中报酬率最好的50天,你的资产将比完整留在市场中的投资人少了整整93%,所以或许选择风险较低的股票是一个不错的替代方案,近一个月里面0050下跌了4%,然而0056上涨了1%左右,所以在动荡期间下或许选择高殖利股票会比较保险吗? 因此本文想借由探讨近五年的高殖利股的填权息状况去进行分析,看是否适合使用beta指标去选择高殖利率股填权息情况。

本文研究标的都选择殖利率5%以上之各股,用以下三个指标去分类

  1. Beta值
  2. 累积营收成长 (yoy)
  3. Q1毛利率成长率(yoy)

编辑环境及模组需求

本文使用 Window10 并以 Spyder(anaconda31) 作为编辑器

###汇入套件##########数据分析三宝
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#################TEJ
import tejapi
tejapi.ApiConfig.api_key = 'Your Key'
tejapi.ApiConfig.ignoretz = True

资料库使用

资料处理

data=tejapi.get('TWN/EWNPRCSTD' ,chinese_column_name=True )
select=data["上市别"].unique()
select=select[1:3]
condition =(data["上市别"].isin(select)) & ( data["证券种类名称"]=="普通股" )
data=data[condition]
twid=data["证券码"].to_list()

本段是选取所有的上市柜证券代码,以便放入填权息资料库。

year='2017'  ######选择年度 本年度选择2017~2021
start= year+'-01-01'
end  = year+"-12-31"
dividend=tejapi.get('TWN/AREINT' ,
            coid=twid,
            mdate={'gt':start,'lt':end},
            paginate=True,
            chinese_column_name=True)

接下来看dividend长怎么样

接下来我们需要Beta值,从资料库选取,而我们资料都选自一个交易日约落在5 /10 号前后(公布4月营收),大部分公司已经宣布发放股利,且第一季财报皆出来(截止日也在3/31 )。

start= year+'-05-09'
end=   year+"-05-11"
opts={'columns': ['coid','mdate', 'beta_1y']}
beta = tejapi.get('TWN/ABETA',
                  coid=twid,
            mdate={'gt':start,'lt':end},
            paginate=True,
            chinese_column_name=True
)
beta.set_index("证券代码",inplace=True) #方便合并
证券代码
证券代码

接下来要取得殖利率,本益比等证券相关资料。

start= year+'-05-9'
end=   year+"-05-11"
getperatio=tejapi.get('TWN/APRCD' ,
                  coid=twid,
                  mdate={'gt':start,'lt':end},
                  paginate=True,
                  chinese_column_name=True )
getperatio.set_index("证券代码",inplace=True)
peratio资料表
peratio资料表

再来是取得财报资料,例如毛利率等

twid1=twid 
groups = []
while True:
    if len(twid1) >= 50:
        groups.append(twid1[:50])
        twid1 = twid1[50:]
    elif 0 <= len(twid1) < 50:
        groups.append(twid1)
        break

因为抓取财报为了避免一次抓取资料量过大,将其事先分组!

fin_data = pd.DataFrame()
start=year+'-01-01'
end=  year+"-03-22"    ##抓取第一季
for group in groups:
    fin_data = fin_data.append(tejapi.get('TWN/EWIFINQ',
                  coid = group,
                  mdate={'gt':start,'lt':end},
                 
                  chinese_column_name = True,
                  paginate = True)).reset_index(drop=True)
fin_data.set_index("证券码",inplace=True)
fin_data资料表
fin_data资料表

这样就拥有第一季的财报了,再来是抓取累计月营收。

opts={'columns': ['coid','mdate','d0007']}
start=year+'-04-30'
end=year+"-05-15"  
trade=tejapi.get('TWN/ASALE' ,
            coid=twid,
            mdate={'gt':start,'lt':end},
            opts=opts,
            paginate=True,
            chinese_column_name=True)   
trade.set_index("公司",inplace=True)
trade资料表
trade资料表

这样我们就有所有我们想要的资料了,接下来就是把他合再一起了!

dividend["累计营收成长率%"]=trade["累计营收成长率%"]
dividend["股利殖利率-TSE"]=getperatio["股利殖利率-TSE" ]
dividend["现金股利率"]=getperatio["现金股利率" ]
dividend["营业毛利率"]=fin_data["营业毛利率"]
dividend["CAPM_Beta 一年"]=beta['CAPM_Beta 一年']
dividend["填权息(Y/N)"]=dividend["填权息(Y/N)"].apply(lambda x : 1 if x == "Y" else 0)  ###将y n变成0 或 1
dividend["填权息(Y/N)"].value_counts() 
dividend["本益比"]=getperatio["本益比-TSE" ]
dividend资料表
dividend资料表

接下来就是分析了,先找到当年5%殖利率的填权息比例与天数。

def count(x):
   a,b =  x["填权息(Y/N)"].value_counts()
   c=x["填权息天数"].mean()
   return f'填息机率 : {a/(a+b)}' , f'填息家数 : {a}' ,f'未填息家数 : {b}', f'填息天数 : {c}'
###算出资料及里面填权息天数 与机率
div5=dividend[dividend["股利殖利率-TSE"]>5]
count(div5)
count(div5)输出结果
count(div5)输出结果

2017年的殖利率>5%的股票填息机率为0.78,平均天数为46天。

def capmselect(df,b,c):
    yy=df[(df["股利殖利率-TSE"]>5)&(df["CAPM_Beta 一年"]>b)&(df["CAPM_Beta 一年"] < c)]
    return count(yy)
def capmpeselect(df,b,c,d ):   ########条件增加月营收的
yy=df[(df["股利殖利率-TSE"]>5)&(df["CAPM_Beta 一年"]>b)&(df["CAPM_Beta 一年"] < c)& (df["累计营收成长率%"] > d )]
    return count(yy)
def ncapmpeselect(df,b,c,d ):  #####累计成长负的
yy=df[(df["股利殖利率-TSE"]>5)&(df["CAPM_Beta 一年"]>b)&(df["CAPM_Beta 一年"] < c)& (df["累计营收成长率%"] < d )]
    return count(yy)
def allcondition(a,b,c,d,e,f):  #累计营收正 毛利率成长正
  allcondition=dividend[(dividend["股利殖利率-TSE"]>a)&(dividend["本益比"]<b)&(dividend["CAPM_Beta 一年"]>c)&
(dividend["CAPM_Beta 一年"]<d)&
(dividend["累计营收成长率%"]>e)&
(dividend["营业毛利成长率"]>f)]
    return count(allcondition)
def nallcondition(a,b,c,d,e,f): #累计营收负 毛利率成长负
  allcondition=dividend[(dividend["股利殖利率-TSE"]>a)&(dividend["CAPM_Beta 一年"]>c)&(dividend["CAPM_Beta 一年"]<d)&(dividend["累计营收成长率%"]< e)&(dividend["营业毛利成长率"]<f)]
  return count(allcondition)

接下来以0.4~0.6 capm 示范

0.4~0.6 capm 示范(一)
0.4~0.6 capm 示范(一)
0.4~0.6 capm 示范(二)
0.4~0.6 capm 示范(二)

在这个组合里我们能看到高殖利股中月营收持续成长,毛利率也同时增长的股票表现较佳,累计营收与毛利率负成长的公司填息机率最小。

以下是近五年的整理

2017资料表
2017资料表
2018资料表
2018资料表
2019资料表
2019资料表
2020资料表
2020资料表
2021资料表
2021资料表

结论

透过这几年的观察我们发现以下几点,

1 .在营收、毛利成长 ,填息机率较高 。

2. 营收、毛利衰退,填息机率较低

3. 防御型股票(beta较小)填息率并无优于股性较活泼的股票(beta值较大)

4.具有较高的Beta值股票填息率较高,时间也较短。

从以上得出在这个动荡的市场下,可能选择营收持续持长的高殖利股票可能会是一个比较好的选择,市场是有需许去年赚很多但是今年市况反转的高殖利股,而这类型的填息机率普遍会比较低喔!

防御型类型的股票虽然可以规避下跌然而在填息机率上可能不如股票较为活泼的股票,后续也能将此放入机器学习模型使他判断出其对于填息重要的排序 ,前面的文章有类似的使用能做参考!

完整程式码

延伸阅读

相关连结

返回总览页