TQuant Lab 華倫.巴菲特企業投資法則

巴菲特企業投資法則
Photo by Scott Graham on Unsplash

本文重點概要

  • 文章難度:★★☆☆☆
  • 本文改編自巴菲特價值投資策略,以 TejToolAPI 抓取巴菲特企業投資法則所需之財務資料,將資料進行整理後,找出符合企業投資法則的標的。
  • 運用 TQuant Lab 將符合企業投資法則的標的進行買進持有一年 ( 2023 ),觀察其風險與報酬表現。

前言

華倫.巴菲特 ( Warren E. Buffett ) 是全世界有史以來,靠股票賺最多錢的人。從 1956 年以 100 美元起家,時至今日他的個人淨資產已經超過 1300 億美元,成為全球第 5 富有的人。

巴菲特一生固守理性的投資原則,他的企業投資法則著重關注一家企業的發展前景是否看好、企業的經營團隊是否理性且誠實以及企業的財務狀況是否能替股東賺取報酬,而不理會股價每日的漲跌。簡單來說,巴菲特的企業投資法則強調以買下一家公司的心態投資,而非單純投資股票。

本文精選巴菲特企業投資法則中的五大選股條件,從利用 TejToolAPI 抓取財務資料與篩選標的,到使用 TQuant Lab 回測標的的投資風險與績效,我們將一窺巴菲特的投資風格,並體會企業投資法則帶來超額報酬的能力。

巴菲特企業投資法則 – 五大選股條件

由於巴菲特的企業投資法則中,部份是無法量化的,因此只選取可量化的選股條件,其背後的原理皆為公司能幫股東賺錢的能力高。選股條件如下:

  1. 最近年度股東權益報酬率 > 產業平均值
  2. 3 年平均股東權益報酬率 > 15%
  3. 最近年度毛利率 > 產業平均值
  4. 7 年內市值增加值 / 7 年內保留盈餘增加值 > 1
  5. ( 最近年度自由現金流量 / 7 年前自由現金流量 ) – 1 > 1

因為股東權益報酬率可以藉由增加舉債來提升,因此我們排除金融產業這類高槓桿的產業。另外對於每一元的保留盈餘,巴菲特希望企業能創造超過一元的市場價值,由於這牽涉到公司的上市年限是否夠久,因此我們篩選上市時間大於 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 可篩掉金融產業

使用 TejToolAPI 抓取所需的財務資料

根據企業投資法則中的選股條件,我們需要的財務科目有以下 7 項:

  1. 主產業別_中文
  2. 常續ROE
  3. 營業毛利率
  4. 個股市值_元
  5. 保留盈餘
  6. 營運產生現金流量
  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
巴菲特企業投資法則
利用 TejToolAPI 提取之財務資料總表

標的篩選

選股條件 1

最近年度股東權益報酬率>產業平均值

從資料總表中提取最近年度 ( 2022-12-30 ) 的財務資料,並利用 groupby() 函數對產業進行分類,計算出產業平均 ROE,即可篩選出符合選股條件的標的。

巴菲特企業投資法則
產業平均 ROE 資料

選股條件 2

3年平均股東權益報酬率>15%

從資料總表中提取最近三年 ( 2022-12-30, 2021-12-30, 2020-12-30 ) 的財務資料,並利用 groupby() 函數計算公司三年平均的 ROE,即可篩選出符合選股條件的標的。

巴菲特企業投資法則
公司 3 年平均 ROE

選股條件 3

最近年度毛利率>產業平均值

將最近年度的財務資料利用 groupby() 函數對產業進行分類,計算出產業平均毛利率 ( Gross Margin, GM ),即可篩選出符合選股條件的標的。

巴菲特企業投資法則
產業平均毛利率資料

選股條件 4

7 年內市值增加值 / 7 年內保留盈餘增加值 > 1

從資料總表中提取最近一年及七年前 ( 2015-12-31, 2022-12-30 ) 的財務資料,並利用 groupby() 函數計算單一股票 7 年內的市值增加值與保留盈餘增加值,將兩者相除後,即可篩選出符合選股條件的標的。

巴菲特企業投資法則
個股市值增加值、保留盈餘增加值與兩者相除之指標資料

選股條件 5

( 最近年度自由現金流量 / 7 年前自由現金流量) – 1 > 1

從資料總表中提取最近一年及七年前 ( 2015-12-31, 2022-12-30 ) 的財務資料,並計算最近年度自由現金流量 / 7年前自由現金流量的比率,將此比率減 1 後,即可篩選出符合選股條件的標的。

巴菲特企業投資法則
兩年度自由現金流量相除之比率與選股條件所需之指標

取出符合 5 項選股條件的標的

將符合上述 5 項選股條件的股票取交集即可獲得我們的標的,可以發現以電子零組件業與半導體業為大宗。

巴菲特企業投資法則
符合 5 項選股條件之標的

TQuant Lab 回測買進持有標的 1 年的績效與風險

資料導入

資料期間從 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 函式

initialize() 函式用於定義交易開始前的每日交易環境,於此例中我們設置:

  • 流動性滑價
  • 交易手續費
  • 加權股價報酬指數 ( IR0001 ) 為基準
  • 設定 context.day 記錄交易天數
  • 設定 context.tickers 記錄股票標的
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 函式

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
巴菲特企業投資法則
交易明細表

利用 pyfolio 進行績效評估

巴菲特企業投資法則
回測表現與大盤比較圖

藉由上圖我們可以看到 2023 年整體呈現牛市,大盤的報酬率來到 30 % 左右,不過巴菲特企業投資法則所選出的標的更是超越大盤約 20 個百分點,累積報酬率達到 51.525 %;另外,此投組的 Alpha 值為 0.24、Beta 值為 0.8,意味著巴菲特企業投資法則不僅承受比大盤小的系統風險,同時也能賺取超額報酬。

另外,我們也在下方繪製夏普比率圖來觀察在承受相同單位的風險下,巴菲特企業投資法則是否確實能獲得較高的超額報酬。

巴菲特企業投資法則
夏普比率比較圖

觀察上圖,我們可以發現巴菲特企業投資法則投組的夏普比率大部分都超過大盤,並且平均來到約 2.4 左右,因此企業投資法則的確能幫助我們在承受一定水平的風險之下賺取比大盤更多的報酬。

結論

本次實作我們利用巴菲特企業投資法則的 5 大選股條件,結合 TejToolAPI 進行基本面選股,再利用 TQuant Lab 進行買進持有標的一年的回測績效分析。從分析結果看來,不論是報酬率,抑或是 Alpha 值、Beta 值和夏普比率,巴菲特企業投資法則都展現出極佳的穩定性與賺取超額報酬的能力,也難怪這套法則會如此歷久不衰。

筆者認為巴菲特企業投資法則難能可貴的是,很多投資人會因為股市的短期波動而失去理性,從而提早出場,少賺到不少報酬;而巴菲特企業投資法則反而讓我們了解到只要在投資前依據每間公司的獲利特性篩選績優股票,並長期持有這些股票,便能幫助我們高枕無憂的獲取超額報酬。

溫馨提醒,本次策略與標的僅供參考,不代表任何商品或投資上的建議。之後也會介紹使用 TEJ 資料庫來建構各式指標,並回測指標績效,所以歡迎對各種交易回測有興趣的讀者,選購 TQuant Lab 的相關方案,用高品質的資料庫,建構出適合自己的交易策略。

【TQuant Lab回測系統】解決你的量化金融痛點

全方位提供交易回測所需工具

原始碼

延伸閱讀

相關連結

返回總覽頁
Procesing