2017-06-25 6 views
0

私はBacktesting Strategies with Rから取られたR quantstratベースのスクリプトを実行しています。できます。私がADXをインジケータと信号として追加するまで。もしそうなら、私は次のエラーを取得する:QuantstratはADXで動作しません

Error in `colnames<-`(`*tmp*`, value = "ADXsig") : 
length of 'dimnames' [2] not equal to array extent 

はずソリューションは、here in quantstrattraderhere in r.789695.n4.nabble.comを議論し、x=quote(Cl(mktdata))からquote(Cl(mktdata)[,1])ADXadd.indicatorコードを変更することです。 ADXがClではなくHLCを使用し、HLCが1つではなく3つの列を参照するため、ADXが機能しない可能性があります。明確にする:HLC=quote(HLC(mktdata))quote(HLC(mktdata)[,1])に変更しても機能しませんでした。

フル以下作業コード、別途さらに以下ADXコード:

# INSTALL PACKAGES 
# install.packages("devtools") 
# require(devtools) 
# install_github("braverock/FinancialInstrument") 
# install_github("joshuaulrich/xts") 
# install_github("braverock/blotter") 
# install.packages("quantstrat", repos="http://R-Forge.R-project.org") 
# install_github("braverock/PerformanceAnalytics") 

# LIBRARIES 
library(quantstrat) 

# INITIAL SETUP 
Sys.setenv(TZ = "EST") 
currency('USD') 
start_date <- "2015-01-01" 
end_date <- "2016-12-31" 
init_equity <- 1e4 # $10,000 
adjustment <- FALSE 

# GET DATA 
basic_symbols <- function() {symbols <- c("SPY")} 
symbols <- basic_symbols() 
getSymbols(Symbols = symbols, src = "google", index.class = "POSIXct", 
      from = start_date, to = end_date, adjust = adjustment) 
stock(symbols,currency = "USD", multiplier = 1) 

# DEFINE STRATEGY/PORTFOLIO/ACCOUNT NAMES 
portfolio.st <- "Port.Luxor" 
account.st <- "Acct.Luxor" 
strategy.st <- "Strat.Luxor" 

# REMOVE PRIOR STRATEGY/PORTFOLIO, INITIALIZE PORTFOLIO/ACCOUNT/STRATEGY, STORE STRATEGY 
rm.strat(portfolio.st) 
rm.strat(account.st) 
initPortf(name = portfolio.st, symbols = symbols) 
initAcct(account.st, portfolios = portfolio.st, initEq = init_equity) 
initOrders(portfolio.st) 
strategy(strategy.st, store = TRUE) 

# INDICATORS & SIGNALS 

add.indicator(strategy = strategy.st, 
       name = "SMA", 
       arguments = list(x = quote(Cl(mktdata)), 
           n = 10), 
       label = "nFast") 

add.indicator(strategy = strategy.st, 
       name = "SMA", 
       arguments = list(x = quote(Cl(mktdata)), 
           n = 30), 
       label = "nSlow") 

add.signal(strategy = strategy.st, 
      name="sigCrossover", 
      arguments = list(columns = c("nFast", "nSlow"), 
          relationship = "gte"), 
      label = "long") 

add.signal(strategy = strategy.st, 
      name="sigCrossover", 
      arguments = list(columns = c("nFast", "nSlow"), 
          relationship = "lt"), 
      label = "short") 

# TRADING RULES 
add.rule(strategy = strategy.st, 
     name = "ruleSignal", 
     arguments = list(sigcol = "long", 
          sigval = TRUE, 
          orderqty = 100, 
          ordertype = "stoplimit", 
          orderside = "long", 
          threshold = 0.0005, 
          prefer = "High", 
          TxnFees = -10, 
          replace = FALSE), 
     type = "enter", 
     label = "EnterLONG") 

add.rule(strategy.st, 
     name = "ruleSignal", 
     arguments = list(sigcol = "long", 
          sigval = TRUE, 
          orderside = "short", 
          ordertype = "market", 
          orderqty = "all", 
          TxnFees = -10, 
          replace = TRUE), 
     type = "exit", 
     label = "Exit2LONG") 

# APPLY STRATEGY 
applyStrategy(strategy.st, portfolios = portfolio.st) 

ADXインジケータ&信号用)、次のコードが追加されたときにエラーが生成されます。戦略によって参照されていなくても、mktdata xtsオブジェクトに存在すると、エラーが発生します。 add.indicatorの存在自体がエラーを引き起こすことはなく、むしろadd.signalの存在が原因です。エラーはadd.signalcolumn = "ADX"を参照しているが、add.indicatorが3つのADX列を作成したため、参照するADXがわからないことが原因と考えられます。

add.indicator(strategy.st, name="ADX", 
       arguments=list(HLC=quote(HLC(mktdata)), n=14), 
       label="ADX") 

add.signal(strategy.st, name = "sigThreshold", 
      arguments = list(column = "ADX", 
          threshold = 30, 
          relationship = "gt",  
          cross = TRUE),    
      label = "ADXsig") 

答えて

0

は解決策を見つけた:column = "ADX.ADX"column = "ADX"を変更しました。以下のように:

add.indicator(strategy.st, name="ADX", 
      arguments=list(HLC=quote(HLC(mktdata)), n=14), 
      label="ADX") 

add.signal(strategy.st, name = "sigThreshold", 
     arguments = list(column = "ADX.ADX", 
         threshold = 30, 
         relationship = "gt",  
         cross = TRUE),    
     label = "ADXsig") 
関連する問題