投資大師策略回測系列(3)班傑明.葛拉漢(Benjamin Graham)防禦價值型投資法


證券分析的開山始祖

投資大師簡介

 

班傑明.葛拉漢是華爾街公認的證券分析之父,1894年生於倫敦,1895年舉家遷居紐約,9歲時父親過世,幼年生活困苦,1914年畢業於哥倫比亞大學,進入證券經紀商紐伯格公司(Newbuger Henderson&Loeb)擔任統計分析的工作。

 

1923年離職後,創立第一個私人基金-葛蘭赫公司,初試啼聲操作績效即非常優異。1925年因合夥人意見不合而清算解散,1926年和友人合資設立葛拉漢聯合投資帳戶(Joint Account),至1929年初資金規模由45萬美元成長至250萬美元(非新投資者)。一夕之間,葛拉漢之名成為華爾街的寵兒,多家上市公司的所有人皆希望葛拉漢為他們負責合夥基金,但皆因葛拉漢認為股市已過度飆漲而婉拒。

 

1929年,葛拉漢回到母校開課,教導證券分析的方法。1934年和陶德(David L. Dodd)合著「有價證券分析」(Security Analysis)一書,成為證券分析的開山始祖,在葛拉漢之前,證券分析仍不能被視為一門學問。此書至今仍未絕版,是大學證券分析的標準教科書之一。當代著名的基金經理人如華倫.巴菲特(Warren Buffett)、約翰.奈夫(John Neff)、湯姆.芮普(Tom Knapp)等皆是葛拉漢的學生,目前華爾街只要是標榜價值投資法的基金經理人,也都是葛拉漢的徒子徒孫。

 

葛拉漢於1960年解散經營20年的葛拉漢.紐曼公司(Graham Newman),並退休。1976年去世,留下逾300萬美元的遺產,另著有智慧型股票投資人一書(The Intelligent Investor: A Book of Practical Counsel)一書,本方法即是此書中的投資原則的重點。

 

投資策略說明

 

葛拉漢認為防禦型投資者應平均買進道瓊工業指數的30支股票,否則應按照以下原則來選股:

 

1. 選擇年銷售額逾一億美元的公司,或年銷售額逾5000萬美元的公用事業股。
2. 流動比例應為200%以上,且長期負債不超過淨流動資產。
3. 選擇過去十年,每年皆有盈餘的公司
4. 選擇連續20年都支付股利的公司
5. 利用3年平均值,選擇過去10年每股盈餘至少成長1/3的公司。
6. 股價÷三年平均每股盈餘小於15倍。
7. 股價淨值比小於1.5倍。
8. 投資組合中應保持10-13種股票。

計算程序

 

由於時空背景的不同,並利於選股程序的進行,將葛拉漢的程序稍作更動:

 

1. 年營業額大於市場平均值的公司
2. 過去5年皆有盈餘的公司
3. 連續2年皆支付現金股利的公司
4. 流動比例>200%
5. 流動淨資產 – 長期負債>0
6. (近三年平均稅後淨利-近5年平均稅後淨利)/近5年平均稅後淨利的絕對值>0.33
7. PER1(以近3年平均每股盈餘計算)<= 近三年PER1平均
8. PER(以近4季每股盈餘計算)*PBR <= 近三年PER*PBR平均

 

回測各指標

 

以南帝(2108)為例,下圖是葛拉漢投資策略的第一個因子,可以看出南帝的營收不僅大於市場平均,且每季持續成長。

 

 

接下來第二跟第三個因子,可以看出南帝有健全的盈餘狀況及股利政策。

 

 

 

第四及第五個因子代表南帝整體財務狀況良好,流動資產不僅可以負擔短期債款,甚至可以支撐長期負債,所以該公司近期內不會有違約風險。

 

 

 

 

第六個因子為營收的成長率。

 

 

第七及第八個因子是用PE/PB來判斷,在近三年中,現在持有南帝的成本是否便宜。

 

 

回測本策略建構投資組合損益

 

依照葛拉漢八個篩選投資因子,篩選出每日投資標的,並以等市值權重買進標的。

接下來,就用以上標準篩選股票,並用歷史股價資料進行回測。

 

回測參數

 

我們以假定一百萬新台幣為起始資金,將符合上述選股條件的股票,在進行回測的各個日期以等權重的方式,假定以當天收盤價買進,並以次一日的收盤價計算整個投資組合的損益。

回測的起始日為2019-05-02起,往前回測一年,並且為了考慮交易量與市值大小可能造成的買進困難問題,將選股範圍限縮在權值佔台灣加權指數前300大的個股內。

 

回測損益

 

假設以一百萬元資金開始進行投資,並且與大盤(加權指數)的績效進行比較,結果如下:

 

 

上圖的回測結果可以看到,以葛拉漢的選股策略所建構的投資組合,整個投資組合在回測日往前一年間,每天淨現值的變化。從圖中可以發現,雖然2018年剛進場布局時,其績效差於大盤加權指數;但在2018年11月調整持股後,績效從谷底回升,其漲幅遠遠超過大盤指數,到回測截止日(2019年5月2日)前,其持總股績效為11.99%。

而回測每日的損益狀況如下:

 

 

上圖為投資組合及大盤加權指數的每日損益,回測期間,葛拉漢投資組合的標準差為:上0.014,大盤加權指數的標準差為0.009。由上圖也可以明顯地看出來,藍色線為葛拉漢策略的損益波動的狀況,整體來說要大於橘色線的大盤加權指數、也就是其市場風險要較直接投資大盤還要來的大。

 

附錄:python程式範例

 

本投資策略的使用,除了股價報酬率資料已外,額外應用了以下TEJ資料庫,進行各指標的計算:

公司財務面資料庫-以合併為主財務(單季)
公司營運面資料庫-月營收盈餘

TEJ API Pyhton程式碼:

 

#進行各指標計算
def calculate(tejtool,param):

    print(tejtool.current_zdate)
   #1. 選擇年營業額大於市場平均值的公司    
    tejtool.data['市場平均值營業額'] = tejtool.calculate_crossing('最近12個月營收',weight='市值',window=1,target_name='市場平均值營業額')
    tejtool.data['CHK1'] = tejtool.check_above('最近12個月營收','市場平均值營業額',target_name='CHK1')
    
    #2. 選擇過去5年皆有盈餘的公司
    tejtool.data['門檻條件'] = 0
    tejtool.data['CHK2'] = tejtool.check_above('常續性稅後淨利','門檻條件',window=20,target_name='CHK2')
    
    #3. 選擇連續2年皆支付現金股利的公司
    tejtool.data['CHK3'] = tejtool.check_above('每股現金股利','門檻條件',window=8,target_name='CHK3')

    #4. 流動比例>200%
    tejtool.data['流動比率'] = tejtool.data['流動資產']/ tejtool.data['流動負債'] *100
    tejtool.data['CHK4'] = tejtool.check_above('流動比率',200,window=1,target_name='CHK4')
    
    #5. 淨流動資產 - 長期負債>0
    tejtool.data['淨流動資產'] = tejtool.data['流動資產'] - tejtool.data['流動負債'] -tejtool.data['非流動負債']
    tejtool.data['CHK5'] = tejtool.check_above('淨流動資產','門檻條件',window=1,target_name='CHK5')
    
    #6. (近3年平均稅後淨利-近5年平均稅後淨利)/近5年平均稅後淨利的絕對值>0.33
    window1 = 3  #定義移動窗口的大小,即1年
    tejtool.data['近3年平均稅後淨利'] = tejtool.calculate_moving('常續性稅後淨利',window = 12,col_kind='mean',target_name='近3年平均稅後淨利')
    tejtool.data['近5年平均稅後淨利'] = tejtool.calculate_moving('常續性稅後淨利',window = 20,col_kind='mean',target_name='近5年平均稅後淨利')
    tejtool.data['稅後淨利差異']= np.abs((tejtool.data['近3年平均稅後淨利']- tejtool.data['近5年平均稅後淨利'])/ tejtool.data['近5年平均稅後淨利'])
    #print(tejtool.data.loc[tejtool.data['zdate']==tejtool.current_zdate,['coid','mdate','稅後淨利差異','近3年平均稅後淨利','近5年平均稅後淨利']])
    tejtool.data['CHK6'] = tejtool.check_above('稅後淨利差異', 0.33 , window='1d',target_name='CHK6')
    #print(tejtool.data.loc[tejtool.data['zdate']==tejtool.current_zdate,['CHK6']])
    
    #7. PER1(以近3年平均每股盈餘計算)<=15
    tejtool.data['常續性盈餘'] = tejtool.data['常續性稅後淨利移動四季合計']- tejtool.data['歸屬非控制權益淨利(損)移動四季合計']- tejtool.data['歸屬共同控制下前手權益淨利(損)']
    tejtool.data['最近四季常續性每股盈餘'] = tejtool.data['常續性盈餘']/ tejtool.data['加權平均股數']
    tejtool.data['近3年平均每股盈餘'] = tejtool.calculate_moving('最近四季常續性每股盈餘',window=12,col_kind='mean',target_name='近3年平均每股盈餘')
    tejtool.data['PER1'] = tejtool.data['股價'] / tejtool.data['近3年平均每股盈餘']
    tejtool.data['近3年平均PER1'] = tejtool.calculate_moving('PER1',window=12,col_kind='mean',target_name='近3年平均PER1')
    tejtool.data['大盤PER1'] = tejtool.calculate_crossing(' PER1',window=1,target_name='大盤PER1')
    tejtool.data['CHK7'] = tejtool.check_above('近3年平均PER1','PER1' ,window='1d',target_name='CHK7')

    
    #8. PER(以近4季每股盈餘計算)*PBR<22.5
    tejtool.data['PBR'] =tejtool.data['股價'] / tejtool.data['每股淨值(F)(TSE)']
    tejtool.data['PER'] = tejtool.data['股價'] / tejtool.data['最近四季常續性每股盈餘']
    tejtool.data['PBPE'] = tejtool.data['PBR']*tejtool.data['PER']
    tejtool.data['近3年平均PBPE'] = tejtool.calculate_moving('PBPE',window=12,col_kind='mean',target_name='近3年平均PEPB')
    tejtool.data['CHK8'] = tejtool.check_above( '近3年平均PBPE','PBPE' ,window='1d',target_name='CHK8')
    
    return tejtool.data
#設定要輸出觀測的各指標時序列圖(以設定的觀察個股為例進行繪圖)

def output(tejtool,param): 
    #最多輸出一張表,三張圖,一張圖裡最多可以塞三條線
    
    tejtool.output_indicator(['流動資產','流動負債','非流動負債'])
    


#控制選股與否、投資比重等
def evaluate(tejtool,param):
    
    #判斷哪些股票要買或不買,然後以均等投資金額來決定持股股數    
    tejtool.data['購入'] = tejtool.check_condition(['CHK1','CHK2','CHK3','CHK4','CHK5','CHK6','CHK7','CHK8'],'and')    

    #使用均等投資金額來分配投資比重
    tejtool.data['unit'] = tejtool.equal_pv()
    return tejtool.data

%%time
#安排evaluate函式所定義的投資策略回顧測試
ct.set_name('strategy2')
ct.back_test(360) #括號內填回測時間