拓端tecdat|R語言Fama French (FF) 三因子模型和CAPM多因素?cái)U(kuò)展模型分析股票市場(chǎng)投資
原文鏈接:http://tecdat.cn/?p=24983
原文出處:拓端數(shù)據(jù)部落公眾號(hào)
本文我們超越了 CAPM 的簡(jiǎn)單線性回歸,探索了 Fama French (FF) 股票風(fēng)險(xiǎn)/收益的多因素模型。
FF 模型通過回歸除市場(chǎng)收益之外的幾個(gè)變量的投資組合收益來擴(kuò)展 CAPM。從一般數(shù)據(jù)科學(xué)的角度來看,F(xiàn)F 將 CAPM 的簡(jiǎn)單線性回歸(我們有一個(gè)自變量)擴(kuò)展到多元線性回歸(我們有許多自變量)。
我們要看的是FF三因素模型,它測(cè)試的是(1)市場(chǎng)收益(與CAPM相同),(2)公司規(guī)模(小與大)和(3)公司價(jià)值(賬面市值比)的解釋能力。公司價(jià)值因素在FF中被標(biāo)記為HML,代表高-低,指的是公司的賬面與市場(chǎng)比率。當(dāng)我們將投資組合的收益率與HML因子進(jìn)行回歸時(shí),我們正在調(diào)查有多少收益是由于包括高賬面市值比率的股票(有時(shí)被稱為價(jià)值溢價(jià),因?yàn)楦哔~面市值的股票被稱為價(jià)值股票)。
?
這篇文章的很大一部分內(nèi)容涉及從FF網(wǎng)站導(dǎo)入數(shù)據(jù),并對(duì)其進(jìn)行整理,以用于我們的投資組合收益。我們將看到,處理數(shù)據(jù)在概念上很容易理解,但在實(shí)際操作中卻很耗時(shí)。然而,對(duì)于任何擁有來自不同供應(yīng)商的數(shù)據(jù)流并想創(chuàng)造性地使用它們的行業(yè)來說,將不同來源的數(shù)據(jù)混在一起是一項(xiàng)必要的技能。一旦數(shù)據(jù)被整理好,擬合模型就不費(fèi)時(shí)間了。
今天,我們將使用我們通常的投資組合,其中包括:
+ SPY(標(biāo)準(zhǔn)普爾500基金)權(quán)重25%。
+ EFA(一個(gè)非美國(guó)股票基金),權(quán)重25%。
+ IJS(一個(gè)小盤股價(jià)值基金)權(quán)重20%。
+ EEM (一只新興市場(chǎng)基金)權(quán)重20%。
+ AGG(一只債券基金)權(quán)重10%。
在計(jì)算該投資組合的 beta 之前,我們需要找到投資組合的月收益率。
mbls <- c("SPY","EFA", "IJS", "EEM","AGG")
pes <-
getSymbols
w <- c(0.25, 0.25, 0.20, 0.20, 0.10)
as_t_ng <-
res %>%
to.monthly %>%
tk_tbl %>%
gather %>%
group_by%>%
p_tuaeoly <-
ase_un_lng %>%
tq_portfolio
我們將處理投資組合收益的一個(gè)對(duì)象。
Fama French?因子的導(dǎo)入和整理
我們的首要任務(wù)是獲取 FF 數(shù)據(jù),幸運(yùn)的是,F(xiàn)F 在互聯(lián)網(wǎng)上提供了他們的因子數(shù)據(jù)。我們將記錄導(dǎo)入和清理這些數(shù)據(jù)的每個(gè)步驟,在某種程度上可能有點(diǎn)過頭了。現(xiàn)在讓我們感到沮喪,但是當(dāng)我們需要更新此模型或擴(kuò)展到 5 因素案例時(shí),可以節(jié)省時(shí)間。
看看?FF website. 數(shù)據(jù)被打包為 zip 文件,所以我們需要做的不僅僅是調(diào)用?read_csv()
。讓我們使用tempfile()
?基礎(chǔ) R 中的?函數(shù)來創(chuàng)建一個(gè)名為?temp
. 這是我們將放置壓縮文件的地方。
temp <- tempfile()
R 創(chuàng)建了一個(gè)名為的臨時(shí)文件?temp
?。下載 3-factor zip。?我們想將它傳遞給?download.file()
?并將結(jié)果存儲(chǔ)在?temp
.
首先,我們將把這個(gè)字符串分成三塊:base、factor和format--這對(duì)今天的任務(wù)來說不是必須的,但是如果我們想建立一個(gè)Shiny應(yīng)用程序讓用戶從FF網(wǎng)站上選擇一個(gè)因子,或者我們只是想用一組不同的FF因子重新運(yùn)行這個(gè)分析,它就會(huì)很方便。然后我們會(huì)把這些東西粘在一起,并把字符串保存為full_url。
?
be
faor
fmt
furl <-
glue
現(xiàn)在我們傳遞?full_url
?給?download.file()
.
download.file
最后,我們可以在使用?函數(shù)read_csv()
?解壓縮數(shù)據(jù)后?讀取 csv 文件?unz()
。
Go_3_Fars <-
read_csv
head(Go_3_Fars )

我們已經(jīng)導(dǎo)入了數(shù)據(jù)集,但我們沒有看到任何因素,只是一個(gè)帶有奇怪格式日期的列。
發(fā)生這種情況時(shí),通常?可以通過跳過一定數(shù)量的包含元數(shù)據(jù)的行來修復(fù)它?。看看如果我們跳過 6 行。
Glo_as <-
read_csv(
skip = 6)
head(Glo_as )

這就是我們所期待的,5個(gè)列:一個(gè)叫做X1的列,保存著奇怪的格式化日期,然后是Mkt-Rf,表示高于無風(fēng)險(xiǎn)利率的市場(chǎng)收益,SMB表示規(guī)模因子,HML表示價(jià)值因子,RF表示無風(fēng)險(xiǎn)利率。
然而,這些數(shù)據(jù)已經(jīng)被轉(zhuǎn)化為字符格式--看看每一列的類別。
?
map(Gob3s, class)

我們有兩個(gè)選項(xiàng)可以將這些列強(qiáng)制轉(zhuǎn)換為正確的格式。首先,我們可以在導(dǎo)入時(shí)這樣做,通過cl_yps = cols
?為每個(gè)數(shù)字列提供參數(shù)?。
Gll3Ftrs <-
read_csv(unz
head(Gll3Ftrs )

這很好用,但它特定于具有這些特定列名的 FF 3 因子集。如果我們導(dǎo)入不同的 FF 因子集,我們將需要指定不同的列名。
作為一種替代方法,下面的代碼塊在導(dǎo)入后將列轉(zhuǎn)換為數(shù)字,但更通用。它可以應(yīng)用于其他 FF 因子集合。
為了做到這一點(diǎn),我們將X1列重命名為date,然后將我們的列格式改為數(shù)字。vars()函數(shù)的操作與select()函數(shù)類似,我們可以通過在date前面加一個(gè)負(fù)號(hào)來告訴它對(duì)所有列進(jìn)行操作,除了date列。
Gloa_3_Fars <-
read_csv(unz %>%
rename%>%
mutate_at
head(Gloa_3_Fars )

現(xiàn)在我們的因子有了數(shù)字?jǐn)?shù)據(jù),日期列有更好的標(biāo)簽,但格式錯(cuò)誤。
我們可以使用該?lubridate
?包將該日期字符串解析為更好的日期格式。我們將使用該?parse_date_time()
?函數(shù),并調(diào)用該?ymd()
?函數(shù)以確保最終結(jié)果為日期格式。同樣,在處理來自新來源的數(shù)據(jù)時(shí),日期,事實(shí)上,任何列都可以有多種格式。
Gll_3_ts <-
read_csv %>%
rename %>%
mutate_at%>%
mutate
head(Gll_3_ts )

日期格式看起來不錯(cuò),這很重要,因?yàn)槲覀兿胍藜?FF 日期與我們的投資組合日期匹配的因子數(shù)據(jù)。但是,請(qǐng)注意 FF 使用當(dāng)月的第一天,而我們的投資組合收益使用的是當(dāng)月的最后一天。這會(huì)將每月日期回滾到上個(gè)月的最后一天。我們 FF 數(shù)據(jù)中的第一個(gè)日期是“1990-07-01”。讓我們回滾。
Gol3Frs %>%
select %>%
mutate %>%
head

如果我們想將日期重置為月末,我們需要先添加一個(gè),然后回滾。
Gob3Fars %>%
select%>%
mutate %>%
head

我們還有其他方法可以解決這個(gè)問題--一開始,我們就可以將我們的投資組合收益率索引到indexAt = firstof。
最后,我們只想要與我們的投資組合數(shù)據(jù)一致的 FF 因子數(shù)據(jù),因此我們??在投資組合返回對(duì)象中?按?日期first()
?和?last()
日期filter()
。
Glb3Ftos <-
read_csv(unz %>%
rename%>%
mutate_at %>%
mutate) + months) %>%
filte
head(Glb3Ftos , 3)

tail(Glaos, 3)

我們用left_join(...by = "date")將這些數(shù)據(jù)對(duì)象合并起來。還將FF數(shù)據(jù)轉(zhuǎn)換為十進(jìn)制,并創(chuàng)建了一個(gè)名為R_excess的新列,保存高于無風(fēng)險(xiǎn)利率的收益。?
ff_proio_tns <-
piruq_ealaed_ntly %>%
left_join %>%
mutate
head(ff_poleus, 4)

我們現(xiàn)在有了一個(gè)包含我們的投資組合收益和 FF 因子的對(duì)象,并且可以從編碼的角度進(jìn)行我們練習(xí)中最簡(jiǎn)單的部分,也是我們的老板/同事/客戶/投資者唯一關(guān)心的部分:建模和可視化.
現(xiàn)在我們有了格式不錯(cuò)的數(shù)據(jù)。CAPM 使用簡(jiǎn)單的線性回歸,而 FF 使用具有許多自變量的多元回歸。因此,我們的 3 因子 FF 方程為?lm(R_excess ~ MKT_RF + SMB + HML
。
我們將在 CAPM 代碼流中添加一項(xiàng),即為我們的系數(shù)包括 95% 的置信區(qū)間。
ffdlrhd <-
ffptoltus %>%
do) %>%
tidy(conf.level = .95)
fdlyd %>%
mutate_if %>%
select

我們的模型對(duì)象現(xiàn)在包含一個(gè)?conf.high
?和?conf.low
?列來保存我們的置信區(qū)間最小值和最大值。
我們可以將這些結(jié)果通過管道傳輸?shù)?ggplot()
?并創(chuàng)建具有置信區(qū)間的系數(shù)散點(diǎn)圖。我不想繪制截距,因此會(huì)將其從代碼流中過濾掉。
我們用errorbar添加置信區(qū)間。
fdpynd %>%
mutate_if%>%
filter %>%
ggplot+
geom_point +
geom_errorbar +
labs +
theme_minimal +
theme

這里的結(jié)果是可以預(yù)測(cè)的,因?yàn)榕c CAPM 一樣,我們正在回歸一個(gè)包含 3 個(gè)因素的市場(chǎng)的投資組合,其中一個(gè)是市場(chǎng)。因此,市場(chǎng)因素在該模型中占主導(dǎo)地位,而其他兩個(gè)因素的置信區(qū)間為零。

最受歡迎的見解
1.R語言對(duì)S&P500股票指數(shù)進(jìn)行ARIMA + GARCH交易策略
2.R語言改進(jìn)的股票配對(duì)交易策略分析SPY—TLT組合和中國(guó)股市投資組合
3.R語言時(shí)間序列:ARIMA GARCH模型的交易策略在外匯市場(chǎng)預(yù)測(cè)應(yīng)用
4.TMA三均線期指高頻交易策略的R語言實(shí)現(xiàn)
5.r語言多均線量化策略回測(cè)比較
6.用R語言實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)股票實(shí)例
7.r語言預(yù)測(cè)波動(dòng)率的實(shí)現(xiàn):ARCH模型與HAR-RV模型
8.R語言如何做馬爾科夫轉(zhuǎn)換模型markov switching model
9.matlab使用Copula仿真優(yōu)化市場(chǎng)風(fēng)險(xiǎn)