投資大師策略回測系列(1)羅傑.金(Roger E. King)歷史價值評估選股法則


投資成功的秘訣在於買到便宜的價格

投資大師簡介

 

羅傑‧金(Roger E. King)是美國知名的價值型基金經理人,曾任職太陽保險服務公司(Sun Insurance Services)的資深副總裁兼投資長及葛夫科資本管理公司(GULFCO Investment Management)的資深副總裁,1981年創立國王投資顧問公司(King Investment Advisors Inc.),至2001年,投資經歷長達30年。

 

原本國王投資顧問公司只管理機構投資者的資金與個人退休基金,1996年底才發行第一檔股票共同基金-源頭特別價值基金(Fountainhead Special Value Fund),1997年即一鳴驚人,獲得36.65%的投資報酬率,1999年投資報酬率達133.44%,2000年雖股市表現不佳,但基金績效只損失15.71%,至2001年5月止,3年平均報酬率達18.22%,超越同期S&P500指數表現12.92個百分點,因此獲得晨星公司(Morningstar Co.)基金評等5顆星的評價,投資績效表現非常優異。

 

他自行研發一種稱為『企業評價方法(Business Valuation Approach)』的選股策略,以由下而上(bottom up)的選股方式為主,分為三種價值評估方式:

 

(一)私有市場評價(Private-market Valuation,Liquidation or acquired in a cash transaction);
(二)歷史評價(Historical Valuation);
(三)優越的盈餘成長(Superior Earning Growth,Buy growth at a reduced price:GARP)

 

三種方法所選出的公司皆可為投資標的,再以財務強度及內部人進出等指標進行篩選;雖然羅傑‧金被市場定位為價值型投資者,但他強調並不排斥買進具有投資價值的成長股,他在接受媒體專訪時曾表示『投資成功的秘訣在於買到便宜的價格(The secret of success is to buy at an inexpensive price),本次介紹的是第二種選股方法「歷史評價」。

 

投資策略說明

 

選股程序及標準:以七年歷史資料為期,計算以下指標的狀況,判斷目前股價上漲空間(Potential Upside)及下檔風險(Potential Downside)。

  • 歷史最高本益比平均及最低本益比平均。
  • 歷史最高股價淨值比平均及最低股價淨值比平均。
  • 歷史最高股價現金流量比平均及最低股價現金流量比平均。
  • 歷史最高股價營收比平均及最低股價營收比平均。
  • 堅強的財務狀況。
  • 內部人進出的狀況。

 

從上面指標選擇的項目可以看到,羅傑‧金先找出每年的當年度本益比最大值與最小值,然後分別取平均值,計算出選股時點本益比的上下限;接著納入股價淨值比、現金流量、營收等基本面常見指標,以相同的方式計算出各指標與股價間比例的上下限。藉由多個基本面指標設算出的股價的上下檔目標價,並且以目前股價較接近上檔目標價或下檔目標價,來判斷是否該買入此股票。

 

另外,再納入財務狀況是否穩健作為另外的輔助指標-這邊我們就直接選擇以負債比率來考量其財務穩健程度;另外,內部人持股變化的狀況,則使用TEJ API現有的董監事持股資料庫來取得內部人持股變化的歷史資料。

 

計算程序

 

使用方法:
選股程序及標準:選定歷史資料使用年數為7年。

 

運算過程:

  • 歷史本益比上檔目標價=最近7個年度最高本益比平均值x預估每股盈餘。
  • 歷史本益比下檔目標價=最近7個年度最低本益比平均值x預估每股盈餘。
  • 歷史股價淨值比上檔目標價=最近7個年度最高股價淨值比平均值x最近一季每股淨值。
  • 歷史股價淨值比下檔目標價=最近7個年度最低股價淨值比平均值x最近一季每股淨值。
  • 歷史股價現金流量比上檔目標價=最近7個年度最高股價現金流量比平均值x最近四季每股現金流量。
  • 歷史股價現金流量比下檔目標價=最近7個年度最低股價現金流量比平均值x最近四季每股現金流量。
  • 歷史股價營收比上檔目標價=最近7個年度最高股價營收比平均值x最近12個月每股營收總額。
  • 歷史股價營收比下檔目標價=最近7個年度最低股價營收比平均值x最近12個月每股營收總額。

選股標準:

 

以下四個選股標準,即是計算當前股價,是否較接近該指標所算出的下檔目標價,較接近者就代表價格偏移長期行情的中間值,值得買入。

 

  • 歷史本益比報酬/風險值=[(歷史本益比上檔目標價-目前股價)/目前股價]/ [(目前股價-歷史本益比下檔目標價)/目前股價]>1。
  • 歷史股價淨值比報酬/風險值=[(歷史股價淨值比上檔目標價-目前股價)/目前股價]/ [ (目前股價-歷史股價淨值比下檔目標價)/目前股價]>1。
  • 歷史股價現金流量比報酬/風險值=[(歷史股價現金流量比上檔目標價-目前股價)/目前股價]/ [ (目前股價-歷史股價現金流量比下檔目標價)/目前股價]>1。
  • 歷史股價營收比報酬/風險值=[(歷史股價營收比上檔目標價-目前股價)/目前股價]/[ (目前股價-歷史股價營收比下檔目標價)/目前股價]>1。

 

以上4項指標,符合1項即為選股標的。再以下面兩個條件過濾篩選:

剃除選股時間點近一季負債比率大於65%的公司。 剔除選股時間點最近3個月內經理人及董監事持股比例減少5%的公司。

 

回測各指標

 

這邊以台積電(2330)為例,觀察羅傑金所用來選股的四個以財務比率計算的指標,在過去一年的回測區間所推算出的股價上檔目標價與下檔目標價,與每天的收盤價(close_adj)並列的時序列圖:

 

 

按照羅傑金的選股標準「歷史本益比報酬/風險值」,其實計算的就是股價距離下檔目標價的距離,是否比距離上檔目標價來的短,也就是股價目前按照長期均勢的本益比來看,是否偏低,若是,就可以買進。而從上圖可以看到,台積電在過去一年裡,股價幾乎都落在以常續性每股盈餘來計算的本益比上檔目標價與下檔目標價的中間偏低,亦即光看此指標,台積電是大部分時間都符合選股標準的選擇。

 

以下另外三個指標,除了第三張圖,也就是以移動12個月加總月營收所算出的上下檔目標價,股價在近半年比較靠近上檔母標價外,另外兩個財務指標的計算,台積電都是股價在中間偏低的時間比較多一點。

 

 

 

 

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

 

按照上述的上下檔目標價,判斷股價是否較靠近下檔目標價,較靠近者,當天就是作被選擇的可買入股票,後面就以此標準選股,來使用歷史的價格漲跌資料進行此策略的回顧測試。

 

回測參數

 

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

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

 

回測損益

 

假設以一億元資金開始進行投資,並且與大盤(加權指數,但為調整除權息效果的報酬指數)的績效進行比較,結果如下:

 

 

從上圖的回測結果可以看到,以羅傑‧金的選股策略所建構的投資組合,整個投資組合在回測日往前一年間,每天淨現值的變化,可以看到在2018前半年的淨現值與加權指數相比不相上下,但在10月份大盤大幅度向下時,羅傑‧金策略的投資組合下修的幅度較為有限,因此最終使得結算的淨現值,要較加權指數高於4%多,比起始投資金額多出了7%左右。

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

 

 

附錄:python程式範例

最後,本次回測以TEJ為進行投資策略績效研究所開發的平台,為方便研究使用,以TEJ開發之套件簡化python程式碼的使用,本次回測所使用的模型計算過程如下方呈獻。由於此投資策略需要計算以一年為移動窗口,找出過去七年每年最大/小值後,再進行平均的計算,故我們以TEJ開發之python套件「tejtool」中的取移動窗口最大值/最小值之平均值的函式「calculate_moving()」,來加速此繁複計算的過程。而回測的安排,則在tejtool的backtest()函式中安排好計算流程、持股權重的計算等等。

 

TEJ API Pyhton程式碼:

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

    tejtool.data['常續性盈餘'] = tejtool.data['常續性稅後淨利移動四季合計']- tejtool.data['歸屬非控制權益淨利(損)移動四季合計']- tejtool.data['歸屬共同控制下前手權益淨利(損)']
    tejtool.data['每股淨值'] = tejtool.data['每股淨值(F)-TSE公告數']
    tejtool.data['負債比率'] = tejtool.data['負債總額']/tejtool.data['資產總額']
    tejtool.data['最近四季每股現金流量'] = tejtool.data['來自營運之現金流量移動四季合計']
    tejtool.data['最近四季常續性每股盈餘'] = tejtool.data['常續性盈餘']/ tejtool.data['加權平均股數']
   

    tejtool.data['常續性本益比'] = tejtool.data['調整後股價'] / tejtool.data['最近四季常續性每股盈餘']
    tejtool.data['股價淨值比'] = tejtool.data['調整後股價'] / tejtool.data['每股淨值']
    tejtool.data['股價現金流量比'] = tejtool.data['調整後股價'] / tejtool.data['最近四季每股現金流量']
    tejtool.data['最近12個月每股營收'] = tejtool.data['最近12個月營收'] / tejtool.data['加權平均股數']
    tejtool.data['股價營收比'] = tejtool.data['調整後股價'] / tejtool.data['最近12個月每股營收']

   
    moving_avg = 1  #定義移動窗口的大小,即1年
    tejtool.data['常續性本益比移動一年最大值均值'] = tejtool.calculate_moving('常續性本益比',moving_avg,'average','max')
    tejtool.data['常續性本益比上檔目標價'] = tejtool.data['最近四季常續性每股盈餘']*tejtool.data['常續性本益比移動一年最大值均值']
    tejtool.data['常續性本益比移動一年最小值均值'] = tejtool.calculate_moving('常續性本益比',moving_avg,'average','min')
    tejtool.data['常續性本益比下檔目標價'] = tejtool.data['最近四季常續性每股盈餘']*tejtool.data['常續性本益比移動一年最小值均值'] 
    tejtool.data['常續性本益比風險值'] = (tejtool.data['常續性本益比上檔目標價'] - tejtool.data['調整後股價'])/(tejtool.data['調整後股價'] - tejtool.data['常續性本益比下檔目標價'])
            
    tejtool.data['股價淨值比移動一年最大值均值'] = tejtool.calculate_moving('股價淨值比',moving_avg,'average','max')
    tejtool.data['股價淨值比上檔目標價'] = tejtool.data['每股淨值']*tejtool.data['股價淨值比移動一年最大值均值']
    tejtool.data['股價淨值比移動一年最小值均值'] = tejtool.calculate_moving('股價淨值比',moving_avg,'average','min')
    tejtool.data['股價淨值比下檔目標價'] = tejtool.data['每股淨值']*tejtool.data['股價淨值比移動一年最小值均值']
    tejtool.data['股價淨值比風險值'] = (tejtool.data['股價淨值比上檔目標價'] - tejtool.data['調整後股價'])/(tejtool.data['調整後股價'] - tejtool.data['股價淨值比下檔目標價'])
    
    tejtool.data['股價現金流量比上檔目標價'] = tejtool.data['最近四季每股現金流量']*tejtool.calculate_moving('股價現金流量比',moving_avg,'average','max')
    tejtool.data['股價現金流量比下檔目標價'] = tejtool.data['最近四季每股現金流量']*tejtool.calculate_moving('股價現金流量比',moving_avg,'average','min')
    tejtool.data['股價現金流量比風險值'] = (tejtool.data['股價現金流量比上檔目標價'] - tejtool.data['調整後股價'])/(tejtool.data['調整後股價'] - tejtool.data['股價現金流量比下檔目標價'])
    
    tejtool.data['股價營收比上檔目標價'] = tejtool.data['最近12個月每股營收']*tejtool.calculate_moving('股價營收比',moving_avg,'average','max')
    tejtool.data['股價營收比下檔目標價'] = tejtool.data['最近12個月每股營收']*tejtool.calculate_moving('股價營收比',moving_avg,'average','min')    
    tejtool.data['股價營收比風險值'] =  (tejtool.data['股價營收比上檔目標價'] - tejtool.data['調整後股價'])/(tejtool.data['調整後股價'] - tejtool.data['股價營收比下檔目標價'])
    #檢查股價是否在目標範圍內
    tejtool.data['門檻條件'] = 1.0
    tejtool.data['常續性本益比目標價內檢查'] = tejtool.check_above('常續性本益比風險值','門檻條件',1)
    tejtool.data['股價淨值比目標價內檢查'] = tejtool.check_above('股價淨值比風險值','門檻條件',1)
    tejtool.data['股價現金流量比目標價內檢查'] = tejtool.check_above('股價現金流量比風險值','門檻條件',1)
    tejtool.data['股價營收比目標價內檢查'] = tejtool.check_above('股價營收比風險值','門檻條件',1)
    #檢查其他條件 
    tejtool.data['負債比率上限'] = param['debt_ratio_threshold']
    tejtool.data['負債比檢查'] = tejtool.check_above('負債比率上限','負債比率',90)
    tejtool.data['持股率下限'] = param['hold_rate_alarm']
    tejtool.data['經理人持股率檢查'] = tejtool.check_above('董監事加經理人持股率','持股率下限',90)
    #tejtool.data['平均本益比'] = tejtool.calculate_average('常續性本益比')
   
    return tejtool.data
#設定要輸出觀測的各指標時序列圖(以設定的觀察個股為例進行繪圖)
def output(tejtool,param): 
    #最多輸出一張表,三張圖,一張圖裡最多可以塞三條線
    
    tejtool.output_indicator(['常續性本益比上檔目標價','調整後股價','常續性本益比下檔目標價'])
    tejtool.output_indicator(['股價淨值比上檔目標價','調整後股價','股價淨值比下檔目標價'])
    tejtool.output_indicator(['股價現金流量比上檔目標價','調整後股價','股價現金流量比下檔目標價'])
    tejtool.output_indicator(['股價營收比上檔目標價','調整後股價','股價營收比下檔目標價'])


#控制選股與否、投資比重等
def evaluate(tejtool,param):
    
    #判斷哪些股票要買或不買,然後以均等投資金額來決定持股股數
    
    tejtool.data['門檻檢查'] = tejtool.check_condition(['負債比檢查','經理人持股率檢查'],'and')
    tejtool.data['條件檢查'] = tejtool.check_condition(['常續性本益比目標價內檢查','股價淨值比目標價內檢查','股價現金流量比目標價內檢查','股價營收比目標價內檢查'],'or')
    tejtool.data['購入'] = tejtool.check_condition(['門檻檢查','條件檢查'],'and')    

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

#安排執行calculate函式中的計算
ct.arrange_calculate()
#安排evaluate函式所定義的投資策略回顧測試
ct.back_test()