话不多说,直接上代码:
- ################################################################
- ## ----------------------example 6.2.2-----------------------------
- ##artifical neural network and random forest strategy
- ## Author by: fwushi815
- ###############################################################
- ##loading packages
- library(quantstrat)
- library(data.table)
- library(IKTrading)
- library(DSTrading)
- library(corrplot)
- library(caret)
- library(pROC)
- library(FSelector)
- #read customized function (transfer local data into time series data)
- source('read.local.xts.R')mdjt <- read.local.xts('000333',type='stock',source='tdx')
- #artifical neural network model
- #object(output variable)
- mdjtret<-ROC(mdjt,type='discrete')
- class<-ifelse(Cl(mdjtret)>=0,'UP','DOWN')class<-lag(class,-1)
- #input variables are technical indicators including WillR, RSI, ATR and MACD
- willR5<-WPR(HLC(mdjt),n=5)
- willR10<-WPR(HLC(mdjt),n=10)
- willR15<-WPR(HLC(mdjt),n=15)
- rsi5<-RSI(Cl(mdjt),maType='EMA',n=5)
- rsi10<-RSI(Cl(mdjt),maType='EMA',n=10)
- rsi15<-RSI(Cl(mdjt),maType='EMA',n=15)
- atr5<-ATR(HLC(mdjt),n=5,maType='EMA')$atr
- atr10<-ATR(HLC(mdjt),n=10,maType='EMA')$atr
- macd<-MACD(Cl(mdjt))$signal
- dataset<-data.frame(class,willR5,willR10,willR15,rsi5,rsi10,rsi15,atr5,atr10,macd)
- names(dataset)<-c('class','willR5','willR10','willR15','rsi5','rsi10','rsi15','atr5','atr10','macd')
- dataset<-na.omit(dataset)
- #dataset visualization and stats
- y<-dataset$classcbind(freq=table(y),percentage=prop.table(table(y))*100)
- datacor<-cor(dataset[,-1])
- corrplot(datacor,method='circle')
- #Feature selection:
- set.seed(1000)
- dataweight<-random.forest.importance(class~.,dataset,importance.type = 1)
- subset<-cutoff.k(dataweight,5)
- datasetrf<-data.frame(class,willR15,rsi10,rsi5,macd)
- names(datasetrf)<-c('class','willR15','rsi10','rsi5','macd')
- datasetrf<-na.omit(datasetrf)
- #fit modelfit.knn<-train(class~.,data=datasetrf,method='knn',preProc='range')
- set.seed(1000)
- fit.cart<-train(class~.,data=datasetrf,method='rpart')
- set.seed(1000)
- fit.nb<-train(class~.,data=datasetrf,method='nb')
- set.seed(1000)
- fit.svm<-train(class~.,data=datasetrf,method='svmRadial')
- result<-resamples(list(KNN=fit.knn,CART=fit.cart,NB=fit.nb,SVM=fit.svm))
- summary(result)dotplot(result)
- out<-predict.train(fit.knn)
- out<-c(rep(NA,nrow(mdjt)-length(out)),out)
- #generate ANN signalsout<-reclass(out,mdjt)
- mdjt$entry<-mdjt$exit<-NA
- mdjt$entry[out==2]=1
- mdjt$exit[out==1]=1
- #strategy initialization
- initDate<-'2013-09-10'
- startDate<-'2013-09-18'
- symbols<-'mdjt'
- initEq <- 10000
- Sys.setenv(tz='UTC')
- currency('CNY')
- stock(symbols,currency='CNY',multiplier=1)
- strategy.st<-portfolio.st<-account.st<-'ANN'
- .blotter<-.strategy<-new.env()
- rm.strat(portfolio.st) #important!
- rm.strat(STRATSMART) #remove strategy etc. if this is a re-run
- initPortf(portfolio.st,symbols=symbols,initDate=initDate,currency='CNY')
- initAcct(account.st,portfolios=portfolio.st,initDate=initDate,currency='CNY')
- initOrders(portfolio.st,initDate=initDate)strategy(STRATSMART,store=T)
- addPosLimit(portfolio.st, symbols, startDate, 10000, 1)
- #add rules
- add.rule(STRATSMART, name="ruleSignal",
- arguments=list(sigcol="entry",sigval=TRUE,orderqty=10000,
- ordertype="market",orderside='long', osFUN=osMaxPos),
- type="enter", path.dep=TRUE)
- add.rule(STRATSMART, name="ruleSignal",
- arguments=list(sigcol="exit",sigval=TRUE,orderqty='all',
- ordertype="market",orderside="long", replace=FALSE),
- type="exit",path.dep=TRUE)
- #process the indicators and generate trades
- start_t <- Sys.time()
- out <- try(applyStrategy(strategy ='ANN',portfolios = 'ANN'))
- end_t <- Sys.time()
- print('Strategy Loop:')
- print(end_t-start_t)
- updatePortf(STRATSMART,Dates=paste0('::',as.Date(Sys.time())))
- updateAcct(STRATSMART)
- updateEndEq(STRATSMART)
- print('trade blotter portfolio update:')
- chart.Posn(portfolio.st)tradeStats(portfolio.st)
需要指出的是,上述方法完全可以用到期货、外汇等产品上,如有感兴趣的读者,可以进一步参考图书:《量化投资基础、方法与策略——R语言实战指南》(电子工业出版社)