これはRの初心者向けの質問です。ティッカー名がテキストファイルから読み取られるRを使用して、yahoo Financeの毎月の株価データをダウンロードしています。ループを使用してティッカー名を読み取り、データをダウンロードしてリストに入れています。私の問題は、一部のティッカー名が正しくない可能性があるため、このケースが発生するとコードが停止することです。以下が欲しいです。
ここに私の問題の簡易版のサンプルコードがあります。
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")
}
コードは3番目のエントリで停止しますが、このティッカーをスキップして「MMM」に進みます。 Trycatch()関数について聞いたことがありますが、使用方法がわかりません。
質問2に従って、リストの最初の要素の変数名を「MSFTopen」、「MSFThigh」、「MSFTlow」、および「MSFTclose」にする必要があります。 loopとpaste()関数の組み合わせを使用する以外に、それを行う方法がありますか?.
最後に、質問3では、終値に対応する3列のデータフレームが必要です。繰り返しますが、ここでループを回避しようとしています。
ありがとうございました。
あなたの最善の策は、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の基本関数を使用すると、データ操作をより詳細に制御できます。
私はパーティーに少し遅れましたが、これは他の遅い来訪者にとって非常に役立つと思います。
stockSymbols
のTTR
関数は、nasdaq.comから楽器のシンボルを取得し、Yahoo!と互換性があるようにシンボルを調整します。ファイナンス。現在、AMEX、NYSE、NASDAQで最大6,500個のシンボルを返します。 stockSymbols
のコードを見て、Yahoo!と互換性があるようにティッカーを調整することもできます。ファイル内のティッカーの一部を調整するための資金調達。
注:nasdaq.comの変更により、CRANのstockSymbols
のバージョンのTTR
は壊れていますが、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)
上記のソリューションからわずかに変更...(シェーンとストータスティックに感謝)
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
}
最終的な目標が3列の終値のdata.frameを取得することである場合、新しいパッケージ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ティッカーのファイルは正常に機能します。
残念ながら、URL「ichart.finance.yahoo.com」は廃止され、現在機能していません。私が知っているように、ヤフーはそれを閉じ、それは開かれないようです。
数日前、Yahoo Financeと非常によく似たAPIを備えたNiceの代替手段( https://eodhistoricaldata.com/ )を見つけました。
基本的に、上記のRスクリプトの場合、この部分を変更するだけです。
URL <- paste0("ichart.finance.yahoo.com/table.csv?s=", symbols[i])
これに:
URL <- paste0("eodhistoricaldata.com/api/table.csv?s=", symbols[i])
次に、APIキーを追加すると、以前と同じように機能します。 Rスクリプトの作成にかかる時間を大幅に節約しました。