根据过去的表现选择交易规则

时间:2013-08-17 08:44:00

标签: r trading ranking-functions

我正在尝试使用Quantmod,PerformanceAnalytics和Systematic Investors Toolbox开发交易系统。

我想基于日常数据创建和测试一些简单的交易规则(价格&gt; SMA),(rsi 2 <0.5 =长)等等(这部分工作正常)。

然后,我想根据他们在过去X天的表现对这些策略进行排名。然后我想选择前3名策略并将50%投入前1名,30%投入第二名,20%投入第三名。这是我的问题所在,因为我不知道如何做到这一点。

我已经研究了系统投资工具箱或排名功能的一些功能,并查看过去的问题,但没有成功实现这些功能。

最终我想每个月只重新调整一次策略权重,但我们一次只能解决一个问题。

以下是我到目前为止测试策略和创建滚动表演的代码:

###############################################################################
# Load Systematic Investor Toolbox (SIT)
###############################################################################
con = gzcon(url('http://www.systematicportfolio.com/sit.gz', 'rb'))
source(con)
close(con)

#*****************************************************************
# Load historical data
#****************************************************************** 
load.packages('quantmod','PerformanceAnalytics')   
tickers = 'SPY'

models <- new.env()
data <- new.env()
getSymbols(tickers, src = 'yahoo', from = '1950-01-01', env = data, auto.assign = T)
for(i in ls(data)) data[[i]] = adjustOHLC(data[[i]], use.Adjusted=T)        
bt.prep(data, align='remove.na', dates='1950::2013')

#*****************************************************************
# Code Strategies
#****************************************************************** 
prices = data$prices  
n = len(tickers)  
nperiods = nrow(prices)

#Define indicators
sma.long = bt.apply.matrix(prices, SMA, 200)
dv = bt.apply(data, function(x) { DV(HLC(x), 2, TRUE) } )   
rsi2 = bt.apply.matrix(prices, RSI, 2)

# Buy & Hold    
data$weight[] = 1
models$buy.hold = bt.run(data) 

# Simple TF
data$weight[] = NA
data$weight[] = iif(prices>sma.long,1,0)
data$weight[] = na.locf(data$weight[])
TFweight = data$weight[]
popen = bt.apply(data, Op)
data$execution.price[] = NA
data$execution.price = Next(popen)

models$tf = bt.run.share(data, commission=0.005, trade.summary=T)

#Trend following + simple dv
data$weight[] = NA
data$weight[] = iif(prices>sma.long,iif(cross.dn(dv,0.5),1,iif(cross.up(dv,0.5),0,NA)),0)
data$weight[] = na.locf(data$weight[])
TFDVweight = data$weight[]
popen = bt.apply(data, Op)
data$execution.price[] = NA
data$execution.price = Next(popen)
models$tfsimpledv = bt.run.share(data, commission=0.005, trade.summary=T)

#Mean Reversion prices > prices - 6 days
data$weight[] = NA
data$weight[] = iif(prices < lag(prices,1),1,iif(prices>lag(prices,1),0,NA))
data$weight[] = na.locf(data$weight[])
MRD1weight = data$weight[]
popen = bt.apply(data, Op)
data$execution.price[] = NA
data$execution.price = Next(popen)

models$MR1days = bt.run.share(data, commission=0.005, trade.summary=T)

#Mean Reversion rsi
data$weight[] = NA
data$weight[] = iif(rsi2<50,1,iif(rsi2>50,0,NA))
data$weight[] = na.locf(data$weight[])
MRrsiweight = data$weight[]
popen = bt.apply(data, Op)
data$execution.price[] = NA
data$execution.price = Next(popen)

models$MRrsi = bt.run.share(data, commission=0.005, trade.summary=T)

#Mean Reversion rsi
data$weight[] = NA
data$weight[] = iif(rsi2<50 & prices < lag(prices,1),2,iif(rsi2>50,0,NA))
data$weight[] = na.locf(data$weight[])
MRrsi1dweight = data$weight[]
popen = bt.apply(data, Op)
data$execution.price[] = NA
data$execution.price = Next(popen)

models$MRrsi1d = bt.run.share(data, commission=0.005, trade.summary=T)


#Mean Reversion rsi scaling
data$weight[] = NA
data$weight[] = iif(rsi2<5 ,2,iif(rsi2<10,1.5,iif(rsi2<15,1,iif(rsi2<20,0.5,iif(rsi2>95,-2,iif(rsi2>90,-1.5,iif(rsi2>85,-1,iif(rsi2>80,-0.25,0))))))))
data$weight[] = na.locf(data$weight[])
MRrsiscaling = data$weight[]
popen = bt.apply(data, Op)
data$execution.price[] = NA
data$execution.price = Next(popen)

models$MRrsiscaling = bt.run.share(data, commission=0.005, trade.summary=T)


models$EQW = bt.run.share(data, commission=0.01, trade.summary=T)

#calculate daily returns
dailyRMRrsiscaling = diff(log(models$MRrsiscaling$equity))
dailyRMRrsi1d = diff(log(models$MRrsi1d$equity))
dailyRMRrsi = diff(log(models$MRrsi$equity))
dailyRTF = diff(log(models$tf$equity))
dailyRTFsimpledv = diff(log(models$tfsimpledv$equity))

#caculate rolling returns
rollingMRrsiscaling = apply.rolling(dailyRMRrsiscaling, FUN="mean", width=252)
rollingMRrsi1d = apply.rolling(dailyRMRrsi1d, FUN="mean", width=252)
rollingMRrsi = apply.rolling(dailyRMRrsi, FUN="mean", width=252)
rollingTF = apply.rolling(dailyRTF, FUN="mean", width=252)
rollingTFsimpledv = apply.rolling(dailyRTF, FUN="mean", width=252)


plotbt.custom.report(models$MRrsiscaling ,models$MRrsi1d, models$MRrsi, models$MR1days, models$tf,  models$tfsimpledv, models$buy.hold) 

这基本上就是我所拥有的。我可以创建和测试策略,但我不知道如何自动对策略进行排名并仅选择前3名。

如果您需要更多信息,请与我们联系! 任何帮助将不胜感激! 提前致谢

1 个答案:

答案 0 :(得分:0)

您可以使用PerformanceAnalytics中的多个功能。 例如:

rest=cbind(dailyRMRrsi1d,dailyRMRrsi,dailyRTF,dailyRTFsimpledv)
charts.PerformanceSummary(rest)