【问题标题】:Create empty xts objects via for loop通过 for 循环创建空 xts 对象
【发布时间】:2013-09-04 13:41:34
【问题描述】:

我正在尝试通过 for 循环创建一系列空 xts 对象,但我失败了。

我创建了一个名为 SYMBOL_vector 的字符向量,其中包含我希望创建的空 XTS 对象的名称。我还使用 getSymbols 下载了一些股票市场数据,包括符号 SPY 的数据。因此,存在一个名为 SPY 的 XTS 对象。

我的for循环代码是:

for (i in 1 : length(SYMBOL_vector)) {
  SYMBOL_vector[i] <- as.xts(order.by = index(SPY))
}

当我运行代码时,我收到以下错误:

xts(x = NULL, order.by = x, ...) 中的错误: 由多个实际参数匹配的形式参数“order.by”

如果对反馈很重要,一旦创建了空 xts 对象,我将编写另一个 for 循环来填充每个循环的每日返回数据。

我不反对对循环采取一种完全不同的方法……这个方法似乎又快又容易。提前感谢您的帮助!

【问题讨论】:

    标签: r for-loop xts quantmod


    【解决方案1】:

    如果您只使用xts 而不是as.xts,您的代码应该可以工作,但是,它并不是真正的“R 方式”(或“quantmod 方式”)来解决问题。

    考虑一下:

    library(quantmod)
    s <- c("SPY", "DIA", "QQQ")
    e <- new.env() # an empty environment to hold yahoo price data
    getSymbols(s, env=e)
    L <- eapply(e, dailyReturn) # a list of returns
    L$SPY
    

    您可能可以在这里停下来,但如果您愿意,您可以将列表转换为环境。

    ret <- as.environment(L) # an environment with xts objects of daily returns
    ls(ret)
    get("DIA", pos=ret)
    

    或者如果你真的想要你可以附加ret 环境(不推荐)

    attach(ret)  # not recommended
    head(QQQ)
    #           daily.returns
    #2007-01-03 -0.0050621261
    #2007-01-04  0.0189639223
    #2007-01-05 -0.0047662279
    #2007-01-08  0.0006841505
    #2007-01-09  0.0050136737
    #2007-01-10  0.0117913832
    

    【讨论】:

      【解决方案2】:

      @PHXtrader 您尝试做的是用 xts 对象替换字符向量中的元素,这不是您想要做的并且没有意义。要为 name 赋值,您必须使用“assign”函数(?assign 以获取更多信息)。代码中的另一个错误是您使用 'as.xts' 而不仅仅是 'xts' 。看看这个玩具示例:

      tickers <- c("AMZN","AAPL")          # this is a character object
      getSymbols("SPY",from="2013-09-01")  # this is a xts object
      
      for (i in 1:length(tickers)) {
        assign(tickers[i],xts(order.by = index(SPY)))
      }
      

      结果是 2 个 xts 对象,分别命名为 AMZN 和 AAPL,并带有零。

      >str(AAPL)
      An 'xts' object of zero-width
      
      > AAPL
      Data:
      numeric(0)
      
      Index:
      Date[1:9], format: "2013-09-03" "2013-09-04" "2013-09-05" "2013-09-06" "2013-09-09" ...
      

      我认为完成您想做的事情的更好、更安全的方法是使用列表(或有时创建一个新环境)。像上面那样创建对象往往会导致很难找到和调试的错误,这些类型的构造会导致意外覆盖变量和许多其他潜在错误。以下示例避免了循环并在列表中创建了空对象:

      tickers <- c("AMZN","AAPL") 
      mylist <- rep(as.list(xts(order.by = index(SPY))),2) # creates 2 empty xts-objects in list 
      names(mylist) <- tickers
      
      > str(mylist)
      List of 2
       $ AMZN:An 'xts' object of zero-width
       $ AAPL:An 'xts' object of zero-width
      

      【讨论】:

        猜你喜欢
        • 2014-11-27
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        • 1970-01-01
        • 1970-01-01
        • 2020-03-29
        • 1970-01-01
        相关资源
        最近更新 更多