【FM】Fama-French 三因子模型
導航
- 實驗環境
- 數據獲取和數據預處理
- 多元線性回歸
- F檢驗
- t檢驗
- 正態性檢驗
- 多重共線性檢驗
- 線性相關性檢驗
- 獨立性檢驗
- 方差齊性檢驗
- 數據和代碼下載
- 參考資料
實驗環境
anaconda(python 3.6.8)
數據獲取和數據預處理
從Kenneth.R French Data Libratry 獲取FF-3因子數據壓縮文件,進行解壓
import pandas as pd import pandas_datareader as web import statsmodels.api as smf # 線性回歸模塊 ''' download zip file from Fama French web ''' import urllib.request import zipfiledef fetch_data():# 下載壓縮文件并解壓出csv文件ff_url='https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/F-F_Research_Data_Factors_CSV.zip'urllib.request.urlretrieve(ff_url, 'data/fama_french.zip')fzip=zipfile.ZipFile('data/fama_french.zip', 'r')# 壓縮文件解壓到指定目錄下fzip.extractall('data/')fzip.close()得到壓縮文件和解壓文件如下所示
讀取解壓文件,對數據進行預處理
使用ff_factors.head()指令查看部分因子數據
從yahoo下載AAPL的調整后收盤價數據
def fund_data(ticker, start, end):fund = web.get_data_yahoo(ticker, start, end)# 需要調整后的收盤價return fund['Adj Close']price=fund_data('AAPL', '2000-01-01', '2020-08-30') price=price.loc[:e_day]數據重采樣后和因子數據進行建表
def fund_data_return(stock_data, period='M'):# 數據重采樣后建表stock = stock_data.resample(period).last()ret = stock.pct_change()[1:] # 計算算術收益率(p(t)-p(t-1))/p(t-1)ret = pd.DataFrame(ret)ret.columns=['stock']return retret=fund_data_return(price) print(ret.tail())表連接后進行整理
def merge_data():# 表連接df_all=pd.merge(pd.DataFrame(ret), ff_data, how='inner', left_index=True, right_index=True)df_all.rename(columns={'Mkt-RF': 'mkt_ex'}, inplace=True)df_all['stock_ex']=df_all['stock']-df_all['RF']print(df_all.tail())return df_all得到合并表數據如下
多元線性回歸
將股票的超額收益率和三個因子進行多遠線性回歸,得到系數如下
df_all=merge_data() model=smf.formula.ols(formula='stock_ex~mkt_ex+SMB+HML', data=df_all).fit() print(model.params)得到因子系數如下
然后對回歸結果進行假設檢驗和模型診斷.
F檢驗
F檢驗又叫做聯合假設檢驗(joint hypothesis test),方差比率檢驗和方差齊性檢驗,在原假設H0H_0H0?下統計值服從F-分布的檢驗.
令X={x1,x2,…,xn}X=\{x_1, x_2, \dots, x_n\}X={x1?,x2?,…,xn?}和Y={y1,y2,…,ym}Y=\{y_1, y_2, \dots, y_m\}Y={y1?,y2?,…,ym?}為兩個服從正態分布的獨立時間序列,且總體方差相同σX2=σY2=σ2\sigma_X^2=\sigma_Y^2=\sigma^2σX2?=σY2?=σ2,則兩個序列均值表示為
{Xˉ=1n∑i=1nxiYˉ=1m∑i=1myi\left\{ \begin{aligned} &\bar{X}=\frac{1}{n}\sum_{i=1}^n x_i \\ &\bar{Y}=\frac{1}{m}\sum_{i=1}^m y_i \end{aligned} \right. ?????????????Xˉ=n1?i=1∑n?xi?Yˉ=m1?i=1∑m?yi??
求出方差為
{sX2=1n?1∑i=1n(xi?Xˉ)2sY2=1m?1∑i=1m(yi?Yˉ)2\left\{ \begin{aligned} &s_X^2=\frac{1}{n-1}\sum_{i=1}^n (x_i-\bar{X})^2 \\ &s_Y^2=\frac{1}{m-1}\sum_{i=1}^m (y_i-\bar{Y})^2 \end{aligned} \right. ?????????????sX2?=n?11?i=1∑n?(xi??Xˉ)2sY2?=m?11?i=1∑m?(yi??Yˉ)2?
由于對于正態分布總體而言
(N?1)s2σ2~χ2\frac{(N-1)s^2}{\sigma^2}\sim \chi^2 σ2(N?1)s2?~χ2
根據F分布的定義可以得到
(n?1)sX2/σX2n?1/(m?1)sY2/σY2m?1=σX2=σY2=σ2sX2sY2~F(n?1,m?1)\frac{(n-1)s_X^2/\sigma_X^2}{n-1}\bigg/\frac{(m-1)s_Y^2/\sigma_Y^2}{m-1}\xlongequal{\sigma_X^2=\sigma_Y^2=\sigma^2}\frac{s_X^2}{s_Y^2}\sim F(n-1, m-1) n?1(n?1)sX2?/σX2??/m?1(m?1)sY2?/σY2??σX2?=σY2?=σ2sY2?sX2??~F(n?1,m?1)
F分布與χ2\chi^2χ2分布類似,取值非負且為有偏,隨著自由度增大,逐漸近似于正態分布.
當F分布的分子自由度為1,分母自由度為kkk時,就轉為ttt分布
tk2=F(1,k)t_k^2=F(1, k) tk2?=F(1,k)
當k2k_2k2?無窮大時,F分布的分母收斂為1,存在如下近似關系
F(k1,k2)≈χk12/k1F(k_1, k_2)\approx \chi^2_{k_1}/k_1 F(k1?,k2?)≈χk1?2?/k1?
模型F值為42.1,遠大于在95%置信水平下的F值為2.64,所以方程整體是顯著的,即回歸系數不全為0.
t檢驗
設YYY服從正態標準分布,XXX服從自由度為kkk的χ2\chi^2χ2分布,并且兩者互相獨立,則隨機變量
t=YX/kt=\frac{Y}{\sqrt{X/k}} t=X/k?Y?
服從自由度為kkk的ttt分布
可以使用命令model.summary()從回歸結果中直接調出ttt檢驗結果
從ttt檢驗的ppp值可以發現,SMB的p值大于0.05,所以SMB是不顯著的,原模型建立為變量mkt_ex和HML的回歸模型可能會更精確.
正態性檢驗
對于多重線性回歸模型y=Xβ+εy=X\beta+\varepsilony=Xβ+ε而言,要求回歸誤差項滿足正態分布假設,由正態分布的線性性質可以知道,因變量也需要滿足正態性假設,一般正態性假設有兩種方法:1.定性的圖像法 2.定量的非參數檢驗(KS檢驗和Shapiro檢驗)
stock數據的直方圖和正態曲線擬合結果如下
可以發現,AAPL的月度收益率數據和正態曲線大致擬合.
多重共線性檢驗
多重共線性是指當模型中的自變量之間存在顯著的線性相關關系,會使得模型的參數估計量的方差增大,參數估計量意義不合理以及模型失去預測能力,可以使用膨脹因子VIF檢測,如果VIF大于10那么模型變量存在共線性,如果VIF大于100,那么變量之間存在嚴重的多重共線性.
VIF=11?Ri2VIF=\frac{1}{1-R_i^2} VIF=1?Ri2?1?
一般情況下模型容易出現近似共線性,即
c1Xi1+c2Xi2+?+ckXik+εi=0c_1X_{i1}+c_2X_{i2}+\dots+c_kX_{ik}+\varepsilon_i=0 c1?Xi1?+c2?Xi2?+?+ck?Xik?+εi?=0
其中cic_ici?不全為0,即某一個變量可以用其他解釋變量的線性組合表示,εi\varepsilon_iεi?為隨機干擾項.
檢測結果如圖
結果表明自變量之間不存在多重共線性
線性相關性檢驗
如果模型中的自變量和因變量之間存在線性相關關系,可以使用Pearson相關系數配合圖像進行可視化識別,Pearson相關系數計算公式為
ρX,Y=cov(X,Y)σXσY=E[(X?μX)(Y?μY)]σXσY\rho_{X, Y}=\frac{cov(X, Y)}{\sigma_X\sigma_Y}=\frac{\mathbb{E}[(X-\mu_X)(Y-\mu_Y)]}{\sigma_X\sigma_Y} ρX,Y?=σX?σY?cov(X,Y)?=σX?σY?E[(X?μX?)(Y?μY?)]?
調用sns.pairplot()可視化線性相關性
def corr_test():X=df_all.iloc[:, :4]# ans=X.drop('stock', axis=1).corrwith(X['stock'])# print(ans)sns.pairplot(X)plt.show()獨立性檢驗
殘差ε\varepsilonε需要進行獨立性檢驗,可以使用Durbin-Watson統計值測試,當DW值在2附近時表示殘差之間是不相關的,使用model.summary()命令可以直接查看模型的DW值.
方差齊性檢驗
要求模型的殘差的方差不隨著自變量的變動而呈現趨勢性,可以使用BP檢驗得到(具體見參考資料4).
數據和代碼下載
FF3因子壓縮文件
代碼文件
參考資料
1.Factor Based Analysis in Python
2.factor models in empirical asset pricing
3.Kenneth R. French Data Library
4.python多元線性回歸案例
5.F檢驗和P值
6.計量經濟分析方法與建模 清華大學出版社 高鐵梅
7.計量經濟學 高等教育出版社 李子奈 潘文卿
總結
以上是生活随笔為你收集整理的【FM】Fama-French 三因子模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bigemap功能介绍,视频教程
- 下一篇: 在项目中集成hibernate遇到的问题