1、利用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
2、=2015-09-30)#显示K线图,如图明显发现股价呈现递增趋势,价格序列是非平稳的。chartSeries(MHXX)#考虑对数收益率#获取收盘价cp = MHXX,4lgcp=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年第二季度的股价增长导致#之后股价有较大的下降,这些特征给后续的分析
3、带来一些较大的异常值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
4、,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.43m2 - arima(x=lgret,order=c(4,0,0),include.mean=F)tratio=m2$coef/sqrt
5、(diag(m2$var.coef)tratiomeacf=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
6、,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.37m.garch1-garchFit(1+garch(1,1),data=cprice,trace=F)summary(m.garch1)#aic=-0.62m.garch2-garchFit(arma(6,0)+garch(1,1),data=cprice,trace=F,ininclude.mean = F,cond.dist =
7、 std)summary(m.garch2)#aic=-0.60m.garch3-garchFit(arma(2,0)+garch(1,1),data=cprice,trace=F,ininclude.mean = F,cond.dist = std)summary(m.garch3)#aic=-0.596m.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=bac
8、ktestGarch(cprice,714,2,inc.mean=F,cdist=sstd)source(backtest.R)M2AF=backtest(m2,cprice,714,2,inc.mean=F)#ArchTest(coredata(ret)#计算VaRmgarch1-ugarchspec(variance.model=list(garchOrder=c(1,1),mean.model=list(armaOrder=c(0,0)mgarch1_fit-ugarchfit(spec=mgarch1,data=cprice)mgarch1_fitmgarch1_roll-ugarch
9、roll(mgarch1,cprice,n.start=120,refit.every=1,refit.window = moving,solver=hybrid,calculate.VaR = TRUE,VaR.alpha = 0.01,keep.coef = TRUE)report(mgarch1_roll,type=VaR,VaR.alpha=0.01,conf.level=0.99)#生成PLOTcprice_var-zoo(mgarch1_rollforecast$VaR,1)index(cprice_var)-as.yearmon(rownames(mgarch1_rollfore
10、cast$VaR)cprice_actual-zoo(mgarch1_rollforecast$VaR,2)index(cprice_var)-as.yearmon(rownames(mgarch1_rollforecast$VaR)plot(cprice_actual,type=b,main=99% day Var backtesting,xlab=Date,ylab=Return /VaR in percent)lines(cprice_var,col=red)legend(topright,inset=.05,c(MHXX return,VaR),col=c(black,red),lty
11、=c(1,1)mgarch1_fcst - ugarchforecast(mgarch1_fit, n.ahead = 6)mgarch1_fcstret.fcst - - qnorm(0.95) * mgarch1_fcst forecast$sigmaForret.fcstchartSeries(MHXX,name=中国民航信息,TA=NULL)addBBands()#addMACD()#量化投资策略# 通道突破 #通道突破函数=bband.bk.sim - function(stk.prc.xts, k=20, p=1.65, q=0.8) #q是交易倍数,表示资金的q分用于交易stk.
12、prc - coredata(stk.prc.xts) #把主要数据取出Timeline - index(stk.prc.xts) End - length(stk.prc.xts)MA - c( rep(0, k), 0) std - c( rep(0, k), 0) u.bound - c( rep(0, k), 0)signal - c( rep(0, k), 0) #交易信号 trd.state - c( rep(0, k), 0) #记录买卖状态share - c( rep(0, k), 0) #记录持股份数cash - c( rep(1e4, k), 0) #现金部位 value
13、- c( rep(1e4, k), 0) #资产价值=股票市值+现金部位# Sim -for( t in k:End )stk.prc.pre - stk.prc(t-k):t MAt - mean( stk.prc.pre )stdt - sd( stk.prc.pre )u.boundt - MAt + p * stdt #布林带上界signalt u.boundt ) signalt = 1 #当股票价格超出布林上界时,buyif( stk.prct-1 MAt-1 & stk.prct = MAt ) signalt = -1 if( stk.prct-1 = MAt ) signal
14、t = -1#卖的情况trd.statet - trd.statet-1 casht - casht-1sharet - sharet-1valuet - valuet-1#更新交易状态、持股数目、现金金额if( trd.statet-1 = 0 & signalt = 1 ) trd.statet - 1sharet - ( q * casht-1 ) / stk.prctcasht - casht-1 - sharet*stk.prctif( trd.statet-1 = 1 & signalt = -1 )trd.statet - 0sharet - 0casht - casht-1 +
15、 sharet-1*stk.prctvaluet - casht + sharet*stk.prctres - cbind(stk.prc, signal, trd.state, share, cash, value)names(res) - c(prc, signal, trd.state, share, cash, value)return(res)#通道突破函数END=res - bband.bk.sim(cp)head(res)tail(res)plot(res,6,type=l,col=darkred,lty=1,lwd=2)# 通道(end)# 均线系统策略 # 双均线交叉策略mo
16、v.avg.sim - function(stk.prc.xts, k=50, n=7, p=1.05, q=1.10, m=0.8)stk.prc - coredata(stk.prc.xts)Timeline - index(stk.prc.xts)End - length(stk.prc)MA.5 - SMA(stk.prc, 5) #计算5日均线MA.20 - SMA(stk.prc, 20) #计算20日均线signal - c( rep(0, k), 0)trd.state - c( rep(0, k), 0)share - c( rep(0, k), 0)cash - c( re
17、p(1e4, k), 0)value - c( rep(1e4, k), 0)# Sim -for( t in k:End )signalt MA.20(t-n):(t-1) = n& stk.prct-1/MA.20t-1 p) signalt = MA.20t-1 & MA.5t = MA.20t) signalt q ) signalt - -1trd.statet - trd.statet-1casht - casht-1sharet - sharet-1valuet - valuet-1if( trd.statet-1 = 0 & signalt = 1 ) trd.statet -
18、 1sharet - ( m * casht-1 ) / stk.prctcasht - casht-1 - sharet*stk.prctif( trd.statet-1 = 1 & signalt = -1 )trd.statet - 0sharet - 0casht - casht-1 + sharet-1*stk.prctvaluet - casht + sharet*stk.prctres - xts( cbind(stk.prc, MA.5, MA.20, signal, trd.state, share, cash, value),order.by=Timeline)names(
19、res) - c(prc, MA.5, MA.20,signal, trd.state,share, cash, value)head(res)return(res)#双均线交叉策略END=res.mov - mov.avg.sim(cp)head(res.mov)tail(res.mov)plot(res.mov,6,type=l,lty=1,lwd=2)# MACD(begin)MACD.sim - function(stk.prc.xts, k=50, m=0.8)stk.prc - coredata(stk.prc.xts)Timeline - index(stk.prc.xts)En
20、d - length(stk.prc)macd.line - MACD(stk.prc, nFast=12, nSlow=26, nSig=9), 1signal.line - MACD(stk.prc, nFast=12, nSlow=26, nSig=9), 2signal - c( rep(0, k), 0)trd.state - c( rep(0, k), 0)share - c( rep(0, k), 0)cash - c( rep(1e4, k), 0)value - c( rep(1e4, k), 0)# Sim -for( t in (k+1):End )signalt - 0if( macd.linet-1 signal.linet) signalt = signal.linet-1 & macd.linet signal.linet) signalt - -1trd.statet - trd.statet-1casht - casht-1sharet
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1