Загрузка цен на акции Yahoo в R
Это вопрос новичка в R. я загружаю ежемесячные данные о ценах акций yahoo finance, используя R, где имена тикеров считываются из текстового файла. Я использую цикл для чтения имен тикеров, чтобы загрузить данные и поместить их в список. Моя проблема в том, что некоторые имена тикеров могут быть неправильными, поэтому мой код останавливается, когда он сталкивается с этим случаем. Я хочу следующее.
- пропустите имя тикера, если оно неверно.
- каждый элемент в списке является фрейм данных. Я хочу, чтобы имена тикеров были добавлены к именам переменных в элементных фреймах данных.
- мне нужен эффективный способ создания фрейма данных,который имеет цены закрытия в качестве переменных.
вот пример кода для упрощенной версии моей проблемы.
library(tseries)
tckk <- c("MSFT", "C", "VIA/B", "MMM") # ticker names defined
numtk <- length(tckk);
ustart <- "2000-12-30";
uend <- "2007-12-30" # start and end date
all_dat <- list(); # empty list to fill in the data
for(i in 1:numtk)
{
all_dat[[i]] <- xxx <- get.hist.quote(instrument = tckk[i], start=ustart, end=uend, quote = c("Open", "High", "Low", "Close"), provider = "yahoo", compression = "m")
}
код останавливается на третьей позиции, но я хочу пропустить этот тикер и перейти к "МММ". Я слышал о функции Trycatch (), но не знаю, как ее использовать.
согласно вопрос 2, я хочу, чтобы имена переменных для первого элемента списка были "MSFTopen", "MSFThigh", "MSFTlow"и " MSFTclose". Есть ли лучший способ сделать это помимо использования комбинации функции loop и paste ().
наконец, для вопроса 3 Мне нужен фрейм данных с тремя столбцами, соответствующими ценам закрытия. Опять же, я пытаюсь избежать петли.
спасибо.
7 ответов
лучше всего использовать quantmod и хранить результаты как временные ряды (в этом случае это будет xts
):
library(quantmod)
library(plyr)
symbols <- c("MSFT","C","VIA/B","MMM")
#1
l_ply(symbols, function(sym) try(getSymbols(sym)))
symbols <- symbols[symbols %in% ls()]
#2
sym.list <- llply(symbols, get)
#3
data <- xts()
for(i in seq_along(symbols)) {
symbol <- symbols[i]
data <- merge(data, get(symbol)[,paste(symbol, "Close", sep=".")])
}
Это немного поздно...Если вы хотите захватить данные только с базовыми функциями R без каких-либо дополнительных пакетов, просто используйте функцию read.csv(URL)
, где URL-это строка, указывающая на нужное место в Yahoo. Данные будут извлечены в виде фрейма данных, и вам нужно будет преобразовать "дату" из строки В Тип даты, чтобы любые графики выглядели красиво. Простой фрагмент кода приведен ниже.
URL <- "http://ichart.finance.yahoo.com/table.csv?s=SPY"
dat <- read.csv(URL)
dat$Date <- as.Date(dat$Date, "%Y-%m-%d")
использование базовых функций R может дать вам больше контроля над манипуляция с данными.
Я немного опоздал на вечеринку,но я думаю, что это будет очень полезно для других опоздавших.
на на TTR
извлекает символы инструмента из nasdaq.com, и настраивает символы, чтобы быть совместимыми с Yahoo! Финансы. В настоящее время он возвращает ~6,500 символов для AMEX, NYSE и NASDAQ. Вы также можете взглянуть на код stockSymbols
это настраивает тикеры, чтобы быть совместимыми с Yahoo! Финансы, чтобы, возможно, настроить некоторые из тикеров в вашем файл.
Примечание: stockSymbols
в редакции от TTR
на CRAN сломан из-за изменения на nasdaq.com, но он исправлен в версии R-forge TTR
.
Я делаю это так, потому что мне нужно иметь исторический прайс-лист и файл ежедневного обновления для запуска других пакетов:
library(fImport)
fecha1<-"03/01/2009"
fecha2<-"02/02/2010"
Sys.time()
y <- format(Sys.time(), "%y")
m <- format(Sys.time(), "%m")
d <- format(Sys.time(), "%d")
fecha3 <- paste(c(m,"/",d,"/","20",y), collapse="")
write.table(yahooSeries("GCI", from=fecha1, to=fecha2), file = "GCI.txt", sep="\t", quote = FALSE, eol="\r\n", row.names = TRUE)
write.table(yahooSeries("GCI", from=fecha2, to=fecha3), file = "GCIupdate.txt", sep="\t", quote = FALSE, eol="\r\n", row.names = TRUE)
GCI <- read.table("GCI.txt")
GCI1 <- read.table("GCIupdate.txt")
GCI <- rbind(GCI1, GCI)
GCI <- unique(GCI)
write.table(GCI, file = "GCI.txt", sep="\t", quote = FALSE, eol="\r\n", row.names = TRUE)
Если ваша конечная цель-получить данные.рамка из трех столбцов цены закрытия, затем новый пакет tidyquant
может быть лучше подходит для этого.
library(tidyquant)
symbols <- c("MSFT", "C", "VIA/B", "MMM")
# Download data in tidy format.
# Will remove VIA/B and warn you.
data <- tq_get(symbols)
# Ticker symbols as column names for closing prices
data %>%
select(.symbol, date, close) %>%
spread(key = .symbol, value = close)
это будет масштабироваться до любого количества акций, поэтому файл 1000 тикеров должен работать просто отлично!
слегка изменено из приведенных выше решений... (спасибо Шейну и Стотастику)
symbols <- c("MSFT", "C", "MMM")
# 1. retrieve data
for(i in seq_along(symbols)) {
URL <- paste0("http://ichart.finance.yahoo.com/table.csv?s=", symbols[i])
dat <- read.csv(URL)
dat$Date <- as.Date(dat$Date, "%Y-%m-%d")
assign(paste0(symbols[i]," _data"), dat)
dat <- NULL
}
к сожалению, URL "ichart.finance.yahoo.com-мертв и сейчас не работает. Как я знаю, Yahoo закрыл его, и, похоже, он не будет открыт.
несколько дней назад я нашел хорошую альтернативу (https://eodhistoricaldata.com/) С API, очень похожим на Yahoo Finance.
в принципе, для R-скрипта, описанного выше, вам просто нужно изменить эту часть:
URL <- paste0("ichart.finance.yahoo.com/table.csv?s=", symbols[i])
для этого:
URL <- paste0("eodhistoricaldata.com/api/table.csv?s=", symbols[i])
затем добавьте ключ API, и он будет работать в же, как и раньше. Я сэкономил много времени для своих R-скриптов на нем.