日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【FM】Fama-French 三因子模型

發布時間:2023/12/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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()

得到壓縮文件和解壓文件如下所示

讀取解壓文件,對數據進行預處理

def unzip_file():# 讀取解壓的csv文件df_ff=pd.read_csv('data/F-F_Research_Data_Factors.csv', skiprows=3, index_col=0)# 統計無缺失且非零的完整數據的條數ff_row=df_ff.isnull().any(1).to_numpy().nonzero()[0][0]# 讀取因子數據 ff_factors=pd.read_csv('data/F-F_Research_Data_Factors.csv', skiprows=3, nrows=ff_row, index_col=0)# 處理日期格式ff_factors.index=pd.to_datetime(ff_factors.index, format='%Y%m')# 日期顯示為月末ff_factors.index=ff_factors.index+pd.offsets.MonthEnd()# 將百分比轉為小數ff_factors=ff_factors.apply(lambda x: x/100)return ff_factors

使用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=1n?xi?Yˉ=m1?i=1m?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=1n?(xi??Xˉ)2sY2?=m?11?i=1m?(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?

# 回歸模型的假設檢驗 def F_test():ybar = df_all['stock'].mean()p=model.df_model # 模型中自變量的數量n=df_all.shape[0] # 模型中樣本點的數量RSS = np.sum((model.fittedvalues-ybar)**2) # 離差平方和ESS = np.sum(model.resid**2) # 誤差平方和F = (RSS/p) / (ESS/(n-p-1))print('F-value: {}'.format(F)) # 手動計算F值print('F-value: {}'.format(model.fvalue)) # 模型F值# 在95%置信水平下的理論F值F_true = f.ppf(q=0.95, dfn=p, dfd=n-p-1)print('F-value under 95% conf. level {}'.format(F_true)

模型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?
服從自由度為kkkttt分布
可以使用命令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數據的直方圖和正態曲線擬合結果如下

def norm_plot():fig=plt.figure(figsize=(8, 6))# plt.hist(df_all['stock'], bins=50, density=True)sns.distplot(a=df_all['stock'], bins=50, fit=stats.norm, norm_hist=True,hist_kws={'color':'steelblue', 'edgecolor': 'steelblue'},kde_kws={'color':'green', 'linestyle':'--', 'label':'kde density'},fit_kws={'color':'red', 'linestyle':':', 'label':'normal density'})plt.legend()plt.show()

可以發現,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?為隨機干擾項.

# 多重共線性檢測 def vif_test():X = df_all.iloc[:, 1:4]df_vif=pd.DataFrame()df_vif['features']=X.columnsdf_vif['VIF']=[VIF(X.values, i) for i in range(X.shape[1])]print(df_vif)vif_test()

檢測結果如圖

結果表明自變量之間不存在多重共線性

線性相關性檢驗

如果模型中的自變量和因變量之間存在線性相關關系,可以使用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?)]?

def corr_test():X=df_all.iloc[:, :4]ans=X.drop('stock', axis=1).corrwith(X['stock'])print(ans)corr_test()

調用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 三因子模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。