web-dev-qa-db-ja.com

RでのYahoo株価のダウンロード

これはRの初心者向けの質問です。ティッカー名がテキストファイルから読み取られるRを使用して、yahoo Financeの毎月の株価データをダウンロードしています。ループを使用してティッカー名を読み取り、データをダウンロードしてリストに入れています。私の問題は、一部のティッカー名が正しくない可能性があるため、このケースが発生するとコードが停止することです。以下が欲しいです。

  1. ティッカー名が正しくない場合はスキップします。
  2. リスト内の各要素はデータフレームです。要素データフレームの変数名にティッカー名を追加したい。
  3. 変数として終値を持つデータフレームを作成する効率的な方法が必要です。

ここに私の問題の簡易版のサンプルコードがあります。

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列のデータフレームが必要です。繰り返しますが、ここでループを回避しようとしています。

ありがとうございました。

27
user227290

あなたの最善の策は、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=".")])
}
22
Shane

これも少し遅れています...アドオンパッケージを処理せずに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の基本関数を使用すると、データ操作をより詳細に制御できます。

22
stotastic

私はパーティーに少し遅れましたが、これは他の遅い来訪者にとって非常に役立つと思います。

stockSymbolsTTR関数は、nasdaq.comから楽器のシンボルを取得し、Yahoo!と互換性があるようにシンボルを調整します。ファイナンス。現在、AMEX、NYSE、NASDAQで最大6,500個のシンボルを返します。 stockSymbolsのコードを見て、Yahoo!と互換性があるようにティッカーを調整することもできます。ファイル内のティッカーの一部を調整するための資金調達。

注:nasdaq.comの変更により、CRANのstockSymbolsのバージョンのTTRは壊れていますが、TTR

9
Joshua Ulrich

他のパッケージを実行するためには、履歴価格リストと毎日の更新ファイルが必要なので、このようにします。

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

上記のソリューションからわずかに変更...(シェーンとストータスティックに感謝)

 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

最終的な目標が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ティッカーのファイルは正常に機能します。

1
Davis Vaughan

残念ながら、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スクリプトの作成にかかる時間を大幅に節約しました。

0
Denis Alaev