Ich möchte den "Last Trade" -Aktienkurs von Yahoo Finance in R importieren. Die Absicht ist, mit (fast) Echtzeitdaten zu arbeiten. Gibt es irgendwelche Lösungen?
Vielen Dank im Voraus für jeden hilfreichen Kommentar.
Ich möchte den "Last Trade" -Aktienkurs von Yahoo Finance in R importieren. Die Absicht ist, mit (fast) Echtzeitdaten zu arbeiten. Gibt es irgendwelche Lösungen?
Vielen Dank im Voraus für jeden hilfreichen Kommentar.
Antworten:
Das ist wirklich keine Statistik-Frage (vielleicht könnte dies nach SO verschoben werden?), Aber es gibt eine nette Funktion in quantmod , die das tut, was Dirk von Hand gemacht hat. Siehe getQuote()
und yahooQF()
. Wenn Sie tippen, yahooQF()
wird ein Menü mit allen möglichen Anführungszeichenformaten angezeigt, die Sie verwenden können.
> require(quantmod)
> getQuote("QQQQ;SPY", what=yahooQF("Last Trade (Price Only)"))
Trade Time Last
QQQQ 2011-03-17 12:33:00 55.14
SPY 2011-03-17 12:33:00 128.17
Das ist ziemlich einfach, da R direkt von einer bestimmten URL lesen kann. Der Schlüssel ist einfach zu wissen, wie man die URL bildet. Hier ist ein schnelles und schmutziges Beispiel, das auf dem Code basiert, den Dj Padzensky Ende der neunziger Jahre geschrieben hat und den ich im Perl- Modul Yahoo-FinanceQuote gepflegt habe fast genauso lange (das hier natürlich auch auf CPAN ist ) .
Wenn Sie ein kleines R kennen, sollte der Code selbsterklärend sein. Die Dokumentation für den Formatstring zu bekommen ist etwas kniffliger, aber zB das Perl-Modul hat einige.
R> syms <- c("^GSPC", "^IXIC")
R> baseURL <- "http://download.finance.yahoo.com/d/quotes.csvr?e=.csv&f="
R> formatURL <- "snl1d1t1c1p2va2bapomwerr1dyj1x"
R> endURL <- "&s="
R> url <- paste(baseURL, formatURL, endURL, paste(syms, collapse="+"), sep="")
R> read.csv(url, header=FALSE)
V1 V2 V3 V4 V5 V6 V7
1 ^GSPC S&P 500 INDEX,RTH 1256.88 3/16/2011 4:04pm 0 0.00%
2 ^IXIC NASDAQ Composite 2616.82 3/16/2011 5:30pm 0 0.00%
V8 V9 V10 V11 V12 V13 V14
1 4282084608 0 N/A N/A 1256.88 1279.46 1249.05 - 1280.91
2 0 0 N/A N/A 2616.82 0.00 0.00 - 0.00
V15 V16 V17 V18 V19 V20 V21 V22
1 1010.91 - 1344.07 N/A N/A N/A N/A N/A N/A SNP
2 2061.14 - 2840.51 N/A N/A N/A N/A N/A N/A NasdaqSC
R>
Spalte drei ist Ihr letzter Handel. Während der Open Market-Zeiten erhalten Sie weniger NAs und mehr Datenvariabilität. Beachten Sie jedoch, dass die meisten Preise um 15 oder 20 Minuten verzögert sind - aber einige Indizes sind in Echtzeit. Echtzeitdaten sind ein großes Geschäft und ein großer Erlös für den Austausch. Sie werden daher in der Regel nicht weitergegeben. Und wenn ich mich recht erinnere, verwenden die neueren und aktuelleren Anzeigen auf den Finanzseiten von Google und Yahoo etwas AJAXy, das von außen schwerer zu melken ist.
Hier ist eine kleine Funktion, die ich geschrieben habe, um "Pseudo-Echtzeit" -Daten von Yahoo zu sammeln und grafisch darzustellen:
require(quantmod)
Times <- NULL
Prices <- NULL
while(1) {
tryCatch({
#Load current quote
Year <- 1970
currentYear <- as.numeric(format(Sys.time(),'%Y'))
while (Year != currentYear) { #Sometimes yahoo returns bad quotes
currentQuote <- getQuote('SPY')
Year <- as.numeric(format(currentQuote['Trade Time'],'%Y'))
}
#Add current quote to the dataset
if (is.null(Times)) {
Times <- Sys.time()-15*60 #Quotes are delayed 15 minutes
Prices <- currentQuote['Last']
} else {
Times <- c(Times,Sys.time())
Prices <- rbind(Prices,currentQuote['Last'])
}
#Convert to 1-minute bars
Data <- xts(Prices,order.by=Times)
Data <- na.omit(to.minutes(Data,indexAt='endof'))
#Plot the data when we have enough
if (nrow(Data)>5) {
chartSeries(Data,theme='white',TA='addRSI(n=5);addBBands(n=5)')
}
#Wait 1 second to avoid overwhelming the server
Sys.sleep(1)
#On errors, sleep 10 seconds and hope it goes away
},error=function(e) {print(e);Sys.sleep(10)})
}
Es erzeugt Diagramme wie folgt:
Sie können die Daten auch für andere Zwecke verwenden.
require(quantmod)
bis zum Ende }
selbst erfassen. Sie müssen mindestens 5 Minuten warten, bis ein Diagramm angezeigt wird.
library(quantmod)
getSymbols("LT.NS",src="yahoo")