我是R新手,最近在applyStrategy
包中运行quantstrat
函数后遇到以下错误:
Error in eval(expr, envir, enclos) : object 'signal' not found
Error in `colnames<-`(`*tmp*`, value = integer(0)) :
attempt to set 'colnames' on an object with less than two dimensions
有人可以向我解释如何调试此错误,并建议我是否正确使用sigFormula
来结合MACD
和RSI
指标?
感谢您的帮助,请参阅以下代码:
# 1. Load R Packages
library(quantstrat)
# 2. Stock Instrument Initialisation
# 2.1 Stock Instrument Initialisation
inital.portfolio.date <- '2013-12-31'
start.date <- '2014-01-01'
end.date <- '2017-05-31'
initial.equity <- 10000
Sys.setenv(TZ="UTC")
# 2.2 Download data
getSymbols(Symbols = "SPY", src = "google", from = start.date, to = end.date, adjust = T, index.class="POSIXct")
# 2.3 Initialise currency
currency(primary_id = "USD")
# 2.4 Initialise Stock Instrument
stock(primary_id = "SPY", currency = "USD", multiplier = 1)
# 3. Strategy Visualisation and Details
# MACD & RSI Strategy
lineChart(SPY, theme = "white")
addMACD(fast = 12, slow = 26, signal =9, type = "EMA")
addRSI(n = 14, maType = "EMA")
# 4. Strategy Initialisation
# 4.1 Strategy Name
WT.Strat1 <- "Wen Ting's MACD & RSI Strategy"
# 4.2 Clear Strategy Data
rm.strat(WT.Strat1)
# 4.3 Strategy Object
strategy(name = WT.Strat1, store = TRUE)
# 4.4 Summary of Completed Strategy Object
summary(getStrategy(WT.Strat1))
# 5. Strategy Definition
# 5.1 Add Indicators
add.indicator(strategy = WT.Strat1, name = "MACD", arguments = list(x = quote(Cl(SPY)), nFast = 12, nSlow = 26, nSig = 9), label = "MACD")
add.indicator(strategy = WT.Strat1, name = "RSI", arguments = list(price = quote(Cl(SPY)), n = 14), label = "RSI")
# 5.2 Add Strategy Signals
add.signal(strategy = WT.Strat1, name = "sigFormula", arguments = list(columns = c("macd","signal","RSI"), formula ="(signal > macd) & (RSI < 30)", cross = FALSE, label = "trigger"), label = "BuySignal")
add.signal(strategy = WT.Strat1, name = "sigFormula", arguments = list(columns = c("macd","signal","RSI"), formula ="(signal < macd) & (RSI > 70)", cross = FALSE, label = "trigger"), label = "SellSignal")
# 5.3 Add Buy Rule
add.rule(strategy = WT.Strat1, name = "ruleSignal", arguments = list(sigcol = "BuySignal", sigval = TRUE, orderqty = 10, ordertype = "market", orderside = "long"), type = "enter", label = "BuyRule", enabled = TRUE)
# 5.4 Add Sell Rule
add.rule(strategy = WT.Strat1, name = "ruleSignal", arguments = list(sicol = "SellSignal", sigval = TRUE, orderqty = all, ordertype = "market", orderside = "long", TxnFees = -6), type = "exit", label = "SellRule", enabled = TRUE)
# 5.5 Completed Strategy Object
summary(getStrategy(WT.Strat1))
# 6. Portfolio Initialisation
# 6.1 Portfolio Name
WT.Portfolio1 <- "Wen Ting's Portfolio 1"
# 6.2 Clear Portfolio Data
rm.strat(WT.Portfolio1)
# 6.3 Initialise Portfolio Object
initPortf(name = WT.Portfolio1, symbols = "SPY", initDate = inital.portfolio.date)
# 6.4 Initialise Account Object
initAcct(name = WT.Strat1, portfolios = WT.Portfolio1, initDate = inital.portfolio.date, initEq = initial.equity)
# 6.5 Initialise Orders Object
initOrders(portfolio = WT.Portfolio1, initDate = inital.portfolio.date)
# 7. Strategy Application
# 7.1 Strategy Application to Market Data
applyStrategy(strategy = WT.Strat1, portfolios = WT.Portfolio1)
答案 0 :(得分:3)
尝试对代码块进行这些更正:
add.signal(strategy = WT.Strat1, name = "sigFormula", arguments = list(columns = c("macd.MACD","signal.MACD","EMA.RSI"), formula ="(signal.MACD > macd.MACD) & (EMA.RSI < 30)", cross = FALSE, label = "trigger"), label = "BuySignal")
add.signal(strategy = WT.Strat1, name = "sigFormula", arguments = list(columns = c("macd.MACD","signal.MACD","EMA.RSI"), formula ="(signal.MACD < macd.MACD) & (EMA.RSI > 70)", cross = FALSE, label = "trigger"), label = "SellSignal")
如何调试此问题?这是一个快速的方法:
首先尝试拨打traceback()
> traceback()
8: stop("attempt to set 'colnames' on an object with less than two dimensions")
7: `colnames<-`(`*tmp*`, value = seq(ncol(tmp_val)))
6: applySignals(strategy = strategy, mktdata = mktdata, parameters = parameters,
...)
5: applyStrategy(strategy = WT.Strat1, portfolios = WT.Portfolio1) at .active-rstudio-document#86
4: eval(ei, envir)
3: eval(ei, envir)
2: withVisible(eval(ei, envir))
1: source("~/.active-rstudio-document", echo = TRUE)
您可以在调用applySignals
(运行回测)中applyStrategy
内看到错误,因此您知道它与您的信号相关数据有关。 (如果它是applyIndicators
,它将与您的指标逻辑有关,如果它是applyRules
您知道它可能与您的规则逻辑有关)
applyStrategy
为全局环境添加了一个mktdata
对象,您可以检查该对象,即使完整模拟不成功。
尝试head(mktdata)
:
> head(mktdata)
SPY.Open SPY.High SPY.Low SPY.Close SPY.Volume macd.MACD signal.MACD EMA.RSI
2014-01-02 183.98 184.07 182.48 182.92 119636836 NA NA NA
2014-01-03 183.21 183.60 182.63 182.88 81390502 NA NA NA
2014-01-06 183.47 183.56 182.08 182.36 108028139 NA NA NA
2014-01-07 183.09 183.79 182.95 183.48 86144169 NA NA NA
2014-01-08 183.45 183.83 182.89 183.52 96582234 NA NA NA
2014-01-09 184.10 184.13 182.80 183.64 90683302 NA NA NA
啊,您可以看到列名实际上不是signal
,macd
,而是signal.MACD
和macd.MACD
。您需要在sigFormula
逻辑中正确指定列名。
这是调试quantstrat的一种快速方法。在代码中插入browser()
是您可以使用的下一级详细信息,如果您无法解决问题....
如果您尝试使用正确的列名运行backtest,那么事情就会起作用。