2017-05-19 100 views
2

Quantstrat中的奇怪問題。 我正在嘗試將標準TTR函數的add.indicator添加到某些數據的最高位。 的代碼片段如下:Quantstrat add.indicator x = quote(Hi(mktdata))莫名其妙地無法識別列

add.indicator(strategy.st,name="runMax", 
      arguments = list (x=quote(Cl(mktdata)),n=entry_period), 
      label = "Max55") 

這一工程,但下面

add.indicator(strategy.st,name="runMax", 
      arguments = list (x=quote(Hi(mktdata)),n=entry_period), 
      label = "Max55") 

沒有。 我試圖

(X =報價(CL(mktdata))

(X =報價(VO(mktdata))

(OP(mktdata))

所有工作 而

(X =報價(高(mktdata))

(X =報價(LO(mktdata))

哪些沒有。 有什麼想法? 這些數據是對Google的標準調用並保存爲Rdata。

的錯誤如下:

Error in (function (x, n = 10, cumulative = FALSE) : 
ncol(x) > 1. runMax only supports univariate 'x' 

好奇,因爲它與關閉數據工作。

的完整代碼:

require(quantstrat) 
require(PerformanceAnalytics) 

initDate = "1990-01-01" 
from = "2007-01-01" 
to = "2012-12-31" 

options(width =70) # set the output width 

currency('USD') 
Sys.setenv(TZ ="UTC") 

require(quantmod) 

symbols = c("MSFT") 

load("~/R_backtrade_test/MSFT.Rdata") 

stock(symbols,currency='USD',multiplier = 1) 

tradeSize <- 100000 
initEq <- tradeSize*length(symbols) 

strategy.st <- portfolio.st <- account.st <- "turtles" 

rm.strat(strategy.st) 

initPortf(portfolio.st,symbols = symbols,initDate = initDate,currency =  'USD') 
initAcct(account.st,portfolios = portfolio.st,initDate = initDate,currency = 'USD',initEq = initEq) 
initOrders(portfolio.st,initDate = initDate) 
strategy(strategy.st,store = TRUE) 

strat <- getStrategy(strategy.st) 

ATRperiod = 20 
entry_period = 55 
exit_period = 20 

add.indicator(strategy.st,name="ATR", 
      arguments = list(HLC=quote(HLC(mktdata)),n=ATRperiod), 
      label = "ATR20") 

add.indicator(strategy.st,name="runMax", 
      arguments = list (x=quote(Hi(mktdata)),n=entry_period),label = "Max55") 

test <- applyIndicators(strategy.st,mktdata= MSFT) 
head(test,60) 

回答

0

試試這個:

add.indicator(strategy.st,name="runMax", 
       arguments = list (x=quote(Hi(mktdata)[, 1]),n=entry_period),label = "Max55") 

這是假設在其列名「高」的第一列是正確的。或者,你可以更謹慎,這反而:

add.indicator(strategy.st,name="runMax", 
       arguments = list (x=quote(Hi(mktdata)[, "MSFT.High"]),n=entry_period),label = "Max55") 

的錯誤你的問題是什麼暗示。 applyIndi​​cators運行時,您無意中將多個列傳遞給runMax的呼叫。

runMax只支持單變量'x'。

要查看此錯誤是如何發生的,請嘗試運行您的代碼而不添加runMax指標。看看mktdata:

> head(Hi(mktdata), 2) 
      MSFT.High trueHigh.ATR20 
2007-01-03 38.927    NA 
2007-01-04 38.567   38.567 

您對計算ATR的調用會生成一個'high'列名。

這兩列將傳遞給,這就是你的錯誤是如何發生的。我見過在使用Op,Hi,,Cl的Quantstrat代碼中出現了很多錯誤,這些代碼出現的原因與您造成問題的原因相同,因此幾乎總是使用避免在我編寫的任何代碼中使用這些輔助函數。具體請求「高」欄的具體名稱可以避免人們繼續使用這些幫助功能遇到的這些問題。