2016-07-27 2 views
1

Ich habe versucht, die Impulsstrategie von rbresearch mit S & P 500 Unternehmen zu replizieren. Es stellte sich jedoch heraus, dass getSymbols nicht in der Lage war Preisdaten für alle Tickern zu greifen, und ich bekam nur 300 Aktien um unter Verwendung von:R - Xts Objekt findet Zeichenfolge ist nicht in einem einheitlichen Standardformat

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

ich diese thread über dieses Thema zu diskutieren gefunden und es könnte von der Quelle kommen " chart.yahoo.com ". Daher habe ich die von jlhoward vorgeschlagene Methode übernommen und es schien perfekt ohne Warnungen zu funktionieren.

UPDATE: Nach Überprüfung der quantmod Paket, fand ich es auch Daten von ichart.yahoo.com jetzt ergreift.

Allerdings, wenn es die monatliche Nähe der Berechnung kommt, lesen ein Fehler wie,

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) 

Hier sind meine Fragen und was ich nicht verstehe:

1) Gibt es eine Möglichkeit, um getSymbols zu "ichart.yahoo.com" zu leiten, was verlässlichere Zitate liefert?

2) Ich habe alle Symbole in xts-Objekte umgewandelt, also warum der Fehler von try.xts aufgerufen wurde?

3) Ich nehme an, das Problem ist mit den Daten, die nicht im Format ISO 8601 sind. Aber ich habe keine Möglichkeit gefunden, die Daten in POSIXct zu konvertieren, da die Daten nur rund um Tage sind.

4) Alle Kommentare zu den Codes werden sehr geschätzt.

Ich beigefügt mit den Codes und die sp500components.csv konnte von here heruntergeladen werden.

Vielen Dank für Ihre Zeit und freundliche Hilfe! Alles Gute.

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)) 

Antwort

0

Da Sie kein reproduzierbares Beispiel für die Fehlerursache angegeben haben, muss ich einige Vermutungen anstellen. Ich nehme an, Sie rufen MonthlyAd für die Objekte in symEnv.

Das von Ihrer f-Funktion erstellte Objekt verfügt nicht über die Eigenschaften, die to.monthly erwartet. Der von ihm erstellte data.frame enthält nämlich keine Zeilennamen, die die Datumswerte für jede Beobachtung darstellen.

Es gibt kein Problem, wenn Sie MonthlyAd für die Objekte aufrufen, die von eapply(symEnv, ts) erstellt wurden.

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

Es gibt auch kein Problem, wenn Sie nur getSymbols ein Argument env verwenden. Zum Beispiel:

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