Выбор торговых правил на основе прошлых результатов

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

Я хочу создать и протестировать ряд простых торговых правил (Цены > SMA), (rsi 2 ‹ 0,5 = длинная) и т. д. и т. д. (эта часть работает нормально) на основе дневных данных.

Затем я хочу ранжировать эти стратегии на основе их эффективности за предыдущие X дней. Затем я хочу выбрать 3 лучшие стратегии и инвестировать 50% в первую, 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) 

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

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


person user2690001    schedule 17.08.2013    source источник


Ответы (1)


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

rest=cbind(dailyRMRrsi1d,dailyRMRrsi,dailyRTF,dailyRTFsimpledv)
charts.PerformanceSummary(rest)
person Robert    schedule 20.08.2017