「なぜあの株は、市場全体よりも高いリターンを出しているのか?」
投資の世界に足を踏み入れると、誰もが一度は抱く疑問です。以前に紹介した平均分散最適化やリスクパリティも強力な武器ですが、より深く「リターンの源泉」を理解するためのモデルとして、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ファクターモデルといえます。
SMBとHMLの計算方法
下のノートがわかりやすかったので貼っておきます。わかっても計算する気力は出ないですが…
SMBとHMLはマーケット全体で同じ値を用いることになります。なのでウェブ上で探せば落ちてたりします。
The Data Library contains current benchmark returns and historical benchmark returns data, downloads and details.
ベータの計算方法
ベータは過去のリターンデータとリスクフリーレート、SMB、HMBを用いて回帰問題として解くことになります。株やポートフォリオ毎で固有なので、異なる資産で同じ値を使用しないように注意してください。
Pythonで計算する
コードを書いてみます。(月次のデータで計算)
コード
import pandas as pdimport yfinance as yfimport zipfileimport urllib.requestfrom sklearn.linear_model import LinearRegressionimport 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))*100data_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.012127937393119126betas: [ 1.09145358 -0.12557649 -0.33877354]最後に
Fama-French 3ファクターモデルは、市場リスク、サイズ、バリューの3つの要因を考慮して、株式リターンの変動をより詳細に説明する強力なツールです。この記事を通じて、モデルの基本的な仕組みや計算方法、Pythonでの具体的な実践例を学ぶことができました。Pythonのコードは(環境差異がありますが)おそらく、ライブラリをインストールすればすぐ実行できる状態だと思いますので、ぜひ活用してください。
ポートフォリオ構築に関連する他のモデルを知りたい方は下記のリンク集をぜひご活用ください。
投資ポートフォリオ構築に関するモデル記事のリンク集。資産配分・期待リターン計算・リスク管理モデルを体系的にまとめています。









