使用getSymbols()Quantmod预测股票价格时的错误

时间:2019-02-10 11:09:50

标签: r time-series data-science data-analysis business-intelligence

我正试图使用​​Quantmod下载一些股价历史数据,这是我的代码:

Nasdaq100_Symbols <- c('GE','PG','MSFT','AAPL','PFE','AMD','DELL','GRPN','FB','CSCO','INTC',
                   'EZJ.L','BP','HSBC','MKS')

getSymbols(Nasdaq100_Symbols)

Warning messages:
1: DELL contains missing values. Some functions will not work if objects contain missing values in the middle of the series. Consider using na.omit(), na.approx(), na.fill(), etc to remove or replace them. 

由于尝试将它们合并在一起并使其成为时间序列数据类型,因此如何删除这些NA值,

nasdaq100 <- data.frame(as.xts(merge(GE,PG,MSFT,AAPL,PFE,AMD,DELL,GRPN,FB,CSCO,INTC,
                                 EZJ.L,BP,HSBC,MKS)))

head(nasdaq100[,1:12],2)

        GE.Open GE.High GE.Low GE.Close GE.Volume GE.Adjusted PG.Open PG.High PG.Low
2007-01-02      NA      NA     NA       NA        NA          NA      NA      NA     NA
2007-01-03   37.41   38.15  37.38    37.97  43222800    24.48669   63.72   64.66   63.7
       PG.Close PG.Volume PG.Adjusted
2007-01-02       NA        NA          NA
2007-01-03    64.54   9717900    44.56958   

 class(nasdaq100)
[1] "data.frame"

# set outcome variable
outcomeSymbol <- 'FISV.Volume'

# shift outcome value to be on same line as predictors
library(xts)
nasdaq100 <- xts(nasdaq100,order.by=as.Date(rownames(nasdaq100)))
nasdaq100 <- as.data.frame(merge(nasdaq100,lm1=lag(nasdaq100[,outcomeSymbol],-1)))

Error in `[.xts`(nasdaq100, , outcomeSymbol) : subscript out of bounds

我被困在这里,我在Youtube(https://www.youtube.com/watch?v=lDgvaJFpybU&t=32s)上找到了一个教程,但是由于这些警告和错误而无法前进,有人可以告诉我如何解决它吗?

1 个答案:

答案 0 :(得分:2)

如果要执行示例代码的一部分,请确保正确调整所有内容。最后,您用脚本开始时未下载的FISV股票值填充outcomeSymbol。而且我必须说,可以在脚本中找到here的代码可以写得更好。 xtsdata.frame之间不必要的切换太多了。我不会重写他的整个代码。但是这段代码可以解决您的错误。

首先,我没有用100只股票来污染您的工作环境,而是将所有内容都放在一个列表对象中。然后将所有这些与Reducemerge合并。 DELL代码中的丢失数据将与其他所有数据很好地合并,但是由于没有数据,因此将为NA。如果要处理此问题,请不要下载DELL数据,或使用na.fill函数将其填充为0。如果要使用此数据来训练模型,则最后一个选项可能不是一个好的解决方案。我还将向您展示如何将xts对象转换为data.frame,而不必稍后使用as.Date

library(quantmod)

Nasdaq100_Symbols <- c('GE','PG','MSFT','AAPL','PFE','AMD','DELL')

# put all stocks in one list object    
stocks <- lapply(Nasdaq100_Symbols, getSymbols, auto.assign = FALSE)

# following is not needed but if you want to use the list for other purposes 
# it is a good practice to name all the different list objects.

# names(stocks) <- Nasdaq100_Symbols


# merge all stocks into 1 xts object
nasdaq100 <- Reduce(merge, stocks)

# fill NA's with 0
nasdaq100 <- na.fill(nasdaq100, 0)

outcomeSymbol <- "GE.Volume" # <-- used GE as that data is available in the downloaded data set

# merge outcome to data
nasdaq100 <- merge(nasdaq100, lm1 = lag(nasdaq[, outcomeSymbol], -1))

# turn into data.frame
nasdaq100_df <- data.frame(date = index(nasdaq100), coredata(nasdaq100))