S&P 500、DJIA、30年T-Bondsの毎日のデータをyahooからダウンロードし、データを適切なタイムゾーンにマッピングして、自分のデータとマージしたいと思います。いくつか質問があります。
私の最初の問題は、ティッカーを正しくすることです。yahooのWebサイトから、ティッカーは^ GSPC、^ DJI、および^TYXのように見えます。ただし、^DJIは失敗します。なぜですか?
2番目の問題は、タイムゾーンをGMTに制限したいのですが(すべてのデータが同じクロックにあることを確認したいのですが、GMTは中立的な選択のようです)、それを機能させることができませんでした。
私の3番目の問題は、yahooデータを、他の方法で取得され、別の形式で利用できる自分のデータとマージしたいということです。毎日のデータでもあります。
これが、データをGMTタイムゾーンに制限する試みです。Rスクリプトの先頭で実行されます。
Sys.setenv(TZ = "GMT")
# > Sys.getenv("TZ")
# [1] "GMT"
# the TZ variable is properly set
# but does not affect the time zone in zoo objects, why?
yahooデータを取得するための私のコードは次のとおりです。
library("tseries")
library("xts")
date.start <- "1999-12-31"
date.end <- "2013-01-01"
# tickers <- c("GSPC","TYX","DJI")
# DJI Fails, why?
# http://finance.yahoo.com/q?s=%5EDJI
tickers <- c("GSPC","TYX") # proceed without DJI
z <- zoo()
index(z) <- as.Date(format(time(z)),tz="")
for ( i in 1:length(tickers) )
{
cat("Downloading ", i, " out of ", length(tickers) , "\n")
x <- try(get.hist.quote(
instrument = paste0("^",tickers[i])
, start = date.start
, end = date.end
, quote = "AdjClose"
, provider = "yahoo"
, origin = "1970-01-01"
, compression = "d"
, retclass = "zoo"
, quiet = FALSE )
, silent = FALSE )
print(x[1:4]) # check that it's not empty
colnames(x) <- tickers[i]
z <- try( merge(z,x), silent = TRUE )
}
これが私のデータセットのdput(head(df))です:
df <- structure(list(A = c(-0.011489000171423, -0.00020300000323914,
0.0430639982223511, 0.0201549995690584, 0.0372899994254112, -0.0183669999241829
), B = c(0.00110999995376915, -0.000153000000864267, 0.0497750006616116,
0.0337960012257099, 0.014121999964118, 0.0127800004556775), date = c(9861,
9862, 9863, 9866, 9867, 9868)), .Names = c("A", "B", "date"
), row.names = c("0001-01-01", "0002-01-01", "0003-01-01", "0004-01-01",
"0005-01-01", "0006-01-01"), class = "data.frame")
dfのデータとzのデータをマージしたいと思います。私はそれを機能させることができないようです。
私はRを初めて使用し、効率やベストプラクティスなどについてのアドバイスを非常に受け入れています。ありがとうございます。
編集:ソリューション
最初の問題について:GSeeの提案に従って、ダウジョーンズ工業株30種平均データをquantmodパッケージでダウンロードできます。したがって、yahooから入手できなくなった「^ DJI」ティッカーの代わりに、「DJIA」ティッカーを使用します。「DJIA」ティッカーにはキャレットがないことに注意してください。
2番目の問題について、Joshua Ulrichはコメントの中で、「日には時間要素がないため、日付にはタイムゾーンがない」と指摘しています。
3番目の問題について:コメントのagstudyで指摘されているように、データフレームの日付が破損しているようです。
私のソリューションは、quantmodパッケージと添付のzoo/xtsパッケージに依存しています。
library(quantmod)
csvファイルから適切な日付を取得するために使用したコードは次のとおりです。
toDate <- function(x){ as.Date(as.character(x), format("%Y%m%d")) }
dtz <- read.zoo("myData.csv"
, header = TRUE
, sep = ","
, FUN = toDate
)
dtx <- as.xts(dtz)
csvファイルの日付は、「19861231」の形式で単一の列に保存されました。正しい日付を取得するための鍵は、日付を「as.character()」でラップすることでした。このコードの一部は、R-csvからxtsまでの株式市場データから着想を得ています。また、zoo/xtsのマニュアルも役に立ちました。
次に、このデータセットから日付範囲を抽出します。
date.start <- start(dtx)
date.end <- end(dtx)
これらの日付をquantmodのgetSymbols関数で使用して、ダウンロードする他のデータが同じ期間をカバーするようにします。
これが、3つのティッカーすべてを取得するために使用したコードです。
tickers <- c("^GSPC","^TYX","DJIA")
data <- new.env() # the data environment will store the data
do.call(cbind, lapply( tickers
, getSymbols
, from = date.start
, to = date.end
, env = data # data saved inside an environment
)
)
ls(data) # see what's inside the data environment
data$GSPC # access a particular ticker
また、GSeeがコメントで指摘しているように、オプションauto.assign=FALSEをオプションenv=dataと組み合わせて使用することはできません(そうしないと、ダウンロードが失敗します)。
よろしくお願いします。