Aktienkurs von Yahoo Finance in R importieren?

26

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.

Steven
quelle
Dieser Thread könnte auch von Interesse sein: Daten-APIs / Feeds als Pakete in R verfügbar .
gung - Wiedereinsetzung von Monica

Antworten:

14

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
Joshua Ulrich
quelle
Vielen Dank für Ihre Antwort. Ich bin ganz neu hier bei StackExchange. Wie kann ich meine Frage nach SO verschieben?
Steven
@Steven: Gern geschehen. Ich bin mir nicht sicher, wie ich Fragen verschieben soll. Ich denke, Moderatoren können das schaffen.
Joshua Ulrich
15

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.

Dirk Eddelbüttel
quelle
Das hat heute bei mir nicht geklappt. Ich konnte den zusammengesetzten Nasdaq-Index, der vor 2001 erstellt wurde, aus meinen üblichen Datenquellen (Quandl und quantmod) nicht herunterladen und suchte nach Alternativen.
PatrickT
4

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: Diagramm

Sie können die Daten auch für andere Zwecke verwenden.

Zach
quelle
Vielen Dank für dieses Skript. Ich bekomme jedoch ein dummes Problem mit einem "}". Ich kann es nicht ausführen :(
@acabahe Es läuft immer noch gut für mich. Stellen Sie sicher, dass Sie in der letzten Zeile alles von require(quantmod)bis zum Ende }selbst erfassen. Sie müssen mindestens 5 Minuten warten, bis ein Diagramm angezeigt wird.
Zach
-1
library(quantmod)
getSymbols("LT.NS",src="yahoo")
user107070
quelle