Fama-French 3ファクターモデルの基本とPython実装

5分で読了
更新日
Progress 7 / 12
目次

「なぜあの株は、市場全体よりも高いリターンを出しているのか?」

投資の世界に足を踏み入れると、誰もが一度は抱く疑問です。以前に紹介した平均分散最適化やリスクパリティも強力な武器ですが、より深く「リターンの源泉」を理解するためのモデルとして、Fama-French 3ファクターモデルを外すことはできません。

このモデルはそのシンプルさと高い実用性から、多くのアナリストに支持されています。本記事では、このモデルがCAPMからどう進化したのか、具体的な計算方法、そしてPythonでの実装例までをエンジニア目線で分かりやすく解説します。

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ファクターモデルといえます。

RtRf=α+βiMKT(RmRf)+βiSMBSMB+βiHMLHML+ϵtR_t - R_f = \alpha + \beta_{i}^{MKT} (R_m - R_f) + \beta_i^{SMB} \text{SMB} + \beta_i^{HML} \text{HML} + \epsilon_t Rt:個別株またはポートフォリオのリターンRf:無リスク金利α:アルファβiMKT:市場ポートフォリオのリスクプレミアムに対するベータβiSMB:サイズファクターに対するベータβiHML:バリューファクターに対するベータRm:マーケットポートフォリオのリターンSMB:サイズファクター(小型株のリターンが大型株を上回るリターン)HML:バリューファクター(バリュー株のリターンがグロース株を上回るリターン)ϵt:残差項\begin{aligned} R_t &: \text{個別株またはポートフォリオのリターン} \\ R_f &: \text{無リスク金利} \\ \alpha &: \text{アルファ} \\ \beta_{i}^{MKT} &: \text{市場ポートフォリオのリスクプレミアムに対するベータ} \\ \beta_{i}^{SMB} &: \text{サイズファクターに対するベータ} \\ \beta_{i}^{HML} &: \text{バリューファクターに対するベータ} \\ R_m &: \text{マーケットポートフォリオのリターン} \\ \text{SMB} &: \text{サイズファクター(小型株のリターンが大型株を上回るリターン)} \\ \text{HML} &: \text{バリューファクター(バリュー株のリターンがグロース株を上回るリターン)} \\ \epsilon_t &: \text{残差項}\\ \end{aligned}

SMBとHMLの計算方法

下のノートがわかりやすかったので貼っておきます。わかっても計算する気力は出ないですが…

glossary.mizuho-sc.com
glossary.mizuho-sc.com

SMBとHMLはマーケット全体で同じ値を用いることになります。なのでウェブ上で探せば落ちてたりします。

Kenneth R. French - Data Library

The Data Library contains current benchmark returns and historical benchmark returns data, downloads and details.

mba.tuck.dartmouth.edu

ベータの計算方法

ベータは過去のリターンデータとリスクフリーレート、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]

最後に

Fama-French 3ファクターモデルは、市場リスク、サイズ、バリューの3つの要因を考慮して、株式リターンの変動をより詳細に説明する強力なツールです。この記事を通じて、モデルの基本的な仕組みや計算方法、Pythonでの具体的な実践例を学ぶことができました。Pythonのコードは(環境差異がありますが)おそらく、ライブラリをインストールすればすぐ実行できる状態だと思いますので、ぜひ活用してください。

ポートフォリオ構築に関連する他のモデルを知りたい方は下記のリンク集をぜひご活用ください。

投資ポートフォリオ構築ガイド: モデル集

投資ポートフォリオ構築に関するモデル記事のリンク集。資産配分・期待リターン計算・リスク管理モデルを体系的にまとめています。

blog.otama-playground.com