web-dev-qa-db-ja.com

RのQuantmodを使用してYahoo Financeからデータをダウンロードできない

このコードを使用してYahooからデータをダウンロードしようとしています。

library(quantmod)
getSymbols("WOW", auto.assign=F)

これは、過去を除くすべての機会で、グループ割り当ての5日前を除いて、過去に私にとってはうまくいきました。

今を除いて、私はこのエラーを受け取ります:

Error in download.file(paste(yahoo.URL, "s=", Symbols.name, "&a=", from.m,  : cannot download all files
In addition: Warning message:
In download.file(paste(yahoo.URL, "s=", Symbols.name, "&a=", from.m,  :
  URL 'https://ichart.finance.yahoo.com/table.csv?
s=WOW&a=0&b=01&c=2007&d=4&e=17&f=2017&g=d&q=q&y=0&z=WOW&x=.csv': status was 
'502 Bad Gateway'
14
Daniel

価格履歴csv URLが変更されたようです

古い https://chart.finance.yahoo.com/table.csv?s=AAPL&a=2&b=17&c=2017&d=3&e=17&f=2017&g=d&ignore=.csv

新規: https://query1.finance.yahoo.com/v7/finance/download/AAPL?period1=1492438581&period2=1495030581&interval=1d&events=history&crumb=XXXXXXX

新しいバージョンでは、ユーザーのブラウザーのCookie情報を反映するように見える「クラム」フィールドが追加されます。価格履歴の自動ダウンロードを意図的にブロックし、WebブラウザでCookieを検証するための情報をクエリに強制的に提供しているようです。

11
solrak18

修正の詳細は https://github.com/joshuaulrich/quantmod/issues/157

エッセンシャル

remotes::install_github("joshuaulrich/quantmod", ref="157_yahoo_502")
# or
devtools::install_github("joshuaulrich/quantmod", ref="157_yahoo_502")
9
Michael Cohen

Quantmodのバージョン0.4-9はこの問題を修正し、現在は [〜#〜] cran [〜#〜] で利用可能です。

3
Robert

なぜYahooがデータのダウンロードを提供できるほどナイスで、なぜ彼らがそれをやめたらどうすればいいのかと疑問に思っていました。幸いなことに、Joshua Ulrichのご厚意により支援が行われています。

余計なことに、ダウンロードの問題を回避するための1つのアプローチを示す修正をコーディングしました。

library(xts)
getSymbols.yahoo.fix <- function (symbol, 
                                  from       = "2007-01-01", 
                                  to         = Sys.Date(), 
                                  period     = c("daily","weekly","monthly"),
                                  envir      = globalenv(),
                                  crumb      = "YourCrumb",
                                  DLdir      = "~/Downloads/") { #1
     # build yahoo query
     query1    <- paste("https://query1.finance.yahoo.com/v7/finance/download/",symbol,"?",sep="")
     fromPosix <- as.numeric(as.POSIXlt(from))
     toPosix   <- as.numeric(as.POSIXlt(to))
     query2    <- paste("period1=", fromPosix, "&period2=", toPosix, sep = "")
     interval  <- switch(period[1], daily = "1d", weekly = "1wk", monthly = "1mo")
     query3    <- paste("&interval=", interval, "&events=history&crumb=", crumb, sep = "")
     yahooURL  <- paste(query1, query2, query3, sep = "")
     #' requires browser to be open
     utils::browseURL("https://www.google.com")
     #' run the query - downloads the security as a csv file
     #' DLdir defaults to download directory in browser preferences
     utils::browseURL(yahooURL)
     #' wait 500 msec for download to complete - mileage may vary
     Sys.sleep(time = 0.5)
     yahooCSV  <- paste(DLdir, symbol, ".csv", sep = "")
     yahooDF   <- utils::read.csv(yahooCSV, header = TRUE)
     #' ------- 
     #' if you get: Error in file(file, "rt") : cannot open the connection
     #' it's because the csv file has not completed downloading
     #' try increasing the time for Sys.sleep(time = x)
     #' ------- 
     #' delete the csv file
     file.remove(yahooCSV)
     # convert date as character to date format
     yahooDF$Date <- as.Date(yahooDF$Date)
     # convert to xts
     yahoo.xts    <- xts(yahooDF[,-1],order.by=yahooDF$Date)
     # assign the xts file to the specified environment
     # default is globalenv()
     assign(symbol, yahoo.xts, envir = as.environment(envir))
     print(symbol)
} #1

それはこのように動作します:

  • https://finance.yahoo.com/quote/AAPL/history?p=AAPL に移動します
  • 「データのダウンロード」を右クリックして、リンクをコピーします
  • 「&crumb =」の後にパンくずをコピーし、関数呼び出しで使用します
  • ブラウザの設定でDLdirをデフォルトのダウンロードディレクトリに設定します
  • Envir = as.environment( "yourEnvir")を設定-デフォルトはglobalenv()
  • ダウンロード後、混乱を避けるため、csvファイルはダウンロードディレクトリから削除されます。
  • これにより、ブラウザで「無題」ウィンドウが開いたままになることに注意してください
  • 簡単なテストとして:getSymbols.yahoo.fix( "AAPL")
  • -

GetSymbols.yahoo.fixとlapplyを使用して、資産データのリストを取得することもできます。

from       <- "2016-04-01"
to         <- Sys.Date()
period     <- "daily"
envir      <- globalenv()
crumb      <- "yourCrumb"
DLdir      <- "~/Downloads/"
assetList  <- c("AAPL", "ADBE", "AMAT")
lapply(assetList, getSymbols.yahoo.fix, from, to, envir = globalenv(), crumb = crumb, DLdir)}

Safariをデフォルトのブラウザーとして使用して、Mac OSX 10.11上のRStudioでコーディングされています。また、Chromeで動作するように見えますが、Chromeのcookie crumbを使用する必要があります。 Cookieブロッカーを使用していますが、今後のブラウザセッションのためにCookieを保持するには、finance.yahoo.comをホワイトリストに登録する必要がありました。

getSymbols.yahoo.fixは役に立つかもしれません。必要なqauantmod :: getSymbolsには、オプションと例外処理のためのより多くのコードが組み込まれています。私は個人的な仕事のためにコーディングしているので、パッケージ関数から必要なコードを頻繁に削除します。もちろん、比較用のGetSymbolの動作バージョンがないため、getSymbols.yahoo.fixのベンチマークを実行していません。それに、最初のstackoverflowの答えを入力する機会を逃すことができませんでした。

2
flemingcra

私もこのエラーに遭遇しています。 mrexcel fourm(jonathanwang003)のユーザーは、新しいURLは日付にUnixタイムコーディングを使用していると説明しています。更新されたVBAコードは次のようになります。

qurl = "https://query1.finance.yahoo.com/v7/finance/download/" & Symbol
qurl = qurl & "?period1=" & (StartDate - DateSerial(1970, 1, 1)) * 86400 & _
       "&period2=" & (EndDate - DateSerial(1970, 1, 1)) * 86400 & _
       "&interval=1d&events=history&crumb=" & **Crumb**

QueryQuote:
With Sheets(Symbol).QueryTables.Add(Connection:="URL;" & qurl, Destination:=Sheets(Symbol).Range("a1"))
    .BackgroundQuery = True
    .TablesOnlyFromHTML = False
    .Refresh BackgroundQuery:=False
    .SaveData = True
End With

ここで不足している部分は、ブラウザからCookie情報を含む「Crumb」フィールドを取得する方法です。誰もがアイデアを持っています。私はこの投稿を見つけましたが、助けになるかもしれません: https://www.mrexcel.com/forum/Excel-questions/1001259-when-using-querytables-what-posttext-syntax-click-button-webpage.html (john_wによる最後の投稿を見てください)。

1
TheHeurist