防禦型股票填權息探討

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值股票填息率較高,時間也較短。

從以上得出在這個動盪的市場下,可能選擇營收持續持長的高殖利股票可能會是一個比較好的選擇,市場是有需許去年賺很多但是今年市況反轉的高殖利股,而這類型的填息機率普遍會比較低喔!

防禦型類型的股票雖然可以規避下跌然而在填息機率上可能不如股票較為活潑的股票,後續也能將此放入機器學習模型使他判斷出其對於填息重要的排序 ,前面的文章有類似的使用能做參考!

完整程式碼

延伸閱讀

相關連結

返回總覽頁
Procesing