Tôi muốn nhập giá cổ phiếu "Giao dịch cuối cùng" từ tài chính Yahoo vào R. Ý định là làm việc với (gần như) dữ liệu thời gian thực. Có giải pháp nào không?
Cảm ơn trước cho bất kỳ bình luận hữu ích.
Tôi muốn nhập giá cổ phiếu "Giao dịch cuối cùng" từ tài chính Yahoo vào R. Ý định là làm việc với (gần như) dữ liệu thời gian thực. Có giải pháp nào không?
Cảm ơn trước cho bất kỳ bình luận hữu ích.
Câu trả lời:
Đây thực sự không phải là một câu hỏi thống kê (có lẽ điều này có thể được chuyển sang SO?), Nhưng có một chức năng hay trong quantmod thực hiện những gì Dirk đã làm bằng tay. Xem getQuote()
và yahooQF()
. Gõ yahooQF()
sẽ hiển thị một menu của tất cả các định dạng trích dẫn có thể bạn có thể sử dụng.
> 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
Điều đó khá dễ dàng khi R có thể đọc trực tiếp một URL đã cho. Điều quan trọng là chỉ cần biết cách tạo URL. Dưới đây là một ví dụ nhanh và bẩn dựa trên mã Dj Padzenky đã viết vào cuối những năm 1990 và tôi đã duy trì trong mô-đun Perl Yahoo-FinanceQuote (tất nhiên cũng có trên CPAN ở đây ) gần như lâu dài.
Nếu bạn biết một chút R, mã sẽ tự giải thích. Lấy tài liệu cho chuỗi định dạng phức tạp hơn một chút nhưng ví dụ mô-đun Perl có một số.
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>
Cột ba là giao dịch cuối cùng của bạn. Trong giờ thị trường mở, bạn sẽ nhận được ít NA hơn và biến đổi dữ liệu nhiều hơn. Nhưng lưu ý rằng hầu hết giá đều chậm 15 hoặc 20 phút --- nhưng một số chỉ số là thời gian thực. Dữ liệu thời gian thực là một doanh nghiệp lớn và doanh thu lớn cho các trao đổi để họ có xu hướng không cho đi. Ngoài ra, và nếu tôi nhớ chính xác, màn hình mới hơn và hiển thị thời gian thực hơn trên các trang Tài chính tại Google và Yahoo sử dụng một thứ AJAXy khó lấy sữa hơn từ bên ngoài.
Đây là một chức năng nhỏ mà tôi đã viết để thu thập và lập biểu đồ dữ liệu "giả thời gian thực" từ 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)})
}
Nó tạo ra các biểu đồ như thế này:
Bạn cũng có thể sử dụng dữ liệu cho các mục đích khác.
require(quantmod)
đến }
cuối cùng trên dòng cuối cùng. Bạn sẽ cần đợi ít nhất 5 phút trước khi bạn thấy một biểu đồ xuất hiện.
library(quantmod)
getSymbols("LT.NS",src="yahoo")