Yahoo Finance'den R'ye stok fiyatı al?


26

Yahoo Finans'tan "Last Trade" hisse senedi fiyatını R'ye aktarmak istiyorum. Amaç (neredeyse) gerçek zamanlı verilerle çalışmaktır. Herhangi bir çözüm var mı?

Yararlı yorumlarınız için şimdiden teşekkür ederiz.


Yanıtlar:


14

Bu gerçekten bir istatistik sorusu değil (belki de bu SO'a taşınabilir mi?), Fakat Quantkod'da Dirk'ün elle yaptığı şeyi yapan hoş bir işlev var. Bkz getQuote()ve yahooQF(). Yazma yahooQF(), kullanabileceğiniz tüm olası teklif biçimlerinin bir menüsünü getirecektir.

> 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

Cevabınız için teşekkür ederim. Burada yığın değişiminde oldukça yeniyim. Sorumu SO'ya nasıl aktarabilirim?
Steven

@Steven: Rica ederim. Soruları nasıl taşıyacağımı bilmiyorum; Bence moderatörler yapabilir.
Joshua Ulrich

15

R'nin verilen URL'yi doğrudan okuyabildiği göz önüne alındığında bu oldukça kolaydır . Anahtar sadece URL'nin nasıl oluşturulacağını bilmek. İşte Dj Padzensky'nin 1990'ların sonlarında yazdığı ve Perl modülünde Yahoo-FinanceQuote'te (tabii ki burada CPAN da var ) bu kadar uzun süredir bulunduğum koduna dayanan hızlı ve kirli bir örnek .

Küçük bir R biliyorsanız, kod kendini açıklamalıdır. Biçimlendirme dizgisi için dokümantasyon almak biraz daha zordur, ancak örneğin Perl modülünde bazıları vardır.

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> 

Üçüncü sütun, son işleminizdir. Açık piyasa saatlerinde daha az sayıda NA ve daha fazla veri değişkenliği elde edeceksiniz. Ancak, çoğu fiyatın 15 veya 20 dakikalık bir gecikme olmasına rağmen --- bazı endekslerin gerçek zamanlı olduğunu unutmayın. Gerçek zamanlı veriler büyük bir işletmedir ve borsalar için büyük bir gelirdir, bu yüzden bunu dağıtmama eğilimindedir. Ayrıca, doğru hatırlıyorsam, Google ve Yahoo’daki Finans sayfalarında daha yeni ve daha çok gerçek zamanlı görüntüler, dışarıdan süt almak için daha zor olan bir AJAXy kullanıyor.


Bu bugün benim için işe yaramadı, 2001'den önce geri dönen kompozit Nasdaq endeksini her zamanki veri kaynaklarımdan (Quandl ve quantmod) bir nedenden dolayı indiremedim ve alternatifler arıyordum.
PatrickT

4

İşte yahoo'dan "sözde gerçek zamanlı" verileri toplamak ve çizelgelemek için yazdığım küçük bir işlev:

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

Bunun gibi grafikler üretir: Grafik

Verileri başka amaçlar için de kullanabilirsiniz.


Bu senaryo için teşekkürler, Ancak "}" ile aptalca bir sorun yaşıyorum: Çalıştıramıyorum :(

@ acabahe Hala benim için iyi çalışıyor. Her şeyi require(quantmod)takip edeceğine emin ol}Son satırda sonuna . Bir grafik gösterilmeden önce en az 5 dakika beklemeniz gerekir.
Zach

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.