以前に平均分散最適化、リスクパリティポートフォリオなど紹介しましたが、それ以外にもリスクとリターンのバランスを考えるための理論やモデルが数多く存在します。中でも、Fama-French 3ファクターモデルはそのシンプルさと実用性から、多くの投資家やアナリストに支持されています。本記事では、Fama-French 3ファクターモデルの概要、メリットとデメリット、計算方法について詳しく解説します。Pythonのコードと実際に計算した結果を載せているので、余裕がある方は実際に動かして試してみてください。
Contents
Fama-French 3ファクターモデルの概要
Fama-French 3ファクターモデルは、株式リターンを説明するためのマルチファクターモデルです。このモデルは以下の3つの要因に基づいてリターンの変動を詳細に分析します。
- 市場リスクプレミアム
- 市場全体のリスクに対するリターン。
- サイズファクター(SMB: Small Minus Big)
- 小型株のリターンが大型株を上回る傾向。
- バリューファクター(HML: High Minus Low)
- 低価格株(バリュー株)が高価格株(グロース株)を上回る傾向。
Fama-French 3ファクターモデルのメリット
- 多因子アプローチ
- 市場リスクだけでなく、サイズとバリューの要因も考慮することで、リターンの変動要因をより詳細に説明できる。
- 実証研究での支持
- 歴史が比較的深く、実際に運用される中でその説明力と有効性が確認されている。
Fama-French 3ファクターモデルのデメリット
- 複雑性の増加
- CAPM(資本資産価格モデル)に比べ、因子が増えるため理解と計算がやや複雑。
- 時代や市場による変動
- 因子の影響度は時代や市場状況によって変わるため、定期的にパラメーターの再評価が必要。
- 他の因子の無視
- モメンタムなどの他の重要な因子を考慮していないため、リターンの全てを説明できない場合がある。
Fama-French 3ファクターモデルの計算方法
Fama-French 3ファクターモデルは、以下の数式で表されます。
見ていただければわかると思いますが、2項目はCAPMの式と同等です。ベースの考え方としてはCAPMで、サイズファクターとバリューファクターから考えられるリターンを同様の考え方で式に追加したのがFama-Frenchの3ファクターモデルといえます。
\[
R_t – R_f = \alpha + \beta_{i}^{MKT} (R_m – R_f) + \beta_i^{SMB} \text{SMB} + \beta_i^{HML} \text{HML} + \epsilon_t
\]
\[
\begin{align}
R_t &: \text{個別株またはポートフォリオのリターン} \\
R_f &: \text{無リスク金利} \\
\alpha &: \text{アルファ} \\
\beta_{i}^{MKT} &: \text{市場ポートフォリオのリスクプレミアムに対するベータ} \\
\beta_{i}^{SMB} &: \text{サイズファクターに対するベータ} \\
\beta_{i}^{MKT} &: \text{バリューファクターに対するベータ} \\
R_m &: \text{マーケットポートフォリオのリターン} \\
\text{SMB} &: \text{サイズファクター(小型株のリターンが大型株を上回るリターン)} \\
\text{HML} &: \text{バリューファクター(バリュー株のリターンがグロース株を上回るリターン)} \\
\epsilon_t &: \text{残差項}\\
\end{align}
\]
SMBとHMLの計算方法
下のノートがわかりやすかったので貼っておきます。わかっても計算する気力は出ないですが…
SMBとHMLはマーケット全体で同じ値を用いることになります。なのでウェブ上で探せば落ちてたりします。
有名なのは下記のリンク先です。各ファクターのリターンを取得することができます。
https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html
ベータの計算方法
ベータは過去のリターンデータとリスクフリーレート、SMB、HMBを用いて回帰問題として解くことになります。株やポートフォリオ毎で固有なので、異なる資産で同じ値を使用しないように注意してください。
Pythonで計算する
コードを書いてみます。(月次のデータで計算)
コード
import pandas as pd
import yfinance as yf
import zipfile
import urllib.request
from sklearn.linear_model import LinearRegression
import numpy as np
# リターンデータを持ってくる
ticker = 'QQQ'
start_date = '2018-01-01'
end_date = '2023-01-01'
data = yf.download(ticker, start=start_date, end=end_date)
# 月次リターンを計算
data_resampled = data.resample("ME").ffill()
data_resampled.index = data_resampled.index.to_period("M")
# 対数リターンに変換
data_resampled["Log_Return"] = np.log(data_resampled['Adj Close'] / data_resampled['Adj Close'].shift(1))*100
data_resampled.dropna(inplace=True)
# Fama-French 3のファクターリターンを拾ってくる
ff3_url = 'https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/F-F_Research_Data_Factors_CSV.zip'
urllib.request.urlretrieve(ff3_url,'ff3.zip')
with zipfile.ZipFile('ff3.zip', 'r') as z:
ff_csv = z.extract('F-F_Research_Data_Factors.CSV')
ff3_data = pd.read_csv(ff_csv, index_col=0, skiprows = 3)
ff3_data = ff3_data[ff3_data.index.str.count(r'\d') == 6]
ff3_data = ff3_data.astype('float64')
ff3_data.index.names = ["Date"]
ff3_data.index = pd.to_datetime(ff3_data.index, format="%Y%m")
ff3_data.index = ff3_data.index.to_period("M")
# RF(リスクフリーレート)を引いて、超過リターンを計算する
ff3_factors_subset = ff3_data[
ff3_data.index.isin(data_resampled.index)
].copy()
ff3_factors_subset["Excess_Return"] = data_resampled["Log_Return"] - ff3_factors_subset["RF"]
# 回帰問題を解く
X = ff3_factors_subset[["Mkt-RF", "SMB", "HML"]]
y = ff3_factors_subset["Excess_Return"]
model = LinearRegression().fit(X, y)
# アルファとベータを出力
alpha = model.intercept_
betas = model.coef_
print(f'alpha: {alpha}')
print(f'betas: {betas}')
参考: Fama-French Factor Model in Python
実行結果
alpha: -0.012127937393119126 betas: [ 1.09145358 -0.12557649 -0.33877354]
4. 最後に
Fama-French 3ファクターモデルは、市場リスク、サイズ、バリューの3つの要因を考慮して、株式リターンの変動をより詳細に説明する強力なツールです。この記事を通じて、モデルの基本的な仕組みや計算方法、Pythonでの具体的な実践例を学ぶことができました。Pythonのコードは(環境差異がありますが)おそらく、ライブラリをインストールすればすぐ実行できる状態だと思いますので、ぜひ活用してください。
ポートフォリオ構築に関連する他のモデルを知りたい方は下記のリンク集をぜひご活用ください。