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.
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:
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
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.
İş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:
Verileri başka amaçlar için de kullanabilirsiniz.
require(quantmod)
takip edeceğine emin ol}
Son satırda sonuna . Bir grafik gösterilmeden önce en az 5 dakika beklemeniz gerekir.
library(quantmod)
getSymbols("LT.NS",src="yahoo")