このコードを使用して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'
価格履歴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
新しいバージョンでは、ユーザーのブラウザーのCookie情報を反映するように見える「クラム」フィールドが追加されます。価格履歴の自動ダウンロードを意図的にブロックし、WebブラウザでCookieを検証するための情報をクエリに強制的に提供しているようです。
修正の詳細は 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")
Quantmodのバージョン0.4-9はこの問題を修正し、現在は [〜#〜] cran [〜#〜] で利用可能です。
なぜ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
それはこのように動作します:
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の答えを入力する機会を逃すことができませんでした。
私もこのエラーに遭遇しています。 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による最後の投稿を見てください)。