我试图通过rbresearch向S& P 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)对代码的任何评论都非常感谢。
我附上了代码,sp500components.csv可以从here下载。
感谢您的时间和亲切的帮助!祝一切顺利。
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))
答案 0 :(得分:1)
由于您没有提供错误原因的可重现示例,我必须做出一些猜测。因此,我假设您在MonthlyAd
中的对象上调用了symEnv
。
f
函数创建的对象没有to.monthly
期望的特征。也就是说,它创建的data.frame没有表示每个观察的日期时间的行名称。
如果您在MonthlyAd
创建的对象上调用eapply(symEnv, ts)
,则没有问题。
symList <- eapply(symEnv, ts)
symListMonthly <- lapply(symList, MonthlyAd)
如果您只使用getSymbols
env
参数,那也没问题。例如:
symEnv <- new.env()
getSymbols("SPY;IWM", env = symEnv)
symListMonthly <- eapply(symEnv, MonthlyAd)