Importare il prezzo delle azioni da Yahoo Finance in R?


26

Vorrei importare il prezzo delle azioni "Last Trade" da Yahoo Finance in R. L'intenzione è quella di lavorare con dati (quasi) in tempo reale. Ci sono delle soluzioni?

Grazie in anticipo per qualsiasi commento utile.


Questo thread può anche essere di interesse: API dati / feeds disponibili come pacchetti in R .
gung - Ripristina Monica

Risposte:


14

Questa non è davvero una domanda statistica (forse potrebbe essere spostata su SO?), Ma c'è una bella funzione in quantmod che fa ciò che Dirk ha fatto a mano. Vedi getQuote()e yahooQF(). Digitando yahooQF()si aprirà un menu di tutti i possibili formati di preventivo che è possibile utilizzare.

> 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

La ringrazio per la risposta. Sono abbastanza nuovo qui su stackexchange. Come posso spostare la mia domanda su SO?
Steven

@Steven: Prego. Non sono sicuro di come spostare le domande; Penso che i moderatori possano farlo.
Joshua Ulrich,

15

È abbastanza facile dato che R può leggere direttamente da un determinato URL. La chiave è semplicemente sapere come formare l'URL. Ecco un esempio veloce e sporco basato sul codice scritto da Dj Padzensky alla fine degli anni '90 e che ho mantenuto nel modulo Perl Yahoo-FinanceQuote (che ovviamente è anche su CPAN qui ) per quasi tutto il tempo.

Se conosci un po 'di R, il codice dovrebbe essere autoesplicativo. Ottenere documentazione per la stringa di formato è un po 'più complicato, ma ad esempio il modulo Perl ne ha alcuni.

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 terza colonna è il tuo ultimo scambio. Durante le ore di mercato aperto otterrai meno NA e maggiore variabilità dei dati. Ma nota che la maggior parte dei prezzi ha un ritardo di 15 o 20 minuti --- ma alcuni indici sono in tempo reale. I dati in tempo reale sono una grande impresa e entrate importanti per gli scambi, quindi tendono a non distribuirli. Inoltre, e se ricordo bene, i display più recenti e più in tempo reale sulle pagine Finance di Google e Yahoo usano qualcosa di più AJAXy che è più difficile da mungere dall'esterno.


questo non ha funzionato per me oggi, non sono stato in grado di scaricare l'indice Nasdaq composito risalente a prima del 2001, dalle mie solite fonti di dati (Quandl e quantmod) per qualche motivo, e stavo cercando alternative.
Patrick,

4

Ecco una piccola funzione che ho scritto per raccogliere e tracciare dati "pseudo-real time" da 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)}) 
}

Produce grafici come questo: Grafico

È inoltre possibile utilizzare i dati per altri scopi.


Grazie per questo script, tuttavia sto ricevendo un problema stupido con un "}" Non riesco a eseguirlo :(

@acabahe Funziona ancora bene per me. Assicurati di afferrare tutto dal require(quantmod)trascinamento }da solo sull'ultima riga. Dovrai attendere almeno 5 minuti prima di vedere apparire un grafico.
Zach,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.