利用R语言编写量化投资策略.docx
- 文档编号:3341261
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:12
- 大小:19KB
利用R语言编写量化投资策略.docx
《利用R语言编写量化投资策略.docx》由会员分享,可在线阅读,更多相关《利用R语言编写量化投资策略.docx(12页珍藏版)》请在冰豆网上搜索。
利用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-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]<-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] line[t]) signal[t]〈—-1 trd。 state[t]〈-trd。 state[t—1] cash[t] 〈—cash[t—1] share[t]<-share[t-1]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 语言 编写 量化 投资 策略