web-dev-qa-db-fra.com

Téléchargement du cours de l'action Yahoo en R

C’est une question de débutant dans R. Je télécharge les données du prix mensuel de l’action yahoo finance à l’aide de R où les noms des téléscripteurs sont lus à partir d’un fichier texte. J'utilise une boucle pour lire les noms des téléscripteurs afin de télécharger les données et de les mettre dans une liste. Mon problème est que certains noms de ticker peuvent ne pas être corrects et mon code s'arrête dès qu'il rencontre ce cas. Je veux le suivant.

  1. ignorez le nom du téléscripteur s'il n'est pas correct.
  2. Chaque élément de la liste est une base de données. Je souhaite que les noms des tickers soient ajoutés aux noms des variables dans les éléments de données d'éléments.
  3. J'ai besoin d'un moyen efficace de créer un cadre de données dont les prix de clôture sont des variables.

Voici l'exemple de code pour la version simplifiée de mon problème.

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")  
}   

Le code s’arrête à la troisième entrée, mais je souhaite ignorer ce symbole et passer à «MMM». J'ai entendu parler de la fonction Trycatch () mais je ne sais pas comment l'utiliser. 

En ce qui concerne la question 2, je souhaite que les noms de variable du premier élément de la liste soient "MSFTopen", "MSFThigh", "MSFTlow" et "MSFTclose". Y a-t-il une meilleure façon de le faire en utilisant une combinaison des fonctions loop et paste (). 

Enfin, pour la question 3, il me faut un cadre de données avec trois colonnes correspondant aux cours de clôture. Encore une fois, j'essaie d'éviter une boucle ici.

Je vous remercie.

26
user227290

Votre meilleur choix est d'utiliser quantmod et de stocker les résultats sous forme de série chronologique (dans ce cas, il s'agira de 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=".")])
}
21
Shane

Cela aussi un peu tard ... Si vous souhaitez récupérer des données avec uniquement les fonctions de base de R sans utiliser de progiciels complémentaires, utilisez simplement la fonction read.csv(URL), où l'URL est une chaîne pointant au bon endroit chez Yahoo. Les données seront extraites en tant que données, et vous devrez convertir la "Date" d'une chaîne en un type Date afin que tous les graphes aient une apparence agréable. L'extrait de code simple est ci-dessous.

URL <- "http://ichart.finance.yahoo.com/table.csv?s=SPY"
dat <- read.csv(URL)
dat$Date <- as.Date(dat$Date, "%Y-%m-%d")

L'utilisation des fonctions de base de R peut vous donner plus de contrôle sur la manipulation des données.

21
stotastic

Je suis un peu en retard à la fête, mais je pense que cela sera très utile pour les autres retardataires.

La fonction stockSymbols dans TTR récupère les symboles d'instrument de nasdaq.com et ajuste les symboles pour qu'ils soient compatibles avec Yahoo! La finance. Il renvoie actuellement environ 6 500 symboles pour AMEX, NYSE et NASDAQ. Vous pouvez également consulter le code dans stockSymbols qui ajuste les tickers pour qu’il soit compatible avec Yahoo! Finances pour éventuellement ajuster certains des tickers dans votre fichier.

REMARQUE: stockSymbols dans la version de TTR sur CRAN est cassé en raison d’une modification apportée sur nasdaq.com, mais il a été corrigé dans la version R-forge de TTR.

8
Joshua Ulrich

Je le fais comme ça, car j'ai besoin de la liste de prix historique et d'un fichier de mise à jour quotidienne pour pouvoir exécuter d'autres packages:

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)
3
René Bauch

Légèrement modifié à partir des solutions ci-dessus ... (merci Shane et Stotastic)

 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
 }
1
Manoj Kumar

Si votre objectif ultime est d’obtenir le nom data.frame de trois colonnes de prix de clôture, le nouveau package tidyquant sera peut-être plus approprié.

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)

Cela s’adapte à n’importe quel nombre d’actions, le fichier de 1000 tickers devrait donc fonctionner parfaitement!

1
Davis Vaughan

Malheureusement, l'URL "ichart.finance.yahoo.com" est mort et ne fonctionne pas maintenant. Comme je le sais, Yahoo l'a fermé et il semble qu'il ne sera pas ouvert.

Il y a plusieurs jours, j'ai trouvé une alternative intéressante ( https://eodhistoricaldata.com/ ) avec une API très similaire à Yahoo Finance. 

Fondamentalement, pour R-script décrit ci-dessus, il vous suffit de changer cette partie:

URL <- paste0("ichart.finance.yahoo.com/table.csv?s=", symbols[i])

pour ça:

URL <- paste0("eodhistoricaldata.com/api/table.csv?s=", symbols[i])

Ajoutez ensuite une clé API et cela fonctionnera comme avant. J'ai économisé beaucoup de temps pour mes scripts R dessus.

0
Denis Alaev