2013-08-17 3 views
2

Я пытаюсь разработать торговую систему с использованием Quantmod, PerformanceAnalytics и Systematic Investors Toolbox.Выбор правил торговли на основе прошлой работы

Я хочу создать и протестировать ряд простых торговых правил (Цены> SMA), (rsi 2 < 0.5 = long) и т. Д. (Эта часть работает нормально) на основе ежедневных данных.

Затем я хочу ранжировать эти стратегии исходя из их производительности за предыдущие X дней. Затем я хочу выбрать лучшие 3 стратегии и инвестировать 50% в топ-1, 30% во втором и 20% в третьем. Здесь моя проблема заключается в том, что я не знаю, как это сделать.

Я изучил некоторые функциональные возможности Systematic Investor Toolbox или функции 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) 

Это в основном то, что у меня есть. Я могу создавать и тестировать стратегии, но я не знаю, как автоматически классифицировать стратегии и выбирать только верхнюю часть.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация! Любая помощь будет принята с благодарностью! Заранее благодарен

ответ

0

Вы можете использовать несколько функций от PerformanceAnalytics. Например:

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