(一)不同來源的數據合並
需要注意的是,由於國債收益率從Wind導入(為數據框類型),而股票數據是使用quantmod包爬取(為zoo、xts類型),因此出現了數據類型和時間不匹配問題。
先通過設置UTC(美國標准時間)來避免時區不一致問題(因為后面的合並是基於索引),再將國債日收益率導入,然后轉化為xts類型數據,最后根據索引來合並,最后得到需要的兩個變量。具體見下面:
ir=read.table(“clipboard”,header=T) Sys.setenv(TZ = "UTC") #設置時區 r=data.frame(ir[,2]) date=as.POSIXlt(ir[,1]) rownames(r)=date gr=as.xts(r) #轉化為xts 類型數據 data1=merge.xts(SR_daily,gr/30,join="inner") data2=merge.xts(GR_daily,gr/30,join="inner") data=merge.xts(SR_daily/100,gr/30,join="inner")#merge函數除了inner參數,還有outer、left等參數 x=data1[,1]-data1[,2] y=data2[,1]-data2[,2]
(二)均值回歸
#回歸分析 setSymbolLookup(SZZZ=list(name="000001.ss",src='yahoo')) getSymbols("SZZZ",from=from,to=to) ZR=dailyReturn(na.approx(SZZZ[,4]),type="log") lr=lm(ZR~SR_daily) summary(lr) #異方差檢驗 library(lmtest) sde=resid(lr) chartSeries(sde) bptest(lr,studentize=FALSE)#Breusch-Pagan test gqtest(lr)#Goldfeld-Quandt test #自相關檢驗 acf(sde) pacf(sde) dwtest(lr)#Durbin-Watson test bgtest(lr)#Breusch-Godfrey test Box.test(sde1)#Box-Pierce test #正態檢驗 hist(sde,nclass = 200) st(sde)#shapiro.te分析
(三)分位數回歸
從最小二乘法可以看出,傳統回歸中最小化殘差的平方極易受極端值的影響,而且屬於均值回歸,這種方法不能得到不同分布下的數據關系,而分位數回歸與均值回歸的區別在於參數估計,通過對不同分布下的殘差進行賦權來估計系數,屬於最小一乘加權估計,其參數估計是優化求解問題。
分位數回歸不考慮同方差、正態分布的假設,具有異常點抗耐性、捕捉分布尾部特征等特點,回歸結果更加穩健。
library(quantreg) r2=rq(ZR~SR_daily,tau=c(0.05,0.25,0.5,0.75,0.95)) summary(r2) Z=as.numeric(ZR) S=as.numeric(SR_daily) taus=c(0.05,0.25,0.5,0.75,0.95) plot(Z,S) for(i in 1:length(taus)){ abline(rq(ZR~SR_daily,tau=taus[i])) }
(四)嶺回歸——帶二范數懲罰的最小二乘回歸
在實際情況中,如果樣本數量不足使得X’X不可逆,或者存在共線性,我們將無法使用OLS回歸,這時我們可以通過加入懲罰函數使得可逆,或者以較小偏差的代價(即有偏估計)來降低方差。根據不同的懲罰函數,估計方法有彈性網(嶺回歸、Lasso、ENet等)、非凸(SACD等)、極大極小凸點(MCP等)等方法。具體各種方法是如何加入懲罰函數的可以自學。下面是嶺回歸實現:
library(MASS) S1=SR_daily S2=dailyReturn(na.approx(AB[,4]),type="log") r3=lm.ridge(ZR~S1+S2) plot(lm.ridge(ZR~S1+S2,lambda=seq(0,10,0.5)))#得到嶺跡圖
select(lm.ridge(ZR~S1+S2,lambda=seq(0,10,0.5)))
(五)Lasso回歸——解決多重共線性
library(lars) data=matrix(nrow=length(S1),ncol=2) data[,1]=S1 data[,2]=S2 r4=lars(data,ZR) plot(r4)