Je voudrais importer le prix de l'action "Last Trade" de Yahoo Finance dans R. L'intention est de travailler avec des données (presque) en temps réel. Y a-t-il des solutions?
Merci d'avance pour tout commentaire utile.
Je voudrais importer le prix de l'action "Last Trade" de Yahoo Finance dans R. L'intention est de travailler avec des données (presque) en temps réel. Y a-t-il des solutions?
Merci d'avance pour tout commentaire utile.
Réponses:
Ce n'est vraiment pas une question de statistiques (peut-être que cela pourrait être déplacé vers SO?), Mais il y a une belle fonction dans quantmod qui fait ce que Dirk a fait à la main. Voir getQuote()
et yahooQF()
. La saisie yahooQF()
fera apparaître un menu de tous les formats de devis possibles que vous pouvez utiliser.
> 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
C'est assez facile étant donné que R peut lire directement une URL donnée. La clé est simplement de savoir comment former l'URL. Voici un exemple rapide et sale basé sur le code écrit par Dj Padzensky à la fin des années 1990 et que je maintiens dans le module Perl Yahoo-FinanceQuote (qui est bien sûr également sur CPAN ici ) depuis presque aussi longtemps.
Si vous connaissez un petit R, le code devrait être explicite. Obtenir de la documentation pour la chaîne de format est un peu plus compliqué mais par exemple le module Perl en a.
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>
La troisième colonne est votre dernier échange. Pendant les heures d'ouverture du marché, vous obtiendrez moins de NA et plus de variabilité des données. Mais notez cependant que la plupart des prix sont retardés de 15 ou 20 minutes --- mais certains indices sont en temps réel. Les données en temps réel sont une grande entreprise et des revenus importants pour les échanges, ils ont donc tendance à ne pas les divulguer. De plus, et si je me souviens bien, les affichages plus récents et plus en temps réel sur les pages Finance de Google et Yahoo utilisent quelque chose de plus AJAXy qui est plus difficile à traire de l'extérieur.
Voici une petite fonction que j'ai écrite pour rassembler et tracer des données "pseudo-temps réel" de 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)})
}
Il produit des graphiques comme celui-ci:
Vous pouvez également utiliser les données à d'autres fins.
require(quantmod)
la fin }
à la dernière ligne. Vous devrez attendre au moins 5 minutes avant de voir apparaître un graphique.
library(quantmod)
getSymbols("LT.NS",src="yahoo")