Table of Contents
華倫.巴菲特 ( Warren E. Buffett ) 是全世界有史以來,靠股票賺最多錢的人。從 1956 年以 100 美元起家,時至今日他的個人淨資產已經超過 1300 億美元,成為全球第 5 富有的人。
巴菲特一生固守理性的投資原則,他的企業投資法則著重關注一家企業的發展前景是否看好、企業的經營團隊是否理性且誠實以及企業的財務狀況是否能替股東賺取報酬,而不理會股價每日的漲跌。簡單來說,巴菲特的企業投資法則強調以買下一家公司的心態投資,而非單純投資股票。
本文精選巴菲特企業投資法則中的五大選股條件,從利用 TejToolAPI 抓取財務資料與篩選標的,到使用 TQuant Lab 回測標的的投資風險與績效,我們將一窺巴菲特的投資風格,並體會企業投資法則帶來超額報酬的能力。
由於巴菲特的企業投資法則中,部份是無法量化的,因此只選取可量化的選股條件,其背後的原理皆為公司能幫股東賺錢的能力高。選股條件如下:
因為股東權益報酬率可以藉由增加舉債來提升,因此我們排除金融產業這類高槓桿的產業。另外對於每一元的保留盈餘,巴菲特希望企業能創造超過一元的市場價值,由於這牽涉到公司的上市年限是否夠久,因此我們篩選上市時間大於 7 年的公司。
本文使用 Windows 11 並以 Jupyter Lab 作為編輯器。
導入基本套件並輸入 api 金鑰連接 TEJ 財務資料庫。
import os
import numpy as np
import pandas as pd
# tej_key
tej_key = 'your key'
api_base = 'https://api.tej.com.tw'
os.environ['TEJAPI_KEY'] = tej_key
os.environ['TEJAPI_BASE'] = api_base
get_universe
函式取得股票池get_universe()
函數可以幫助我們抓取特定的股票池(市場、板塊、證券種類、產業)。
本次範例我們選取 2015 年底已上市的普通股,並剔除高槓桿的金融產業。
p.s. 關於 get_universe()
的說明,可參考 TQuant Lab github:get_universe 說明
from zipline.sources.TEJ_Api_Data import get_universe
pool = get_universe(start = '2015-12-31',
end = '2015-12-31', # 選取 2015 年底已上市的股票
mkt_bd_e = 'TSE', # 已上市之股票
stktp_e = 'Common Stock', # 普通股
main_ind_e = 'General Industry') # general industry 可篩掉金融產業
根據企業投資法則中的選股條件,我們需要的財務科目有以下 7 項:
其中營運產生現金流量與投資產生現金流量可用以計算自由現金流量。
自由現金流量 = 營運產生現金流量 + (-)投資產生現金流量
而投資產生現金流量多為負數。
p.s.
import TejToolAPI
start_time = pd.Timestamp('2015-12-31')
end_time = pd.Timestamp('2022-12-30') # 將時間字串轉換成時間格式
data = TejToolAPI.get_history_data(start = start_time,
end = end_time,
ticker = pool,
fin_type = 'A', # 為累計資料,舉例來說,Q3累計:1月~9月的資料。
columns = ['主產業別_中文', '常續ROE', '營業毛利率', '個股市值_元', '保留盈餘', '營運產生現金流量', '投資產生現金流量'],
transfer_to_chinese = True)
data['個股市值(千)'] = data['個股市值_元'] / 1000 # 將個股市值的單位改為(千)
data['自由現金流量'] = data['營運產生現金流量_A'] + data['投資產生現金流量_A'] # 計算自由現金流量 = 營運產生現金流量 + (-)投資產生現金流量
data.drop(columns = ['個股市值_元', '營運產生現金流量_A', '投資產生現金流量_A'], inplace = True) # 移除欄位
data
最近年度股東權益報酬率>產業平均值
從資料總表中提取最近年度 ( 2022-12-30 ) 的財務資料,並利用 groupby()
函數對產業進行分類,計算出產業平均 ROE,即可篩選出符合選股條件的標的。
3年平均股東權益報酬率>15%
從資料總表中提取最近三年 ( 2022-12-30, 2021-12-30, 2020-12-30 ) 的財務資料,並利用 groupby()
函數計算公司三年平均的 ROE,即可篩選出符合選股條件的標的。
最近年度毛利率>產業平均值
將最近年度的財務資料利用 groupby()
函數對產業進行分類,計算出產業平均毛利率 ( Gross Margin, GM ),即可篩選出符合選股條件的標的。
7 年內市值增加值 / 7 年內保留盈餘增加值 > 1
從資料總表中提取最近一年及七年前 ( 2015-12-31, 2022-12-30 ) 的財務資料,並利用 groupby()
函數計算單一股票 7 年內的市值增加值與保留盈餘增加值,將兩者相除後,即可篩選出符合選股條件的標的。
( 最近年度自由現金流量 / 7 年前自由現金流量) – 1 > 1
從資料總表中提取最近一年及七年前 ( 2015-12-31, 2022-12-30 ) 的財務資料,並計算最近年度自由現金流量 / 7年前自由現金流量的比率,將此比率減 1 後,即可篩選出符合選股條件的標的。
將符合上述 5 項選股條件的股票取交集即可獲得我們的標的,可以發現以電子零組件業與半導體業為大宗。
資料期間從 2023–01–01 至 2023–12–31,並導入上述 17 檔股票的價量資料與加權股價報酬指數 ( IR0001 )。
start = '2023-01-01'
end = '2023-12-31'
os.environ['mdate'] = start + ' ' + end
os.environ['ticker'] = ' '.join(tickers) + ' ' + 'IR0001'
!zipline ingest -b tquant
initialize()
函式用於定義交易開始前的每日交易環境,於此例中我們設置:
from zipline.api import *
from zipline.finance import commission, slippage
def initialize(context):
set_slippage(slippage.VolumeShareSlippage(volume_limit = 0.025, price_impact = 0.1))
set_commission(commission.Custom_TW_Commission(min_trade_cost = 20, discount = 1.0, tax = 0.003))
set_benchmark(symbol('IR0001'))
context.day = 0
context.tickers = tickers
handle_data()
為構建買進持有交易策略的重要函式,會在回測開始後每天被呼叫,主要任務為設定交易策略、下單與紀錄交易資訊。在此範例中,我們加入下單函式 order_percent()
,用以將資產均分購買 17 檔標的。
def handle_data(context, data):
# 回測第一天買進
if context.day == 0:
for ticker in context.tickers:
order_percent(symbol(ticker), 1 / len(tickers))
context.day += 1 # 以免重複買進,並紀錄交易天數
使用 run_algorithm()
執行上述設定的交易策略,設置交易期間為 start_date ( 2023-01-01 ) 到 end_date ( 2023-12-31 ),所使用資料集為 tquant,初始資金為 10,000,000 元。其中輸出的 results 就是每日績效與交易的明細表。
from zipline import run_algorithm
start_date = pd.Timestamp(start, tz = 'utc')
end_date = pd.Timestamp(end, tz = 'utc') # 轉換成時間序列格式
capital_base = 1e7
results = run_algorithm(
start = start_date,
end = end_date,
initialize = initialize,
handle_data = handle_data,
analyze = analyze,
bundle = 'tquant',
capital_base = capital_base,
)
results
藉由上圖我們可以看到 2023 年整體呈現牛市,大盤的報酬率來到 30 % 左右,不過巴菲特企業投資法則所選出的標的更是超越大盤約 20 個百分點,累積報酬率達到 51.525 %;另外,此投組的 Alpha 值為 0.24、Beta 值為 0.8,意味著巴菲特企業投資法則不僅承受比大盤小的系統風險,同時也能賺取超額報酬。
另外,我們也在下方繪製夏普比率圖來觀察在承受相同單位的風險下,巴菲特企業投資法則是否確實能獲得較高的超額報酬。
觀察上圖,我們可以發現巴菲特企業投資法則投組的夏普比率大部分都超過大盤,並且平均來到約 2.4 左右,因此企業投資法則的確能幫助我們在承受一定水平的風險之下賺取比大盤更多的報酬。
本次實作我們利用巴菲特企業投資法則的 5 大選股條件,結合 TejToolAPI 進行基本面選股,再利用 TQuant Lab 進行買進持有標的一年的回測績效分析。從分析結果看來,不論是報酬率,抑或是 Alpha 值、Beta 值和夏普比率,巴菲特企業投資法則都展現出極佳的穩定性與賺取超額報酬的能力,也難怪這套法則會如此歷久不衰。
筆者認為巴菲特企業投資法則難能可貴的是,很多投資人會因為股市的短期波動而失去理性,從而提早出場,少賺到不少報酬;而巴菲特企業投資法則反而讓我們了解到只要在投資前依據每間公司的獲利特性篩選績優股票,並長期持有這些股票,便能幫助我們高枕無憂的獲取超額報酬。
溫馨提醒,本次策略與標的僅供參考,不代表任何商品或投資上的建議。之後也會介紹使用 TEJ 資料庫來建構各式指標,並回測指標績效,所以歡迎對各種交易回測有興趣的讀者,選購 TQuant Lab 的相關方案,用高品質的資料庫,建構出適合自己的交易策略。
電子報訂閱