【问题标题】:R - xts object encountering character string is not in a standard unambiguous formatR - 遇到字符串的 xts 对象不是标准的明确格式
【发布时间】:2016-12-02 00:02:14
【问题描述】:

我试图将rbresearch 的动量策略复制到标准普尔 500 指数公司。然而事实证明,getSymbols 无法获取所有代码的价格数据,我只使用以下方法获得了大约 300 只股票:

getSymbols(symbols, src='yahoo', index.class=c("POSIXt","POSIXct"), from='2000-01-01', to = '2015-12-31')

我发现这个thread 正在讨论这个问题,它可能来自来源“chart.yahoo.com”。因此我采用了jlhoward 建议的方法,它似乎工作得很好,没有任何警告。

更新:检查quantmod 包后,我发现它现在也在从 ichart.yahoo.com 抓取数据。

然而,在计算每月收盘价时,会出现如下错误:

Error in try.xts(x) : 
  Error in as.POSIXlt.character(x, tz, ...) :   character string is not in a standard unambiguous format
Called from: try.xts(x)

这是我的问题和我不明白的地方:

1) 有没有一种方法可以将 getSymbols 指向“ichart.yahoo.com”,从而提供更可靠的报价?

2) 我已将所有符号转换为 xts 对象,为什么从 try.xts 调用错误?

3) 我认为问题出在日期上,这些日期不是 ISO 8601 格式。但是我还没有找到将日期转换为 POSIXct 的方法,因为日期只是舍入到天。

4) 任何对代码的 cmets 都非常感谢。

我附上了代码,可以从here 下载 sp500components.csv。

感谢您的宝贵时间和热心帮助!一切顺利。

library(quantstrat)
library(FinancialInstrument)
library(TTR)

symbols <- read.table("sp500components.csv", header = FALSE, sep = ",")$V1
symbols <- as.character(symbols) 

currency("USD")
stock(symbols, currency="USD",multiplier=1)

MonthlyAd <- function(x){
  # Converts daily data to monthly and returns only the monthly close 
  # Note: only used with Yahoo Finance data so far
  # Thanks to Joshua Ulrich for the Monthly Ad function
  # 
  # args:
  #   x = daily price data from Yahoo Finance
  #
  # Returns:
  #   xts object with the monthly adjusted close prices

  sym <- sub("\\..*$", "", names(x)[1])
  Ad(to.monthly(x, indexAt = 'lastof', drop.time = TRUE, name = sym))
}

symEnv <- new.env()

f <- function(x) {
  uri    <- "http://ichart.yahoo.com/table.csv"
  symbol <- paste("s",x,sep="=")
  from   <- "a=1&b=1&c=2000"
  to     <- "d=31&e=12&f=2015"
  period <- "g=d"
  ignore <- "ignore=.csv"
  query  <- paste(symbol,from,to,period,ignore,sep="&")
  url    <- paste(uri,query,sep="?")
  try(assign(x,read.csv(url),envir=symEnv))
}

lapply(symbols,f) 

ts <- function(x) {
    x["Date"] <- as.Date.character(x[["Date"]], "%Y-%m-%d")
    x <- xts(x[,-1], order.by = x$Date)
    colnames(x) <- gsub("Adj", "Adjusted", colnames(x))
    assign(symbol, x)
}

eapply(symEnv, ts) 

symbols.close <- do.call(merge, eapply(symEnv, MonthlyAd))

【问题讨论】:

    标签: r xts posixct posixlt


    【解决方案1】:

    由于您没有提供错误原因的可重现示例,我不得不做出一些猜测。所以我假设你在 symEnv 中的对象上调用 MonthlyAd

    f 函数创建的对象不具有to.monthly 所期望的特征。也就是说,它创建的 data.frame 没有代表每个观察的日期时间的行名。

    eapply(symEnv, ts)创建的对象上调用MonthlyAd没有问题。

    symList <- eapply(symEnv, ts)
    symListMonthly <- lapply(symList, MonthlyAd)
    

    如果您只使用getSymbolsenv 参数,也没有问题。例如:

    symEnv <- new.env()
    getSymbols("SPY;IWM", env = symEnv)
    symListMonthly <- eapply(symEnv, MonthlyAd)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2013-08-29
      • 2015-01-27
      • 2013-01-23
      • 2018-11-04
      • 2018-10-07
      • 1970-01-01
      相关资源
      最近更新 更多