Impor harga saham dari Yahoo Finance ke R?


26

Saya ingin mengimpor harga saham "Perdagangan Terakhir" dari Yahoo finance ke R. Tujuannya adalah untuk bekerja dengan (hampir) data waktu nyata. Apakah ada solusi?

Terima kasih sebelumnya atas komentar yang bermanfaat.


Jawaban:


14

Ini benar-benar bukan pertanyaan statistik (mungkin ini bisa dipindahkan ke SO?), Tetapi ada fungsi yang bagus dalam kuantmod yang melakukan apa yang telah dilakukan Dirk dengan tangan. Lihat getQuote()dan yahooQF(). Mengetik yahooQF()akan memunculkan menu dari semua format kutipan yang dapat Anda gunakan.

> 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

Terima kasih atas jawaban Anda. Saya cukup baru di sini di stackexchange. Bagaimana saya bisa memindahkan pertanyaan saya ke SO?
Steven

@ Seven: Sama-sama. Saya tidak yakin bagaimana cara memindahkan pertanyaan; Saya pikir moderator dapat melakukannya.
Joshua Ulrich

15

Itu cukup mudah mengingat R dapat membaca langsung dari URL yang diberikan. Kuncinya adalah mengetahui cara membentuk URL. Berikut ini adalah contoh cepat dan kotor berdasarkan kode yang ditulis Dj Padzensky pada akhir 1990-an dan yang telah saya pertahankan dalam modul Perl Yahoo-FinanceQuote (yang tentu saja juga di CPAN di sini ) selama hampir sepanjang.

Jika Anda tahu sedikit R, kode harus jelas. Memperoleh dokumentasi untuk format string agak sulit tetapi misalnya modul Perl memiliki beberapa.

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> 

Kolom tiga adalah perdagangan terakhir Anda. Selama jam pasar terbuka Anda akan mendapatkan NAs lebih sedikit dan lebih banyak variabilitas data. Namun perlu dicatat bahwa sebagian besar harga tertunda 15 atau 20 menit --- tetapi beberapa indeks adalah waktu-nyata. Data waktu nyata adalah bisnis besar dan pendapatan besar untuk pertukaran sehingga mereka cenderung tidak memberikannya. Juga, dan jika saya ingat dengan benar, tampilan yang lebih baru dan lebih real-time pada halaman Keuangan di Google dan Yahoo menggunakan sesuatu yang lebih AJAXy yang lebih sulit untuk diperah dari luar.


ini tidak bekerja untuk saya hari ini, saya belum dapat mengunduh indeks Nasdaq komposit kembali ke sebelum tahun 2001, dari sumber data saya yang biasa (Quandl dan quantmod) untuk beberapa alasan, dan sedang mencari alternatif.
PatrickT

4

Inilah sedikit fungsi yang saya tulis untuk mengumpulkan dan memetakan data "pseudo-real time" dari 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)}) 
}

Ini menghasilkan grafik seperti ini: Grafik

Anda juga dapat menggunakan data untuk tujuan lain.


Terima kasih untuk skrip ini, Namun saya mendapatkan masalah konyol dengan "}" Saya tidak bisa menjalankannya :(

@acabahe Masih berjalan baik untuk saya. Pastikan Anda mengambil semuanya, mulai require(quantmod)dari mengekor }dengan sendirinya di baris terakhir. Anda harus menunggu setidaknya 5 menit sebelum grafik akan muncul.
Zach

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.