Ошибка в применении правил: комбинированный технический индикатор
Я попытался объединить пару EMA и RSI вместе в quantstrat
, В конце концов, моя цель состоит в том, чтобы сгенерировать некоторые графики и показатели торговой стратегии. К сожалению, я, похоже, застрял в индикаторах смешения и продолжаю получать сообщение об ошибке (описано ниже). Это код:
### Add Indicators
nRSI <- 21
buyThresh <- 50
sellThresh <- 50
#Indicator for EMA long medium short
nEMAL<- 80
nEMAM<- 21
nEMAS<- 13
nEMAF<- 5
add.indicator(strategy.st, name="RSI",
arguments=list(price=quote(Cl(mktdata)), n=nRSI),
label="rsi")
add.indicator(strategy.st, name="EMA",
arguments=list(x=quote(Cl(mktdata)), n=nEMAL),
label="EMAL")
add.indicator(strategy.st, name="EMA",
arguments=list(x=quote(Cl(mktdata)), n=nEMAM),
label="EMAM")
add.indicator(strategy.st, name="EMA",
arguments=list(x=quote(Cl(mktdata)), n=nEMAS),
label="EMAS")
add.indicator(strategy.st, name="EMA",
arguments=list(x=quote(Cl(mktdata)), n=nEMAF),
label="EMAF")
#customsig <- function(data) {
sig <- data[, "EMA.EMAF"] > data[, "EMA.EMAS"] & data[, "EMA.EMAF"] > data[, "EMA.EMAM"] & data[, "rsi"] >50 & data[, "EMA.EMAM"] > data[, "EMA.EMAL"] & data[, "EMA.EMAS"] > data[, "EMA.EMAL"]
colnames(sig) <- "upSig"
sig
}
#downsig <- function(data) {
sig <- data[, "EMA.EMAF"] < data[, "EMA.EMAS"] & data[, "EMA.EMAF"] < data[, "EMA.EMAM"] & data[, "rsi"] <50 & data[, "EMA.EMAM"] < data[, "EMA.EMAL"] & data[, "EMA.EMAS"] < data[, "EMA.EMAL"]
colnames(sig) <- "downSig"
sig
}
### Add Signal- Enter
add.signal(strategy.st, name="customsig",
arguments=list(data = quote(mktdata)),
label = "entersig")
add.signal(strategy.st, name="downsig",
arguments=list(data = quote(mktdata)),
label = "downsig.exitsig")
### Add rule - Enter
add.rule(strategy.st,
name='ruleSignal',
arguments = list(sigcol="entersig",
sigval=TRUE,
orderqty=1000,
ordertype='market',
orderside='long',
threshold=NULL),
type='enter',
path.dep=TRUE)
### Add rule- Exit
add.rule(strategy.st,
name='ruleSignal',
arguments = list(sigcol="downsig.exitsig",
sigval=TRUE,
orderqty=1000,
ordertype='market',
orderside='long',
pricemethod='market',
replace=FALSE),
type='exit',
path.dep=TRUE)
start_t<-Sys.time()
out<-try(applyStrategy(strategy=strategy.st,
portfolios=portfolio.st))
updatePortf(portfolio.st)
updateAcct(portfolio.st)
updateEndEq(account.st)
for(symbol in symbols) {
chart.Posn(
Portfolio=portfolio.st,
Symbol=symbol,
log=TRUE)
}
Я получаю ошибку
Error in applyRules(portfolio = portfolio, symbol = symbol, strategy = strategy, : mktdata does not contain 'sigcol': entersig
Как я могу применить правила полностью?
1 ответ
Вы не правильно определили имена столбцов для сигналов. Посмотрите на это, и вы увидите, что в ваших столбцах сигналов нет ожидаемых меток:
head(mktdata)
# SPY.Open SPY.High SPY.Low SPY.Close SPY.Volume SPY.Adjusted rsi EMA.EMAL EMA.EMAM EMA.EMAS EMA.EMAF upSig.entersig downSig.downsig.exitsig
# 2007-01-03 142.25 142.86 140.57 141.37 94807600 112.1708 NA NA NA NA NA NA NA
# 2007-01-04 141.23 142.05 140.61 141.67 69620600 112.4089 NA NA NA NA NA NA NA
# 2007-01-05 141.33 141.40 140.38 140.54 76645300 111.5123 NA NA NA NA NA NA NA
# 2007-01-08 140.82 141.41 140.25 141.19 71655000 112.0280 NA NA NA NA NA NA NA
# 2007-01-09 141.31 141.60 140.40 141.07 75680100 111.9328 NA NA NA NA 141.168 NA NA
# 2007-01-10 140.58 141.57 140.30 141.54 72428000 112.3057 NA NA NA NA 141.292 NA NA
Следующий код работает после внесения 3 исправлений. Поскольку ваш пример не воспроизводим, мне пришлось добавить дополнительный код к вашему выше:
library(quantstrat)
### Add Indicators
strategy.st <- "test"
portfolio.st <- "test"
account.st <- "test"
rm.strat(strategy.st)
nRSI <- 21
buyThresh <- 50
sellThresh <- 50
#Indicator for EMA long medium short
stock.str <- "SPY"
getSymbols("SPY")
currency("USD")
stock(stock.str, "USD")
nEMAL<- 80
nEMAM<- 21
nEMAS<- 13
nEMAF<- 5
initPortf(portfolio.st,symbols=stock.str)
initAcct(account.st,portfolios=portfolio.st)
initOrders(portfolio=portfolio.st)
strategy(strategy.st, store=TRUE)
add.indicator(strategy.st, name="RSI",
arguments=list(price=quote(Cl(mktdata)), n=nRSI),
label="rsi")
add.indicator(strategy.st, name="EMA",
arguments=list(x=quote(Cl(mktdata)), n=nEMAL),
label="EMAL")
add.indicator(strategy.st, name="EMA",
arguments=list(x=quote(Cl(mktdata)), n=nEMAM),
label="EMAM")
add.indicator(strategy.st, name="EMA",
arguments=list(x=quote(Cl(mktdata)), n=nEMAS),
label="EMAS")
add.indicator(strategy.st, name="EMA",
arguments=list(x=quote(Cl(mktdata)), n=nEMAF),
label="EMAF")
customsig <- function(data) {
sig <- data[, "EMA.EMAF"] > data[, "EMA.EMAS"] & data[, "EMA.EMAF"] > data[, "EMA.EMAM"] & data[, "rsi"] >50 & data[, "EMA.EMAM"] > data[, "EMA.EMAL"] & data[, "EMA.EMAS"] > data[, "EMA.EMAL"]
colnames(sig) <- "upSig"
sig
}
downsig <- function(data) {
sig <- data[, "EMA.EMAF"] < data[, "EMA.EMAS"] & data[, "EMA.EMAF"] < data[, "EMA.EMAM"] & data[, "rsi"] <50 & data[, "EMA.EMAM"] < data[, "EMA.EMAL"] & data[, "EMA.EMAS"] < data[, "EMA.EMAL"]
colnames(sig) <- "downSig"
sig
}
### Add Signal- Enter
add.signal(strategy.st, name="customsig",
arguments=list(data = quote(mktdata)),
label = "entersig")
add.signal(strategy.st, name="downsig",
arguments=list(data = quote(mktdata)),
# CORRECTION:
label = "exitsig")
### Add rule - Enter
add.rule(strategy.st,
name='ruleSignal',
#CORRECTION:
arguments = list(sigcol="upSig.entersig",
sigval=TRUE,
orderqty=1000,
ordertype='market',
orderside='long',
threshold=NULL),
type='enter',
path.dep=TRUE)
### Add rule- Exit
add.rule(strategy.st,
name='ruleSignal',
# CORRECTION:
arguments = list(sigcol="downSig.exitsig",
sigval=TRUE,
orderqty=1000,
ordertype='market',
orderside='long',
pricemethod='market',
replace=FALSE),
type='exit',
path.dep=TRUE)
start_t<-Sys.time()
out<-try(applyStrategy(strategy=strategy.st,
portfolios=portfolio.st))
updatePortf(portfolio.st)
updateAcct(portfolio.st)
updateEndEq(account.st)