Импортировать цену акций из Yahoo Finance в R?


26

Я хотел бы импортировать курс акций «Последняя сделка» из финансов Yahoo в R. Намерение - работать с (почти) данными в реальном времени. Есть ли какие-то решения?

Заранее спасибо за любой полезный комментарий.


Этот поток может также представлять интерес: API данных / каналы доступны в виде пакетов в R .
gung - Восстановить Монику

Ответы:


14

Это на самом деле не вопрос статистики (возможно, его можно перенести в SO?), Но в Quantmod есть замечательная функция, которая делает то, что Дирк делал вручную. Смотрите getQuote()и yahooQF(). При вводе yahooQF()появится меню всех возможных форматов цитат, которые вы можете использовать.

> 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

Спасибо за ваш ответ. Я довольно новичок здесь, в stackexchange. Как я могу перенести мой вопрос на SO?
Стивен

@ Стивен: Всегда пожалуйста. Я не уверен, как перенести вопросы; Я думаю, что модераторы могут это сделать.
Джошуа Ульрих

15

Это довольно легко, учитывая, что R может читать непосредственно с данного URL. Ключ должен просто знать, как сформировать URL. Вот быстрый и грязный пример, основанный на коде, который Dj Padzensky написал в конце 1990-х, и который я поддерживаю в модуле Perl Yahoo-FinanceQuote (который, конечно же, и здесь на CPAN ) почти так же долго.

Если вы знаете немного R, код должен быть понятен. Получить документацию для строки формата немного сложнее, но, например, в модуле Perl есть некоторые.

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> 

Третий столбец - ваша последняя сделка. В часы работы на открытом рынке вы получите меньше NA и большую изменчивость данных. Но учтите, что большинство цен задерживаются на 15 или 20 минут - но некоторые индексы работают в режиме реального времени. Данные в реальном времени - это большой бизнес и основной доход для бирж, поэтому они, как правило, не отдают их. Кроме того, и, если я правильно помню, более новые и более отображаемые в реальном времени на страницах финансов в Google и Yahoo используют что-то более AJAXy, которое труднее добывать извне.


сегодня это не сработало, у меня не было возможности загрузить составной индекс Nasdaq, начиная с 2001 года, из моих обычных источников данных (Quandl и quantmod) по какой-то причине, и я искал альтернативы.
PatrickT

4

Вот небольшая функция, которую я написал, чтобы собрать и нанести на график данные «псевдо-реального времени» от 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)}) 
}

Это производит диаграммы как это: Диаграмма

Вы также можете использовать данные для других целей.


Спасибо за этот скрипт, однако я получаю глупую проблему с "}", я не могу его запустить :(

@acabahe Это все еще хорошо для меня. Удостоверьтесь, что вы захватили все, от require(quantmod)самого конца }на последней строке. Вам нужно подождать не менее 5 минут, прежде чем вы увидите график.
Зак

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.