2011-07-06 120 views
5

我想(重新)建在S &普500指數的基本預測模型(從雅虎財務數據orignates)R:錯誤XTS - order.by

我遇到了一些困難,與「訂購「我的數據集。
期間data.model以下錯誤的生成發生在XTS

誤差(new.x,x.index):NROW(X)必須匹配長度(order.by)

經過一段研究我意識到問題與排序有關,而且它似乎缺少底層zoo軟件包所需的排序。

有沒有一種優雅的方式來解決這個問題?在此先感謝

library(xts) 
library(tseries) 
library(quantmod) 

GSPC <- as.xts(get.hist.quote("^GSPC",start="1970-01-02", 
quote=c("Open", "High", "Low", "Close","Volume","AdjClose"))) 

head(GSPC) 

T.ind <- function(quotes, tgt.margin = 0.025, n.days = 10) { 
v <- apply(HLC(quotes), 1, mean) 
r <- matrix(NA, ncol = n.days, nrow = NROW(quotes)) 
for (x in 1:n.days) r[, x] <- Next(Delt(v, k = x), x) 
x <- apply(r, 1, function(x) sum(x[x > tgt.margin | x < 
-tgt.margin])) 
if (is.xts(quotes)) 
xts(x, time(quotes)) 
else x 
} 


myATR <- function(x) ATR(HLC(x))[, "atr"] 
mySMI <- function(x) SMI(HLC(x))[, "SMI"] 
myADX <- function(x) ADX(HLC(x))[, "ADX"] 
myAroon <- function(x) aroon(x[, c("High", "Low")])$oscillator 
myBB <- function(x) BBands(HLC(x))[, "pctB"] 
myChaikinVol <- function(x) Delt(chaikinVolatility(x[, c("High", "Low")]))[, 1] 
myCLV <- function(x) EMA(CLV(HLC(x)))[, 1] 
myEMV <- function(x) EMV(x[, c("High", "Low")], x[, "Volume"])[, 2] 
myMACD <- function(x) MACD(Cl(x))[, 2] 
myMFI <- function(x) MFI(x[, c("High", "Low", "Close")], x[, "Volume"]) 
mySAR <- function(x) SAR(x[, c("High", "Close")])[, 1] 
myVolat <- function(x) volatility(OHLC(x), calc = "garman")[, 1] 

library(randomForest) 
data.model <- specifyModel(T.ind(GSPC) ~ Delt(Cl(GSPC),k=1:10) + 
myATR(GSPC) + mySMI(GSPC) + myADX(GSPC) + myAroon(GSPC) + 
myBB(GSPC) + myChaikinVol(GSPC) + myCLV(GSPC) + 
CMO(Cl(GSPC)) + EMA(Delt(Cl(GSPC))) + myEMV(GSPC) + 
myVolat(GSPC) + myMACD(GSPC) + myMFI(GSPC) + RSI(Cl(GSPC)) + 
mySAR(GSPC) + runMean(Cl(GSPC)) + runSD(Cl(GSPC))) 

回答

7

traceback()揭示了錯誤發生在​​電話:

> Delt(Cl(GSPC),k=1:10) 
Error in xts(new.x, x.index) : NROW(x) must match length(order.by) 

Delt需要一個(M×1)對象,但你傳遞一個(M×2)對象。這是因爲GSPC有兩列與Cl(「Close」和「AdjClose」)匹配。這可能會導致其他領域的頭痛...

Cl預計像getSymbols返回的對象,其中調整的關閉列名稱爲「調整」。如果由於某些原因需要使用get.hist.quote,請在下載數據後重命名「AdjClose」列。

colnames(GSPC) <- c("Open", "High", "Low", "Close","Volume","Adjusted") 
Delt(Cl(GSPC),k=1:10) # works now 
+0

非常感謝,它的工作! – Val

2
## Error in xts(x, order.by = order.by, frequency = frequency, ... 
##  NROW(x) must match length(order.by) 

我浪費時間遇到了此問題。不管我是否有完全相同的問題,我會告訴我如何解決這個錯誤信息,以免它可以節省我的痛苦。

我導入了一個Excel或CSV文件(嘗試兩種)通過幾個導入函數,然後試圖將我的數據(作爲一個data.frame或.zoo對象)轉換爲一個xts對象,並不斷收到錯誤,包括這一個。

我試着創建一個單獨的日期向量作爲order.by參數傳入。我試圖確保日期向量data.frame的行是相同的。有時它起作用,有時它不起作用,原因我無法解釋。即使它確實有效,R也會將所有數字數據「強制」爲字符數據。 (害我無盡的問題,稍後觀看了脅迫,我學會了。)

這些錯誤發生的事情保持到:

對於XTS轉換我用從導入Excel工作表日期列作爲order.by參數與as.Date()修改,我*在轉化爲XTS下降日期列*

這裏的工作代碼:

xl_sheet <- read_excel("../path/to/my_excel_file.xlsx") 
sheet_xts <- xts(xl_sheet[-1], order.by = as.Date(xl_sheet$date)) 

注意我的日期列是第一列,所以xl_sheet [-1]刪除了第一列。