6

我正在尝试(重新)建立标准普尔 500 指数的基本预测模型(数据来自雅虎财经)

我在数据集的“排序”方面遇到了一些困难。
在 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)))
4

2 回答 2

7

traceback()显示调用中发生的错误Delt(Cl(GSPC),k=1:10)

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

Delt需要一个 (mx 1) 对象,但您传递的是一个 (mx 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
于 2011-07-06T13:44:39.993 回答
3
## 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 工作表中的日期列作为带有 as.Date() 修饰符的 order.by 参数,并且我*在转换为 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] 删除了第一列。

于 2016-12-19T05:08:30.673 回答