【因子投資】3 因子資產定價模型python實作

French&Fama 3 Factor Model 的概念講解,和python代碼實作

Hayden海頓君
data-driven-investment
9 min readMar 6, 2020

--

原創不易,若轉載請先告知,本人保有法律追訴權

警語:本文為學術目的探討,不表示任何實質投資建議,本部落格也不為投資損益負責,投資人須自負盈虧。

Abstract

本文介紹諾貝爾經濟學奬得主,也是開啟了因子投資領域的大作: French&Fama 3 Factor Model 。從一開始的概念出發,接著講述執行的三大步驟,並給出重要部分的python代碼實現,最後討論每個步驟對應的注意事項。

Idea

多因子模型的核心問題是:為何個股的超額收益會在cross sectional上有所區別?

其理念是建立在效率市場假說下,市場的定價是正確,因此超額收益的數學結構為一系列因子的線性組合,換句話說,各股在cross sectional上的超額收益可以完全由各因子beta的預期收益率X所解釋。

但是只要市場出現定價錯誤,上式則會出現殘差alpha,因此,則只要殘差alpha為零,我們就可以得出各股的定價均為正確的結論,換句話說,各股在cross sectional上的超額收益可以完全由各因子beta的預期收益率X所解釋。

要特別注意的是,其不關心各股收益率在時間序列的變化(Model of the variance),只關心橫斷面的差異(Model of the mean)。因此,整個多因子模型為兩次回歸估計+一次殘差檢驗:

  • 第一步為時間序列回歸:先估計各股收益率於取樣期間內暴露於各因子程度
  • 第二步為橫斷面回歸:由第一步的因子暴露來估計各股收益率於橫斷面上對於超額收益的影響程度
  • 第三步為殘差檢定:檢定第二步的定價錯誤是否顯著為零(若殘差滿足iid Normal,則檢驗截距項)

step0. Construct Portfolio Return of each Factor

在進行第一次時序回歸之前,必須得先做兩件事:

  • 定義出因子
  • 計算出該因子的portfolio return

關於各因子的定義fama論文中已有,直接實現在下方。至於為何要使用portfolio return而不是因子值本身,是因為於這個變量是要放到第一步的時序回歸中,因此必須得為portfolio return才有意義,這有點像是對各股的期間報酬率分佈做線性分解的感覺

R_big_mkcap = results[results.big_mkcap]['Returns'].groupby(level='date').mean()
R_sm_mkcap = results[results.sm_mkcap]['Returns'].groupby(level='date').mean()

R_big_bpr = results[results.big_bpr]['Returns'].groupby(level='date').mean()
R_sm_bpr = results[results.sm_bpr]['Returns'].groupby(level='date').mean()

R_big_ret = results[results.big_ret]['Returns'].groupby(level='date').mean()
R_sm_ret = results[results.sm_ret]['Returns'].groupby(level='date').mean()

# Defining our final factors
features = (pd.DataFrame()
.assign(EXMRKT = Mk_ret - Risk_Free)
.assign(SMB = R_big_mkcap - R_sm_mkcap)
.assign(HML = R_big_bpr - R_sm_bpr)
.assign(MMT = R_big_ret - R_sm_ret)
)
features.hist()

step1. Time Series Regression

第一個回歸為跟對個股各別做時間序列回歸,其意義近似對該期間各股的總報酬率分佈做線性分解,分解的各項次為各因子的portfolio return。

from statsmodels.regression import linear_model
import statsmodels.api as sm

VAR_LIST = ['EXMRKT', 'SMB', 'HML', 'MMT', 'const']
TARGET = ['Returns']

def fama_ols(df, target, var_list):
df = sm.add_constant(df)
X = df[var_list].values
y = df[target].values
return linear_model.OLS(y, X).fit().params

ols_res = data.groupby(level='asset').apply(fama_ols, TARGET, VAR_LIST) # return a seris

ols_res = (pd.DataFrame(index=ols_res.index)
.assign(EXMRKT=ols_res.apply(lambda s:s[0]))
.assign(SMB=ols_res.apply(lambda s:s[1]))
.assign(HML=ols_res.apply(lambda s:s[2]))
.assign(MMT=ols_res.apply(lambda s:s[3]))
.assign(Const=ols_res.apply(lambda s:s[4]))
)
ols_res.head()

step2. Cross-Sectional Regression

記住,step1代表取樣期間內各股的收益率對於個因子的暴露,若把其視覺化則為下圖,我們現在要做的是由第一步的因子暴露來估計各股收益率於橫斷面上對於超額收益的影響程度,所以估計出來的係數為橫斷面上的回歸直線斜率

至於要如何進行估計呢?這裡用了兩大假設手法幫助我們進行估計。首先,必須先想方法消除各股收益率於時間序列上的相關性,透過假設收益率於時序上的相關性由i.i.d.均值為零的殘差所構成,因此只要透過取時間序列上的平均值即可消除。再來,是假設各股的預期收益即為該因子選股策略於時間序列上的均值,(順帶解釋了step0中其必須為portfolio return的原因)

透過上述兩大手法,可以得出此後step1中各股的截距即為定價錯誤

### Regression - 2: estimating the risk premia ###
betas = sm.add_constant(ols_res.drop('Const', axis=1))
risk_premium = data['Returns'].mean(axis=0, level='asset') - np.mean(Risk_Free)
final_res = linear_model.OLS(risk_premium, betas).fit()

step3. Hypothesis Test

最後一步,只要檢驗step2回歸的截距係數是否統計上顯著為零,若為零則代表各因子能夠有效的解釋個股超額收益於橫斷面上的差異,換句話說,這些因子能有效的進行資產定價。

Discussion

接下來梳理一些重點和相關的問題,首先整個多因子模型為兩次回歸估計+一次殘差檢驗,每個步驟都有相應的重點和技巧

step1. Time Series Regression

這步驟中最重要的兩點為,一定要使用portfolio return,且不需要對其進行資料預處理,例如標準化等,因為我們假設其為step2的預期收益率。再來,我們必須對時序回歸結果在時間上取均值。

step2. Cross-Sectional Regression

在這一步中三大重點。首先,是不要求Cross-Sectional的變量必須為portfolio return,可以採用更多的經濟變量,例如GDP,通膨率等等。接著,估計手法不一定要為OLS,若OLS估計之間殘差之間不滿足Homoskedisity,則可以使用其他估計技巧如GLS, WLS等。最後,回歸的數學模型是否要有截距項呢?可以先使用沒有截距項的回歸,此時以最小化殘差平方和為目標,接著比較有截距項的結果,若兩者對於因子係數的估計出現一正一負的情況,則必須考慮因子的選擇可能有問題的情況。

step3. Hypothesis Test

這步驟有兩大問題,首先是step1時序回歸殘差ε是否滿足i.i.d.常態的假設,若其滿足,則可以直接使用step2截距項的F檢定,或者是使用 GRS test。如果不滿足的話,則必須使用Generalized Method of Momentums(Lars Peter Hansen, 1982)來檢驗step2截距項,或是考慮更換step2估計方法。

Conclusion

三因子模型是因子投資的代表作,也是後續BarraRiskModel的基礎,因此得獎實在是名符其實。然而,隨著近年來因子挖掘的風氣興盛,越來越多的因子被挖掘出來後失效,人們開始討論是否此領域已經走向data mining式挖掘的路線,對於因子的有效性請參閱敝人的著作:【因子投資】以機器學習驗證 3因子模型: Lasso Regression

--

--