Importować cenę akcji z Yahoo Finance do R?

26

Chciałbym zaimportować cenę akcji „Last Trade” z finansów Yahoo do R. Intencją jest praca z (prawie) danymi w czasie rzeczywistym. Czy są jakieś rozwiązania?

Z góry dziękuję za pomocny komentarz.

Steven
źródło
Wątek może być również interesujące: Dane API / kanały dostępne w opakowaniach i R .
gung - Przywróć Monikę

Odpowiedzi:

14

To naprawdę nie jest pytanie statystyczne (być może można to przenieść do SO?), Ale jest ładna funkcja w quantmod, która robi to, co Dirk zrobił ręcznie. Zobacz getQuote()i yahooQF(). Wpisanie yahooQF()spowoduje wyświetlenie menu wszystkich możliwych formatów cytatów, których możesz użyć.

> 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
źródło
Dziękuję za Twoją odpowiedź. Jestem tutaj całkiem nowy w Stackexchange. Jak mogę przenieść moje pytanie do SO?
Steven
@Steven: Nie ma za co. Nie jestem pewien, jak poruszać pytania; Myślę, że moderatorzy mogą to zrobić.
Joshua Ulrich
15

Jest to dość łatwe, biorąc pod uwagę, że R może odczytać bezpośrednio z danego adresu URL. Kluczem jest po prostu wiedzieć, jak utworzyć adres URL. Oto szybki i nieprzyzwoity przykład oparty na kodzie napisanym przez Dj Padzieńskiego pod koniec lat 90. i który utrzymuję w module Perla Yahoo-FinanceQuote (który oczywiście dotyczy również CPAN ) prawie tak długo.

Jeśli znasz trochę R, kod powinien być zrozumiały. Pobieranie dokumentacji dla ciągu formatu jest nieco trudniejsze, ale np. Moduł Perla ma trochę.

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> 

Kolumna trzecia to Twoja ostatnia transakcja. W godzinach otwartego rynku otrzymasz mniej NA i większą zmienność danych. Należy jednak pamiętać, że większość cen jest opóźniona o 15 lub 20 minut --- ale niektóre wskaźniki są podawane w czasie rzeczywistym. Dane w czasie rzeczywistym to duży biznes i duży przychód na giełdach, więc zwykle nie oddają go. Ponadto, i jeśli dobrze pamiętam, nowsze i bardziej wyświetlane w czasie rzeczywistym strony Finansów w Google i Yahoo używają czegoś więcej AJAXy, które trudniej jest wydoić z zewnątrz.

Dirk Eddelbuettel
źródło
to nie zadziałało dzisiaj dla mnie, z jakiegoś powodu nie byłem w stanie pobrać złożonego indeksu Nasdaq sprzed 2001 roku, z moich zwykłych źródeł danych (Quandl i quantmod) i szukałem alternatyw.
PatrickT
4

Oto mała funkcja, którą napisałem w celu gromadzenia i tworzenia wykresów danych „pseudo-czasu rzeczywistego” z yahoo:

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

Tworzy takie wykresy: Wykres

Możesz również użyć danych do innych celów.

Zach
źródło
Dziękuję za ten skrypt, jednak dostaję głupi problem z „}” Nie mogę go uruchomić :(
@acabahe Nadal działa dobrze dla mnie. Upewnij się chwycić wszystko od require(quantmod)do spływu }wszystko przez siebie w ostatnim wierszu. Musisz poczekać co najmniej 5 minut, zanim pojawi się wykres.
Zach.
-1
library(quantmod)
getSymbols("LT.NS",src="yahoo")
użytkownik107070
źródło