Importer le cours des actions de Yahoo Finance dans R?

26

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.

Steven
la source
Ce fil peut également intéresser: API / Flux de données disponibles sous forme de paquets en R .
gung - Rétablir Monica

Réponses:

14

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
Joshua Ulrich
la source
Merci pour votre réponse. Je suis assez nouveau ici à stackexchange. Comment puis-je déplacer ma question vers SO?
Steven
@Steven: Je vous en prie. Je ne sais pas comment déplacer les questions; Je pense que les modérateurs peuvent le faire.
Joshua Ulrich
15

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.

Dirk Eddelbuettel
la source
cela n'a pas fonctionné pour moi aujourd'hui, je n'ai pas pu télécharger l'index composite Nasdaq datant d'avant 2001, à partir de mes sources de données habituelles (Quandl et quantmod) pour une raison quelconque, et je cherchais des alternatives.
PatrickT
4

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

Vous pouvez également utiliser les données à d'autres fins.

Zach
la source
Merci pour ce script, mais je reçois un problème idiot avec un "}" Je ne peux pas l'exécuter :(
@acabahe Cela fonctionne toujours bien pour moi. Assurez-vous de tout saisir de require(quantmod)la fin }à la dernière ligne. Vous devrez attendre au moins 5 minutes avant de voir apparaître un graphique.
Zach
-1
library(quantmod)
getSymbols("LT.NS",src="yahoo")
user107070
la source