(一)不同来源的数据合并
需要注意的是,由于国债收益率从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)