21

全て、

YahooまたはGoogleから15〜60分間隔で株式データをダウンロードして、できるだけ多くの履歴を取得したいと考えています。私は次のように大まかな解決策を思いついた:

library(RCurl)
tmp <- getURL('https://www.google.com/finance/getprices?i=900&p=1000d&f=d,o,h,l,c,v&df=cpct&q=AAPL')
tmp <- strsplit(tmp,'\n')
tmp <- tmp[[1]]
tmp <- tmp[-c(1:8)]
tmp <- strsplit(tmp,',')
tmp <- do.call('rbind',tmp)
tmp <- apply(tmp,2,as.numeric)
tmp <- tmp[-apply(tmp,1,function(x) any(is.na(x))),]

インポートしようとしているデータの量を考えると、これは計算コストが高くなる可能性があるのではないかと心配しています。また、私は一生の間、タイムスタンプがYahooとGoogleでどのようにコード化されているかを理解していません。

したがって、私の質問は2つあります。一連の株式のデータをRにすばやく取り込むためのシンプルでエレガントな方法と、使用するGoogle / Yahooファイルのタイムスタンプをどのように解釈するのですか?

4

4 に答える 4

22

最初にタイムスタンプの質問に答えようとします。これは私の解釈であり、間違っている可能性があることに注意してください。

あなたの例のリンクを使用すると、https://www.google.com/finance/getprices?i=900&p=1000d&f=d,o,h,l,c,v&df=cpct&q=AAPL次のデータが得られます:

EXCHANGE%3DNASDAQ
MARKET_OPEN_MINUTE=570
MARKET_CLOSE_MINUTE=960
INTERVAL=900
COLUMNS=DATE,CLOSE,HIGH,LOW,OPEN,VOLUME
DATA=
TIMEZONE_OFFSET=-300
a1357828200,528.5999,528.62,528.14,528.55,129259
1,522.63,528.72,522,528.6499,2054578
2,523.11,523.69,520.75,522.77,1422586
3,520.48,523.11,519.6501,523.09,1130409
4,518.28,520.579,517.86,520.34,1215466
5,518.8501,519.48,517.33,517.94,832100
6,518.685,520.22,518.63,518.85,565411
7,516.55,519.2,516.55,518.64,617281
...
...

最初の列の最初の値に注意してくださいa1357828200。私の直感では、これはと関係がありPOSIXctます。したがって、簡単なチェック:

> as.POSIXct(1357828200, origin = '1970-01-01', tz='EST')
[1] "2013-01-10 14:30:00 EST"

だから私の直感は正しいようです。しかし、時間はずれているようです。これで、データにもう1つの情報があります。TIMEZONE_OFFSET=-300。したがって、タイムスタンプをこの量だけオフセットすると、次のようになります。

as.POSIXct(1357828200-300*60, origin = '1970-01-01', tz='EST')
[1] "2013-01-10 09:30:00 EST"

あなたがリクエストした日のデータがわからなかったことに注意してください。しかし、グーグルファイナンスを簡単にチェックすると、2013年1月10日の価格レベルであることがわかります。

ここに画像の説明を入力してください

最初の列の残りの値は、最初の行の値からのある種のオフセットのようです。

于 2013-03-25T07:24:33.793 に答える
3

そのため、データのダウンロードと標準化は、私が思っていたよりもはるかに負担になり、約150行のコードになりました。問題は、Googleがすべての取引所で取引されている株式の過去50トレーニング日のデータを提供しているのに対し、その日のタイムスタンプが標準化されていないことです。たとえば、「1」のインデックスは、2番目の時間増分の最初のものを参照できます。データセットの最初の取引日。さらに悪いことに、少量でのみ取引される株式には、取引が記録されるエントリしかありません。APPLのような大量の在庫の場合は問題ありませんが、少量のスモールキャップの場合は、データの大部分ではないにしても、シリーズが大幅に欠落することを意味します。私が行っている分析では、すべてのストックシリーズを互いにきちんと並べる必要があるため、これは問題でした。

幸いなことに、データにはまだ一般的な構造があります。このリンクの使用:

https://www.google.com/finance/getprices?i=1800&p=1000d&f=d,o,h,l,c,v&df=cpct&q=AAPL 

最後に株式相場表示を変更すると、過去50日間の取引日数が30分単位で表示されます。@geektraderによって非常に便利にデコードされたPOSIXタイムスタンプは、3週間間隔でタイムスタンプ列に表示されます。タイムスタンプインデックスは常に便利な1:1の方法で対応しているわけではありませんが(これはGoogle側では意図的なものであると思われます)、パターンがあります。たとえば、3週間単位で最初の取引日を調べた30分ごとのシリーズでは、タイムスタンプインデックスが1:15付近で均一に実行されています。これは1:13、1:14、2:15である可能性があります-それはすべて在庫に依存します。14番目と15番目のエントリが何であるかわかりません:それらは毎日の要約または時間外取引情報のいずれかであると思われます。重要なのは、あなたが頼ることができる一貫したパターンがないということです。悲しいことに、トレーニング日の最初のスタンプは、常に開始データが含まれているとは限りません。最後のエントリとクロージングデータについても同じです。実際に取引データを表しているものを知る唯一の方法は、Googleマップ上のシリーズと数値を比較することであることがわかりました。データから1:1のマッピングパターンをこじ開ける方法を何日も無駄に考えた後、私は「球場」戦略に落ち着きました。APPLのデータ(非常に大量の取引された株式)をスクレイピングし、各取引日のタイムスタンプインデックスを市場全体の参照値として設定しました。すべての日には、6.5時間の取引日に対応する最低13の増分がありましたが、14または15の日もありました。この場合、最初の13のインデックスを取得して切り捨てました。そこから、whileループを使用して、各株式相場表示のダウンロードされたデータを基本的に進め、特定のトレーニング日内のタイムスタンプインデックスをAPPLタイムスタンプと比較しました。オーバーラップを維持し、欠落しているデータをギャップで埋め、オーバーラップしていない部分を切り取りました。

簡単な修正のように聞こえますが、トランザクションデータがまばらな少量の株の場合、文字通り何十もの特殊なケースを焼き付けなければならず、補間するために大量のデータがありました。間違っていることがわかっているこれらのいくつかについて、かなり奇妙な結果が得られました。ただし、大量、中型、大型株の場合、ソリューションは見事に機能しました。ほとんどの場合、シリーズはAPPLデータと非常にきれいに同期し、GoogleFinanceプロファイルと完全に一致していました。

この方法でエラーが発生するという事実を回避する方法はありません。それでも、予備のスモールキャップスの方法を微調整する必要があります。とは言うものの、シリーズを30分シフトするか、1回の時間増分でギャップを埋めることで、市場と株式の全体的な動きに比べてごくわずかなエラーが発生します。私が持っているこのデータセットは、私が持っているいくつかの質問に関連する答えを得るのに「十分に良い」と確信しています。このようなものを商業的に入手するには、文字通り数千ドルの費用がかかります。

考えや提案?

于 2013-03-28T18:43:16.773 に答える
1

Quandlからデータをロードしてみませんか?例えば

library(Quandl)
Quandl('YAHOO/AAPL')

更新:申し訳ありませんが、 Quandlでは毎日のデータのみがフェッチされることに気づきました-しかし、Quandlは同様のケースで非常に簡単にクエリできるため、ここに答えを残します

于 2013-03-25T08:33:35.333 に答える
0

タイムゾーンオフセットについては、次を試してください。

as.POSIXct(1357828200、origin = '1970-01-01'、tz = Sys.timezone(location = TRUE))

(tzはあなたの場所に応じて自動的に調整されます)

于 2016-05-03T07:57:22.657 に答える