CAPMの拡張として、マルチファクターモデルが登場し、そのマルチファクターモデルには、様々な種類があることを確認しました。今回は特に有名なマルチファクターモデルの一つであるファーマフレンチのファクターモデルについて紹介していきたいと思います。
ファーマフレンチのマルチファクターモデルとは?
ファーマフレンチのファクターモデルにはいくつか種類がありますが、最も有名なものが、1993年にユージン・ファーマとケネス・フレンチにより発表されたファーマフレンチの3ファクターモデルです。
この3ファクターモデルは市場ポートフォリオ(マーケットファクター)、時価総額(サイズファクター)、簿価時価比率(PBRの逆数)(バリューファクタ―)の3つの要素(ファクター)が株式のリターンを決める要因だと提案しているモデルになります。
このモデルは、それ以前に主要な資産価格モデルであった資本資産価格モデル(CAPM)に比べ、モデルの説明力(精度)が高いことが高いことが示されており、現在では良く用いられます。
その後、3ファクターモデルを拡張した5ファクターモデルや、さらにモメンタムファクターを加えたモデルなども発表されています。
ここからはそれぞれのファクターについてもう少し詳しく見ていきます。
3ファクターモデル
まずは、ファーマフレンチの3ファクターモデルについてです。このモデルは、名前の通り、ファクターとして、3つのファクターを株式リターンを決める要因として考えます。
その3つとは、マーケットファクター、サイズファクター、バリューファクターの3つになります。
マーケットファクター
まずマーケットファクターについてですが、これはCAPMで扱うベータと同じような意味を持つ部分になります。
市場変動に連動する要素だと思えば大丈夫です。
このファクターが大きい銘柄というのは、例えば、日本株の例で考えると、TOPIXが1%上昇した時に、2倍の2%上昇するような株式をイメージするといいです。
逆に、このファクターが小さい銘柄というのは、TOPIXが1%動いた時に、半分の0.5%程度しか動かないような銘柄をイメージするといいでしょう。
このように、市場ポートフォリオであるTOPIXが動いたときに、個別の株がどのくらい動くかは、もちろんTOPIXの動きと相関しやすいですが、その動きやすさは銘柄によって異なるという部分を考慮するのがこのマーケットファクターになります。
サイズファクター
続いて、サイズファクターです。
サイズファクターを一言で表すと、小型株の方が大型株よりも高いリターンをもたらすということを示したファクターになります。
詳細は、後ほどで紹介しますがイメージとしては、小型株グループのリターンの平均から大型株グループのリターンの平均を引いたものがこのサイズファクターのリターンだと考えてください。
なぜ、小型壁の方が大型株よりもリターンが高くなるのかというところに関しては、様々な議論がありますが、小型壁の方が大型株よりも倒産しやすいので、その分リスクプレミアム、つまり、収益は高くなければいけないというような考え方があります。
バリューファクター
バリューファクターは、割安な銘柄ほどリターンが高いというファクターになります。
株式の割安割高を評価する指標としては、様々なものがあると思いますが、ファーマフレンチではBook-to-Market(B/P)、つまり、簿価/株価であるPBRの逆数を用いています
PBRの高い銘柄ほど割高でPBRの低い銘柄ほど割安になるので、イメージとしては、PBRの低い銘柄の方が高いリターンが得られるということを示しています。実際の計算においては、PBRの逆数を用いているのでB/Pの高い銘柄ほど、高いリターンが得られる(そのほかのファクターの値が同じ場合)ということになります。
5ファクターモデル
5ファクターモデルは、3ファクターモデルで用いられる、マーケットファクター、サイズファクター、バリューファクターの3つに加えて収益性ファクターと投資ファクターを加えたモデルになります。
それぞれのファクターについて見ていきます。
収益性ファクター
収益性ファクターは、収益性の高い企業の方が、リターンが高くなるということをということを示すファクターになります。
そのまま聞くと、そのように感じるかもしれません。しかし、よくよく考えると、割安株の方が高くなるのと、反対のことを示しているのではないかと、疑問に思うこともあるかもしれません。 ここに関しては確かに収益収益性の高い銘柄の中には 既に売高になっている株も多くありますが、一部の銘柄に関しては、まだ割安で残っているかもしれません。したがって、必ずしも割高=収益性が高いというわけでもないのです。
投資ファクター
投資ファクターは、投資を行わない企業の方が、リターンが高いというのを示すファクターになります。
収益性ファクターと投資ファクターは配当割引モデルという株価モデルにおいて、株価の決定要因として考慮されるべきものだとして、ファクターとして追加されました。
Carhart 4ファクターモデル
ファーマフレンチのモデルの拡張として、有名なモメンタムファクターを加えたモデルを紹介します。
Carhart 4ファクターモデルはファーマフレンチの3ファクターモデルに、価格が上昇している株式がその後も上昇し続けるというモメンタム効果のファクターを追加したモデルになります。
モメンタムファクターとは、過去上昇した株はこれからも上昇しやすく、逆に過去下落した銘柄は、これから下落しやすいということを示すファクターになります。
このモメンタムを計測する期間として、よく用いられるのは直近1ヶ月を除いた過去12ヶ月のリターンになります。この値がプラスの銘柄はその後1か月のリターンが高く、低い銘柄はその後1か月のリターンも低いということを示しています。
ファクターリターンの計算方法
ここまでファーマ・フレンチらが様々なファクターを提案してきたことを見てきました。
実際にこれらのファクターをどのように、計算することができるのか、ここでは見ていきたいと思います
イメージしやすいように、ここでは、まずは、サイズファクターを例に考えてみたいと思います。
各銘柄の時価総額に応じて、銘柄を並び替えます。そして、時価総額の小さい上位30%の銘柄の平均リターンから時価総額の大きい上位30%の銘柄の平均リターンを引引いたものがサイズリターンになります。
次に、バリューファクターの場合を考えます。この場合もB/Pの高い上位30%の銘柄のリターンの平均からB/Pの低い上位30%の銘柄のリターンを引くことによって、基本的には求められます。しかし、実際のファーマフレンチの論文では、一工夫がなされています。
バリューファクターの効果など、ファクターの効果は調べてみると、サイズごとに異なっているということが見られました。 したがって、様々なサイズの銘柄が混ざった状態で、並び替えを行なってもうまく目的としたファクターが抽出されにくいということが生じていました。
そこで、まずは、銘柄全体を大型株と小型株の二種類に分類します。そして、それらの分類の中で、B/Pに基づいて、銘柄を3グループに分割してファクターリターンを計測するという方法を取ります。つまり、B/Pの高い上位30%の銘柄のリターンの平均からB/Pの低い上位30%の銘柄のリターンを引くということです。これを大型株のグループと小型株のグループ、それぞれに対して行い、そこで得られたリターンを平均したものが、そのファクターのリターンとするというのが、工夫になります。これを論文では、2×3ソートといったように表記しています。
説明だけだとわかりにくいと思いますので、サンプルデータを用いて、実際にPythonでファクターリターンを求める手順をコードにしてみます。
記事の最後にそのまま動かせるGoogleColabのコードも置いています。
import numpy as np
import pandas as pd
# ランダムなサンプルデータを生成
np.random.seed(0)
num_stocks_per_date = 100
num_periods = 60
dates = pd.date_range(start='2020-01-01', periods=num_periods, freq='M')
num_stocks = num_stocks_per_date * num_periods
data = pd.DataFrame({
'Date': np.repeat(dates, num_stocks_per_date),
'MarketCap': np.random.rand(num_stocks) * 1e10, # 時価総額
'BookToMarket': np.random.rand(num_stocks), # B/M比率
'Return': np.random.randn(num_stocks) / 100 # リターン
})
# 時価総額の中央値で大小に分割
median_market_cap = data.groupby('Date')['MarketCap'].transform('median')
data['Size'] = np.where(data['MarketCap'] >= median_market_cap, 'Big', 'Small')
# B/M比率の30分位点と70分位点でバリューとグロースに分割
bm_30 = data.groupby('Date')['BookToMarket'].transform(lambda x: x.quantile(0.3))
bm_70 = data.groupby('Date')['BookToMarket'].transform(lambda x: x.quantile(0.7))
data['Value'] = np.where(data['BookToMarket'] >= bm_70, 'High',
np.where(data['BookToMarket'] <= bm_30, 'Low', 'Neutral'))
# 2×3ポートフォリオの割り当て
data['Portfolio'] = data['Size'] + '-' + data['Value']
# ポートフォリオごとのリターンを計算
portfolio_returns = data.groupby(['Date', 'Portfolio'])['Return'].mean().unstack()
# HMLファクターを計算(Highポートフォリオの平均リターン - Lowポートフォリオの平均リターン)
portfolio_returns['HML'] = (portfolio_returns['Big-High'] + portfolio_returns['Small-High']) / 2 - \
(portfolio_returns['Big-Low'] + portfolio_returns['Small-Low']) / 2
# 結果を表示
portfolio_returns[['Big-High', 'Big-Low', 'Small-High', 'Small-Low', 'HML']]
このコードの説明:
1. ランダムなサンプルデータを生成します。各株式の時価総額、B/M比率、およびリターンを含みます。
2. 時価総額の中央値を使用して、株式を「Big」と「Small」に分類します。
3. B/M比率の30分位点と70分位点を使用して、株式を「High」、「Neutral」、「Low」に分類します。
4. サイズとバリューに基づいて、6つのポートフォリオ(Big-High、Big-Neutral、Big-Low、Small-High、Small-Neutral、Small-Low)に分類します。
5. 各ポートフォリオのリターンを計算します。
6. HMLファクター(High Minus Low)を計算し、結果を表示します。
ファーマフレンチのファクターリターンをダウンロードしよう
ファーマフレンチのファクターリターンの値はウェブサイトで公開され、毎月更新されています。このデータを使った検証や分析というのは、非常によく行われているので、実際にウェブサイトからデータを取ってきて、見てみましょう。
ウェブサイトにアクセスして少しスクロールすると、様々なパターンのファクターをダウンロードすることができるようになっています。
それぞれがどのようなファクターを示しているのか、少し分かりにくいですが、よく使うものは以下です。
ファーマフレンチの3ファクターモデル(米国)
Fama/French 3 Factors
Fama/French 3 Factors [Weekly] Details
Fama/French 3 Factors [Daily]
ファーマフレンチの5ファクターモデル(米国)
Fama/French 5 Factors (2×3)
Fama/French 5 Factors (2×3) [Daily]
米国以外のデータもDeveloped Markets Factors and Returnsなどの部分ににあります。(ページのかなり下の方)
例えば日本であれば、
Fama/French Japanese 3 Factors
Fama/French Japanese 3 Factors [Daily]
などがあります。
注意点として、モメンタムファクターを加えた、6つのファクターを同時に取れるファイルは存在しないので、5ファクターのファイルを入手した後、モメンタムファクターだけは、別途入手する必要があります。
例えば、Momentum Factor (Mom) などです。
どのファクターを選択するかにもよりますが、メジャーなものは、日次、月次、年次の3パターン(一部週次も)のデータを入手することができます。年次データは月次データのファイルに一緒に格納されています。ファーマフレンチのデータベースは、米国株だけではなくて、日本株や新興国株など、幅広いユニバースに対応しているので活用できる場面も多いです。
このファーマフレンチのデータはPythonからも簡単に取得することができます。
pandas_datareaderというものを使うことで、毎回このサイトにアクセスしなくても、データを入手することができます
最後に、そのコードを紹介します。
get_ff_datanameでどんなファイルを取得できるのか一覧を得ることができます。
get_ffはget_ff_datanameで調べたデータ名をdatanameに渡すか、渡さない場合はデフォルトでは米国の5ファクターモデルの月次データを返すようにしています。GoogleColabのコードも公開しているので、実際に動かして確認してみてください。
from pandas_datareader import famafrench as ff
def get_ff_dataname():
return ff.get_available_datasets()
def get_ff(dataname=None, cycle='M', country='US', start=1960):
"""
country:US, JPN
"""
if dataname is None:
if cycle=='D':
if country == 'JPN':
dataname = 'Japan_5_Factors_daily'
else:
dataname = 'F-F_Research_Data_5_Factors_2x3_daily'
else:
if country == 'JPN':
dataname = 'Japan_5_Factors'
else:
dataname = 'F-F_Research_Data_5_Factors_2x3'
data = ff.FamaFrenchReader(dataname, start=start,).read()
if cycle=='Y':
return data[1]
else:
return data[0]
#指定しないと米国5ファクター
get_ff()
#日本の5ファクター
get_ff(country='JPN')
#データの種類を指定
get_ff('Japan_Mom_Factor')
#日次や年次でもダウンロード可能
get_ff(cycle='D')