【问题标题】:How to update my xts environment with daily stock data?如何使用每日库存数据更新我的 xts 环境?
【发布时间】:2016-01-14 13:51:25
【问题描述】:

我已经使用getsymbols 函数加载并保存了我的环境,其中包含 300 多个股票历史数据。现在我正在尝试使用新的每日数据更新我的历史数据集,但它不起作用。我尝试使用merge()rbind(),但它似乎不适用于环境。感谢您对这个问题的帮助!

这是我的代码:

load.packages('quantmod')        
tickers = spl('A,AA,AAL,AAP,AAPL,ABT,ACN,ADBE,ADI,ADM,ADP,ADS,AEE,AEP')
getSymbols(tickers, src = 'yahoo', from = '2010-01-01' , env = data, auto.assign = TRUE)
save(data, file="myTickersData.rda")

现在,我正在尝试将今天的数据附加到它,而不是从 2010 年开始重新运行它,因为这将花费很多时间。

data.today = new.env()
getSymbols(tickers, src = 'yahoo', from = '2015-10-14' , env = data.today, auto.assign = T)
updated.data = merge(data,data.today)

我收到此错误:

Error in as.data.frame.default(x) :
cannot coerce class ""environment"" to a data.frame

【问题讨论】:

  • load.packagesspl 函数从何而来?
  • 抱歉 Joshua 我忘了提!这些函数来自 SIT(系统投资工具箱) con = gzcon(url('systematicportfolio.com/sit.gz', 'rb')) source(con) close(con) load.packages('quantmod') #tickers = dow.jones .components() 股票代码 = spl('SPY,SHY,AAPL,ADBE,AMZN,DHI,DIS')
  • 附加数据是一个非常糟糕的主意!每次股息、拆分或现金分配后,历史股票数据都会发生变化。因此,在添加数据几个月后,它实际上是无用的。你真的应该每天下载它,或者如果你有知识并且准备投入时间和精力,你可以维护一个包含原始数据的数据库并自己完成所有必要的工作。 (保留公司行为调整因素、现金股息调整因素、更改符号的映射,例如合并、分拆等)

标签: r time-series xts zoo quantmod


【解决方案1】:

这是一个可以完成大部分您需要的功能。它不做的一些重要事情:

  1. 它不会检查以确保您没有rbind 重复日期 到历史数据。
  2. 如果有拆分,它不会回调整所有历史数据, 更新之间的股息等。

要解决第二个问题,您需要重新提取给定品种的所有数据。

updateData <- function(oldData, newData) {
  # ensure both arguments are environments
  stopifnot(is.environment(oldData) || is.environment(newData))
  # track symbols that aren't in the new environment
  unmatchedSym <- NULL
  # loop over all symbols in the historical data environment
  for (sym in ls(oldData)) {
    # get a copy of the symbol data
    oldSym <- get(sym, oldData)
    # try to get the new data
    newSym <- try(get(sym, newData))
    if (inherits(newSym, "try-error")) {
      unmatchedSym <- c(unmatchedSym, sym)
      next
    } else {
      # rbind old/new data
      # might want to check to ensure you're not adding a dupicate row
      combined <- rbind(oldSym, newSym)
      # update historical data environment
      assign(sym, combined, oldData)
    }
  }
  # return unmatched symbols (invisibly)
  invisible(unmatchedSym)
}

这是一个用法示例:

library(quantmod)
oldData <- new.env()
getSymbols("A;AA;AAL", env=oldData, to="2015-09-30")

newData <- new.env()
getSymbols("A;AA;AAL", env=newData, from="2015-10-01")

updateData(oldData, newData)
eapply(oldData, tail)
# $AA
#            AA.Open AA.High AA.Low AA.Close AA.Volume AA.Adjusted
# 2015-10-08   10.85   11.11  10.63    11.01  34172000       11.01
# 2015-10-09   10.67   10.92  10.25    10.26  78627900       10.26
# 2015-10-12   10.28   10.29   9.97    10.08  31371900       10.08
# 2015-10-13    9.96   10.22   9.86    10.03  36220300       10.03
# 2015-10-14   10.09   10.11   9.91     9.95  42245400        9.95
# 2015-10-15    9.93   10.00   9.63     9.70  49779200        9.70
#
# $A
#           A.Open A.High A.Low A.Close A.Volume A.Adjusted
# 2015-10-08  35.39  36.07 35.34   36.01  2597900      36.01
# 2015-10-09  35.94  36.34 35.88   36.23  3230000      36.23
# 2015-10-12  36.08  36.18 35.86   35.99  1258300      35.99
# 2015-10-13  35.76  36.24 35.53   35.63  2379300      35.63
# 2015-10-14  35.64  35.77 34.97   35.05  1644300      35.05
# 2015-10-15  35.12  35.68 34.79   35.58  1427300      35.58
#
# $AAL
#           AAL.Open AAL.High AAL.Low AAL.Close AAL.Volume AAL.Adjusted
# 2015-10-08    39.21    40.03   38.70     39.74    8303200        39.74
# 2015-10-09    40.27    42.49   40.25     42.42   16797000        42.42
# 2015-10-12    42.59    43.88   42.55     43.84   11437200        43.84
# 2015-10-13    42.70    43.97   42.52     43.41   13212600        43.41
# 2015-10-14    44.00    44.50   43.23     43.80   11121500        43.80
# 2015-10-15    44.10    44.48   43.50     44.46    8179500        44.46

【讨论】:

    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多