Quantmod、PerformanceAnalytics、および Systematic Investors Toolbox を使用して取引システムを開発しようとしています。
毎日のデータに基づいて、いくつかの単純な取引ルール (Prices > SMA)、(rsi 2 < 0.5 = long) など (この部分は正常に動作します) を作成してテストしたいと考えています。
次に、過去 X 日間のパフォーマンスに基づいてこれらの戦略をランク付けしたいと考えています。次に、上位 3 つの戦略を選択し、上位 1 つに 50%、2 番目に優れた戦略に 30%、3 番目に優れた戦略に 20% を投資します。これを行う方法がわからないため、これが私の問題です。
Systematic Investor Toolbox またはランク機能のいくつかの機能を調査し、過去の質問を調査しましたが、これらを機能させることに成功していません。
最終的には、毎月 1 回だけ戦略の重みを再調整したいと考えていますが、一度に 1 つの問題に取り組みましょう。
以下は、戦略をテストし、ローリングパフォーマンスを作成するためにこれまでに持っているコードです。
###############################################################################
# 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 つだけを選択する方法がわかりません。
さらに情報が必要な場合はお知らせください。どんな助けでも大歓迎です!前もって感謝します