雅虎代号,时区和合并

时间:2013-03-26 15:53:38

标签: r yahoo xts

我想从雅虎下载S& P 500,道琼斯工业平均指数和30年期国债的每日数据,将数据映射到适当的时区,并将它们与我自己的数据合并。我有几个问题。

  1. 我的第一个问题是让代码正确。从雅虎的网站上看,它们的代码如下:^ GSPC,^ DJI和^ TYX。但是,^ DJI失败了。知道为什么吗?

  2. 我的第二个问题是我想将时区限制为GMT(我想确保我的所有数据都在同一时钟上,GMT似乎是一个中性选择),但我无法得到它起作用。

  3. 我的第三个问题是我想将雅虎数据与我自己的数据合并,通过其他方式获得并以不同的格式提供。它也是每日数据。

  4. 这是我尝试将数据限制在GMT时区。在我的R脚本的顶部执行。

    Sys.setenv(TZ = "GMT")
    # > Sys.getenv("TZ")
    # [1] "GMT"
    # the TZ variable is properly set
    # but does not affect the time zone in zoo objects, why?
    

    以下是获取雅虎数据的代码:

    library("tseries")
    library("xts")
    
    date.start <- "1999-12-31"
    date.end <- "2013-01-01"
    
    # tickers <- c("GSPC","TYX","DJI")
    # DJI Fails, why?
    # http://finance.yahoo.com/q?s=%5EDJI
    tickers <- c("GSPC","TYX") # proceed without DJI
    
    z <- zoo()
    index(z) <- as.Date(format(time(z)),tz="")
    
    for ( i in 1:length(tickers) ) 
      { 
         cat("Downloading ", i, " out of ", length(tickers) , "\n")
         x <- try(get.hist.quote(
             instrument = paste0("^",tickers[i])
             , start = date.start
             , end = date.end
             , quote = "AdjClose"
             , provider = "yahoo"
             , origin = "1970-01-01"
             , compression = "d"
             , retclass = "zoo" 
             , quiet = FALSE )
           , silent = FALSE )
         print(x[1:4]) # check that it's not empty
         colnames(x) <- tickers[i]
         z <- try( merge(z,x), silent = TRUE )
    }
    

    这是我的数据集的dput(head(df)):

    df <- structure(list(A = c(-0.011489000171423, -0.00020300000323914, 
    0.0430639982223511, 0.0201549995690584, 0.0372899994254112, -0.0183669999241829
    ), B = c(0.00110999995376915, -0.000153000000864267, 0.0497750006616116, 
    0.0337960012257099, 0.014121999964118, 0.0127800004556775), date = c(9861, 
    9862, 9863, 9866, 9867, 9868)), .Names = c("A", "B", "date"
    ), row.names = c("0001-01-01", "0002-01-01", "0003-01-01", "0004-01-01", 
    "0005-01-01", "0006-01-01"), class = "data.frame")
    

    我想将df中的数据与z中的数据合并。我似乎无法让它发挥作用。

    我是R的新手,非常愿意接受有关效率,最佳实践等方面的建议。谢谢。

    编辑:解决方案

    1. 关于第一个问题:遵循GSee的建议,可以使用quantmod软件包下载道琼斯工业平均指数数据:因此,而不是雅虎不再提供的“^ DJI”代码,请使用“DJIA”自动收报机。请注意,“DJIA”代码中没有插入符号。

    2. 关于第二个问题,Joshua Ulrich在评论中指出“日期没有时区,因为几天没有时间成分。”

    3. 关于第三个问题:数据框似乎有损坏的日期,正如评论中的agstudy所指出的那样。

    4. 我的解决方案依赖于quantmod包和附带的zoo / xts包:

      library(quantmod)
      

      以下是我用来从我的csv文件中获取正确日期的代码:

      toDate <- function(x){ as.Date(as.character(x), format("%Y%m%d")) }
      dtz <- read.zoo("myData.csv"
        , header = TRUE
        , sep = ","
        , FUN = toDate
      )
      dtx <- as.xts(dtz)
      

      csv文件中的日期以“19861231”格式存储在单个列中。获取正确日期的关键是将日期包装在“as.character()”中。此代码的一部分灵感来自R - Stock market data from csv to xts。我还发现zoo / xts手册很有帮助。

      然后我从这个数据集中提取日期范围:

      date.start <- start(dtx)
      date.end <- end(dtx)
      

      我将使用quantmod的getSymbols函数使用这些日期,以便我下载的其他数据将涵盖相同的时间段。

      这是我用来获取所有三个代码的代码。

      tickers <- c("^GSPC","^TYX","DJIA")
      data <- new.env() # the data environment will store the data
      do.call(cbind, lapply( tickers
          , getSymbols
          , from = date.start
          , to = date.end
          , env = data # data saved inside an environment
          )
        )
      ls(data)  # see what's inside the data environment
      data$GSPC  # access a particular ticker
      

      另请注意,正如GSee在评论中指出的那样,选项 auto.assign = FALSE 不能与选项 env = data 一起使用(否则下载失败)。

      非常感谢你的帮助。

1 个答案:

答案 0 :(得分:5)

  1. 雅虎doesn't provide historical data for ^DJI。目前,看起来您可以使用“DJIA”代码获得相同的数据,但您的里程可能会有所不同。
  2. 在这种情况下工作,因为你只处理日期
  3. 您提供的df对象是从0001年开始的年度数据。因此,这可能不是您想要的。
  4. 以下是我将如何获取和合并这些系列(或使用环境并仅调用getSymbols

    library(quantmod)
    do.call(cbind, lapply(c("^GSPC", "^TYX"), getSymbols, auto.assign=FALSE))