Выбор правил торговли на основе прошлых результатов
Я пытаюсь разработать торговую систему, используя Quantmod, PerformanceAnalytics и Systematic Investors Toolbox.
Я хочу создать и протестировать ряд простых правил торговли (Цены> SMA), (rsi 2 < 0.5 = long) и т. Д. И т. Д. (Эта часть отлично работает) на основе ежедневных данных.
Затем я хочу оценить эти стратегии на основе их эффективности за предыдущие 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 ответ
Вы можете использовать несколько функций из PerformanceAnalytics
, Например:
rest=cbind(dailyRMRrsi1d,dailyRMRrsi,dailyRTF,dailyRTFsimpledv)
charts.PerformanceSummary(rest)