利用R语言编写量化投资策略.docx

上传人:b****3 文档编号:3756294 上传时间:2023-05-06 格式:DOCX 页数:14 大小:17.67KB
下载 相关 举报
利用R语言编写量化投资策略.docx_第1页
第1页 / 共14页
利用R语言编写量化投资策略.docx_第2页
第2页 / 共14页
利用R语言编写量化投资策略.docx_第3页
第3页 / 共14页
利用R语言编写量化投资策略.docx_第4页
第4页 / 共14页
利用R语言编写量化投资策略.docx_第5页
第5页 / 共14页
利用R语言编写量化投资策略.docx_第6页
第6页 / 共14页
利用R语言编写量化投资策略.docx_第7页
第7页 / 共14页
利用R语言编写量化投资策略.docx_第8页
第8页 / 共14页
利用R语言编写量化投资策略.docx_第9页
第9页 / 共14页
利用R语言编写量化投资策略.docx_第10页
第10页 / 共14页
利用R语言编写量化投资策略.docx_第11页
第11页 / 共14页
利用R语言编写量化投资策略.docx_第12页
第12页 / 共14页
利用R语言编写量化投资策略.docx_第13页
第13页 / 共14页
利用R语言编写量化投资策略.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

利用R语言编写量化投资策略.docx

《利用R语言编写量化投资策略.docx》由会员分享,可在线阅读,更多相关《利用R语言编写量化投资策略.docx(14页珍藏版)》请在冰点文库上搜索。

利用R语言编写量化投资策略.docx

利用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="closeprice",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

mgarch1_roll<-ugarchroll(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)

#生成PLOT

cprice_var<-zoo(mgarch1_roll@forecast$VaR[,1])

index(cprice_var)<-as.yearmon(rownames(mgarch1_roll@forecast$VaR))

cprice_actual<-zoo(mgarch1_roll@forecast$VaR[,2])

index(cprice_var)<-as.yearmon(rownames(mgarch1_roll@forecast$VaR))

plot(cprice_actual,type="b",main="99%dayVarbacktesting",xlab="Date",

     ylab="Return/VaRinpercent")

lines(cprice_var,col="red")

legend("topright",inset=.05,c("MHXXreturn","VaR"),col=c("black","red"),lty=c(1,1))

mgarch1_fcst<-ugarchforecast(mgarch1_fit,n.ahead=6)

mgarch1_fcst

ret.fcst<--qnorm(0.95)*mgarch1_fcst@forecast$sigmaFor

ret.fcst

 

chartSeries(MHXX,name="中国民航信息",TA=NULL)

addBBands()

#addMACD()

 

################################量化投资策略####################################

######通道突破######

#通道突破函数==================================================================

bband.bk.sim<-function(stk.prc.xts,k=20,p=1.65,q=0.8){  

        #q是交易倍数,表示资金的q分用于交易

        

        stk.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<-c(rep(1e4,k),0)   #资产价值=股票市值+现金部位

        

        #Sim----

        

        for(tink:

End){

                

                stk.prc.pre<-stk.prc[(t-k):

t]  

                MA[t]<-mean(stk.prc.pre)

                std[t]<-sd(stk.prc.pre)

                u.bound[t]<-MA[t]+p*std[t]  #布林带上界

                

                signal[t]<-0     #默认不交易

                if(stk.prc[t]> u.bound[t])signal[t]= 1   

                #当股票价格超出布林上界时,buy

                if(stk.prc[t-1]>MA[t-1]&stk.prc[t]<=MA[t])signal[t]=-1  

                if(stk.prc[t-1]=MA[t])signal[t]=-1

                #卖的情况

                

                trd.state[t]<-trd.state[t-1]  

                cash[t]<-cash[t-1]

                share[t]<-share[t-1]

                value[t]<-value[t-1]

                

                #更新交易状态、持股数目、现金金额

                if(trd.state[t-1]==0&signal[t]== 1){   

                        trd.state[t]<-1

                        share[t]<-(q*cash[t-1])/stk.prc[t]

                        cash[t]<-cash[t-1]-share[t]*stk.prc[t]

                }

                

                if(trd.state[t-1]==1&signal[t]==-1){

                        trd.state[t]<-0

                        share[t]<-0

                        cash[t]<-cash[t-1]+share[t-1]*stk.prc[t]

                }

                

                value[t]<-cash[t]+share[t]*stk.prc[t]

        }

        

        res<-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)

 

###############################均线系统策略###################################

## 双均线交叉策略 

mov.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(rep(1e4,k),0)

        value<-c(rep(1e4,k),0)

        

        #Sim-----

        

        for(tink:

End){

                

                signal[t]<-0

                

                if(sum(MA.5[(t-n):

(t-1)]>MA.20[(t-n):

(t-1)])==n 

                    &stk.prc[t-1]/MA.20[t-1]>p)  signal[t]<-1

                

                if(MA.5[t-1]>=MA.20[t-1]&MA.5[t]<=MA.20[t])signal[t]<--1

                if(stk.prc[t-1]/MA.20[t-1]>q)signal[t]<--1

                

                trd.state[t]<-trd.state[t-1]

                cash[t] <-cash[t-1]

                share[t]<-share[t-1]

                value[t]<-value[t-1]

                

                if(trd.state[t-1]==0&signal[t]== 1){   

                        trd.state[t]<-1

                        share[t]<-(m*cash[t-1])/stk.prc[t]

                        cash[t]<-cash[t-1]-share[t]*stk.prc[t]

                }

                

                if(trd.state[t-1]==1&signal[t]==-1){

                        trd.state[t]<-0

                        share[t]<-0

                        cash[t]<-cash[t-1]+share[t-1]*stk.prc[t]

                }

                

                value[t]<-cash[t]+share[t]*stk.prc[t]

        }

        

        res<-xts(cbind(stk.prc,MA.5,MA.20,signal,trd.state,share,cash,value),

                    order.by=Timeline)

        names(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)

        End<-length(stk.prc)

        

        macd.line<-MACD(stk.prc,nFast=12,nSlow=26,nSig=9)[,1]

        signal.line<-MACD(stk.prc,nFast=12,nSlow=26,nSig=9)[,2]

        

        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<-c(rep(1e4,k),0)

        

        #Sim-----

        

        for(tin(k+1):

End){

                

                signal[t]<-0

                

                if(macd.line[t-1]<=signal.line[t-1]&macd.line[t]>signal.line[t]) signal[t]<-1

                

                if(macd.line[t-1]>=signal.line[t-1]&macd.line[t]

                

                trd.state[t]<-trd.state[t-1]

                cash[t] <-cash[t-1]

                share[t]

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2