【量化分析】防禦型股票填權息探討

TEJ 台灣經濟新報
TEJ-API 金融資料分析
12 min readMar 23, 2022

簡易探討高殖利股填權息因素

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)

再來是取得財報資料,例如毛利率等

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)

這樣就擁有第一季的財報了,再來是抓取累計月營收。

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)

這樣我們就有所有我們想要的資料了,接下來就是把他合再一起了!

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" ]

接下來就是分析了,先找到當年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)

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 示範

在這個組合裡我們能看到高殖利股中月營收持續成長,毛利率也同時增長的股票表現較佳,累計營收與毛利率負成長的公司填息機率最小。

以下是近五年的整理

結論

透過這幾年的觀察我們發現以下幾點,

1 .在營收、毛利成長 ,填息機率較高 。

2. 營收、毛利衰退,填息機率較低

3. 防禦型股票(beta較小)填息率並無優於股性較活潑的股票(beta值較大)

4.具有較高的Beta值股票填息率較高,時間也較短。

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

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

延伸閱讀

【TEJ知識集】認識除權息&填權息

【資料科學(九)】隨機森林演算法選股策略

相關連結

給我們鼓勵
之後會持續分享更多財金資料庫的應用
如果你的覺得今天的文章不錯,可以幫我們在下面的
掌聲 icon 點 1下
如果覺得超讚,可以按住
掌聲 icon 不放直到 50 下
有任何想法歡迎點選
留言 icon和我們討論

完整程式碼

--

--

TEJ 台灣經濟新報
TEJ-API 金融資料分析

TEJ 為台灣本土第一大財經資訊公司,成立於 1990 年,提供金融市場基本分析所需資訊,以及信用風險、法遵科技、資產評價、量化分析及 ESG 等解決方案及顧問服務。鑒於財務金融領域日趨多元與複雜,TEJ 結合實務與學術界的精英人才,致力於開發機器學習、人工智慧 AI 及自然語言處理 NLP 等新技術,持續提供創新服務