最近在网上买到一份用R做的系统交易策略的Code,但是在改编的过程中遇到了写循环的问题。
我的具体想法是,找出最优化的移动平均线的参数来指导交易。
我的参数为(5,10,20,30,60,120)
具体策略就是找出B点和S点,其中:
B点组合为:(以下均表示前者上穿后者)
(5,10) , (5,20) , (5, 30), (5,60) , (5, 120) 共5种
(10,20) , (10, 30), (10,60) , (10, 120) 共4种
(20, 30), (20,60) , (20, 120) 共3种
(30,60) , (30, 120) 共2种
(60, 120) 共1种
B点组合共15种。
S点组合为:(以下均表示前者下穿后者)
(5,10) , (5,20) , (5, 30), (5,60) 共4种
(10,20) , (10, 30), (10,60) 共3种
(20, 30), (20,60) 共2种
(30,60) 共1种
S点组合共10种。代码如下:- library(combinat)
- x1 <- c(5, 10, 20, 30, 60, 120)
- y1 <- c(5, 10, 20, 30, 60, 120)
- z1 <- c()
- x2 <- c(5, 10, 20, 30, 60)
- y2 <- c(5, 10, 20, 30, 60)
- z2 <- c()
- permunation <- function(x,y,z){
- for(i in 1:length(x)){
- for(j in 2:length(y)){
- z[[i]] <- cbind(x[[i]], y[[j]])
- }
- }
- z <- expand.grid(x,y)
- z <- unique(z)
- pd.new<-subset(z, Var1<Var2)
- return(pd.new)
- }
- comb1 <- permunation(x1,y1,z1)
- comb2 <- permunation(x2,y2,z2)
复制代码
综上,结合BS买卖点的策略一共有150种组合。我的策略是找出最优化的那个BS买卖点的参数。
我的部分代码如下:
- library(plyr)
- library(quantmod)
- library(TTR)
- library(ggplot2)
- library(scales)
- require(data.table)
- library(xts)
复制代码- #Download stock data first
- startDate = as.Date("2012-01-01")
- endDate = as.Date("2014-11-21")
- data <- getSymbols("000752.SZ",auto.assign=FALSE, from = startDate, to = endDate)
- #Get Close price
- cdata<-data[,4]
- sDate<-as.Date("2012-01-01") #startdata
- eDate<-as.Date("2014-11-21") #enddate
- #################################
- #Moving AVERAGE Function
- ma<-function(cdata,mas=c(5, 10, 20, 30, 60, 120)){
- ldata<-cdata
- for(m in mas){
- ldata<-merge(ldata,MA(cdata,m))
- }
- ldata<-na.locf(ldata, fromLast=TRUE)
- names(ldata)<-c('Value',paste('ma',mas,sep=''))
- return(ldata)
- }
- #Transaction Signals
- Signal<-function(cdata,pdata){
- tmp<-''
- tdata<-ddply(pdata[order(pdata$Index),],.(Index,Series),function(row){
- if(row$Series==tmp) return(NULL)
- tmp<<-row$Series
- })
- tdata<-data.frame(cdata[tdata$Index],op=ifelse(tdata$Series=='down','B','S'))
- names(tdata)<-c("Value","op")
- return(tdata)
- }
复制代码
[size=13.63636302948px]上面的代码需要修改的地方如下:1. ldata<-ma(cdata,c(5,10)) #选择滑动平均指标 ----> 这里是否需要写成循环?
2. pdata<-merge(ldata$ma10[which(ldata$ma5-ldata$ma10<0)],ldata$ma10[which(ldata$ma5-ldata$ma10<0)])
这里在选择买卖点时,ldata$ma10[which(ldata$ma5-ldata$ma10<0)]和ldata$ma10[which(ldata$ma5-ldata$ma10<0)]如何写一个循环来遍历上面的150种组合?因为这里涉及到买点卖点的参数不同的情况
3. 最后要找出tail(result2$ticks,1)中使得asset最大的那套参数。
请大家给出具体的code实现,而不是简单回答上面的问题,谢谢!!!
|