利用R语言编写量化投资策略Word文件下载.docx
《利用R语言编写量化投资策略Word文件下载.docx》由会员分享,可在线阅读,更多相关《利用R语言编写量化投资策略Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
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'
changes'
cprice=diff(price)
acf(cprice)
pacf(cprice)
#aic=-0。
37
m。
garch1〈-garchFit(~1+garch(1,1),data=cprice,trace=F)
summary(m。
garch1)
#aic=-0.62
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。
cond.dist="
std”)
garch3)
#aic=—0.596
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。
#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){
prc.pre〈-stk。
prc[(t—k):
t]
MA[t]〈-mean(stk。
prc.pre)
std[t]<
-sd(stk。
pre)
u。
bound[t]<
—MA[t]+p*std[t]
#布林带上界
signal[t]〈—0
#默认不交易
if(stk.prc[t]>
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-1]&stk。
prc[t]〉=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]<
cash[t]<
—cash[t-1]+share[t-1]*stk.prc[t]
value[t]〈—cash[t]+share[t]*stk。
}
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。
xts)
Timeline〈—index(stk。
prc.xts)
End〈—length(stk。
prc)
MA。
5
<
—SMA(stk.prc,5)
#计算5日均线
20〈—SMA(stk。
prc,20)
#计算20日均线
signal
〈-c(rep(0,k),0)
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:
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
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){
state[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]<
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)
-c(”prc"
”MA。
5”,"
20"
signal"
"
share”,”cash"
#双均线交叉策略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。
xts,k=50,m=0.8){
-coredata(stk.prc.xts)
Timeline〈-index(stk。
End<
-length(stk。
macd.line〈—MACD(stk。
prc,nFast=12,nSlow=26,nSig=9)[,1]
signal.line〈-MACD(stk。
prc,nFast=12,nSlow=26,nSig=9)[,2]
-c(rep(0,k),0)
-c(rep(0,k),0)
〈—c(rep(1e4,k),0)
-c(rep(1e4,k),0)
#Sim-——-—
for(tin(k+1):
signal[t]<
—0
if(macd.line[t-1]<
=signal.line[t—1]&
macd.line[t]>
signal.line[t])
if(macd.line[t—1]〉=signal。
line[t—1]&
macd。
line[t]<
signal。
line[t])
signal[t]〈—-1
state[t—1]
〈—cash[t—1]
-share[t-1]