利用R语言编写量化投资策略
利用R语言编写量化投资策略 选取一股票,利用R语言进行分析,同时构建通道突破,双均线交叉和MACD策略,进行回测。 library(xts) library(xtsExtra) library(quantmod) library(FinTS) library(forecast) library(TSA) library(TTR) library(fGarch) library(rugarch) library(tseries) setSymbolLookup(MHXX=list(name= 0696.hk ,src= yahoo )) getSymbols(“MHXX“,from=“2013-01-01“,to=“2015-09-30“) #显示K线图,如图明显发觉股价呈现递增趋势,价格序列是非平稳的。 chartSeries(MHXX) #考虑对数收益率 #获得收盘价 cp = MHXX[,4] lgcp=log(MHXX[,4]) #tdx =c(1:456)/365+2014 #计算日收益率 ret=dailyReturn(MHXX) chartSeries(ret,theme=“white“,TA=NULL) #plot(tdx,cp,xlab=“year“,ylab=“close price“,type= l ) #计算对数收益率,如图课件,股价在15年左右有一个跳动,15年其次季度的股价增长导致 #之后股价有较大的下降,这些特征给后续的分析带来一些较大的异样值 lgret = log(ret+1) chartSeries(lgret,theme=“white“,TA=NULL) #由ACF和PACF图可以看出,该股1股价的日收益率序列即使存在某种相关性,该自相关性也 #很小 par(mfcol=c(2,1)) acf(lgret,lag=30) pacf(lgret,lag=30) #为了验证该收益率序列有没有序列相关性,运用Ljung-Box检验,结果对应的P值0.024, #在1%的显著水平下,拒绝该股票日收益率没有显著前后相关性的这一原假设。 #但在5%的显著水平下,无法拒绝该股票日收益率没有显著前后相关性的这一原假设。 Box.test(lgret,lag=20,type= Ljung ) ############################################################################## m1 <- auto.arima(lgret,stationary=TRUE,seasonal=FALSE,ic=“aic“) #鉴于该股票对数收益率序列的自相关性并不强,所以建立的ARIMA模型可能适用性不高。 #对于对数收益率序列,单样本的t检验结果的t比为1.0625,p值为0.2884,表明该序列不是 #显著异于零的,同时此处依据ACF图所示,在4阶有稍微的超越标准差线, #因此取用AR(5)模型拟合,aic=-2987.43 m2 <- arima(x=lgret,order=c(4,0,0),include.mean=F) tratio=m2$coef/sqrt(diag(m2$var.coef)) tratio meacf=eacf(lgret,6,12) print(meacf$eacf,digits=2) #残差检验并表示改模型可能不是充分的 tsdiag(m2,gof=20) m3 <-auto.arima(ret,stationary = TRUE,seasonal = FALSE,ic=“aic“) m3 ################################################################################ #由上述可知,对于价格改变的分析,纯ARMA模型是不充分的,一方面ARMA模型不能处理 #波动率聚集,另一方面,ARMA-GARCH模型能充分处理这些数据的困难性, #并能提高样本外预料 price=ts(cp) dp=ts(diff(cp)) par(mfcol=c(2,1)) plot(price,xlab= year ,ylab= price ) plot(dp,xlab= year ,ylab= changes ) cprice=diff(price) par(mfcol=c(2,1)) acf(cprice) pacf(cprice) #aic=-0.37 m.garch1<-garchFit(~1+garch(1,1),data=cprice,trace=F) summary(m.garch1) #aic=-0.62 m.garch2<-garchFit(~arma(6,0)+garch(1,1),data=cprice,trace=F,ininclude.mean = F, cond.dist = “std“) summary(m.garch2) #aic=-0.60 m.garch3<-garchFit(~arma(2,0)+garch(1,1),data=cprice,trace=F,ininclude.mean = F, cond.dist = “std“) summary(m.garch3) #aic=-0.596 m.garch4<-garchFit(~arma(1,0)+garch(1,1),data=cprice,trace=F,ininclude.mean = F, cond.dist = “std“) summary(m.garch4) #回测检验 source(“backtestGarch.R“) M2F=backtestGarch(cprice,714,2,inc.mean=F,cdist=“sstd“) source(“backtest.R“) M2AF=backtest(m2,cprice,714,2,inc.mean=F) #ArchTest(coredata(ret)) ################################################################################ #计算VaR mgarch1<-ugarchspec(variance.model=list(garchOrder=c(1,1)), mean.model=list(armaOrder=c(0,0))) mgarch1_fit<-ugarchfit(spec=mgarch1,data=cprice) mgarch1_fit m