Імпортна ціна акцій з Yahoo Finance в R?


26

Я хотів би імпортувати ціну акцій «Остання торгівля» з фінансів Yahoo у Р. Наміром є робота з (майже) даними в реальному часі. Чи є рішення?

Заздалегідь дякую за будь-який корисний коментар.


Відповіді:


14

Це насправді не питання статистики (можливо, це може бути перенесено на SO?), Але є приємна функція в квантоді, яка робить те, що Дірк робив вручну. Дивіться 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?
Стівен

@Steven: Ласкаво просимо. Я не впевнений, як рухати питання; Я думаю, що це можуть зробити модератори.
Джошуа Ульріх

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.