Importar preço da ação do Yahoo Finance para o R?


26

Gostaria de importar o preço das ações "Last Trade" do Yahoo finance para R. A intenção é trabalhar com dados (quase) em tempo real. Existem soluções?

Agradecemos antecipadamente por qualquer comentário útil.


Esta discussão também podem ser de interesse: Dados APIs / feeds disponíveis como pacotes em R .
gung - Restabelece Monica

Respostas:


14

Isso realmente não é uma questão estatística (talvez isso possa ser movido para SO?), Mas há uma boa função no quantmod que faz o que Dirk fez manualmente. Veja getQuote()e yahooQF(). A digitação yahooQF()exibirá um menu com todos os formatos de cotação possíveis que você pode usar.

> 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

Obrigado pela sua resposta. Sou bastante novo aqui no stackexchange. Como posso mover minha pergunta para SO?
1716 Steven

@ Steven: De nada. Não tenho certeza de como mover perguntas; Eu acho que os moderadores podem fazer isso.
Joshua Ulrich

15

Isso é bastante fácil, pois o R pode ler diretamente um determinado URL. A chave é simplesmente saber como formar a URL. Aqui está um exemplo rápido e sujo, baseado no código que Dj Padzensky escreveu no final dos anos 90 e que eu tenho mantido no módulo Perl Yahoo-FinanceQuote (que é claro também no CPAN aqui ) por quase tanto tempo.

Se você souber um pouco de R, o código deve ser auto-explicativo. Obter documentação para a string de formato é um pouco mais complicado, mas por exemplo, o módulo Perl possui alguns.

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> 

A coluna três é o seu último negócio. Durante o horário de mercado aberto, você receberá menos NAs e mais variabilidade de dados. Porém, observe que a maioria dos preços está atrasada em 15 ou 20 minutos - mas alguns índices são em tempo real. Os dados em tempo real são um grande negócio e uma grande receita para as trocas, portanto eles tendem a não divulgá-los. Além disso, e se bem me lembro, as exibições mais recentes e em tempo real nas páginas de Finanças do Google e Yahoo usam algo mais AJAXy que é mais difícil de ordenhar do lado de fora.


isso não funcionou para mim hoje, não consegui baixar o índice composto da Nasdaq antes de 2001, de minhas fontes de dados habituais (Quandl e quantmod) por algum motivo, e estava procurando alternativas.
PatrickT

4

Aqui está uma pequena função que escrevi para reunir e traçar dados em "pseudo-tempo real" do 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)}) 
}

Produz gráficos como este: Gráfico

Você também pode usar os dados para outros fins.


Obrigado por este script, No entanto, estou tendo um problema bobo com um "}". Não consigo executá-lo :(

@acabahe Ainda funciona bem para mim. Certifique-se de pegar tudo, desde require(quantmod)a trilha }sozinha na última linha. Você precisará esperar pelo menos 5 minutos antes de ver um gráfico aparecer.
Zach

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.