2013-08-17 92 views
2

我正在尝试使用Quantmod,PerformanceAnalytics和Systematic Investors Toolbox开发交易系统。根据过去表现选择交易规则

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

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

我已经研究了系统投资者工具箱或Rank函数的一些功能,并查看了过去的问题,但没有成功地让这些工作成功。

最终我只想每个月重新平衡一次策略的重量,但让我们一次只考虑一个问题。

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

############################################################################### 
# 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名。

如果您需要更多信息,请让我知道! 任何帮助将不胜感激! 在此先感谢

回答

0

您可以使用PerformanceAnalytics的几项功能。例如:

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