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.
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.
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=".")])
}
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.
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
.
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)
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
}
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!
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.