web-dev-qa-db-ja.com

Rで日中の株式市場データをダウンロードする方法

すべて、

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ファイルのタイムスタンプをどのように解釈すればよいですか。

21
Aaron

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

あなたの例でのリンクの使用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日の価格レベルでした。

enter image description here

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

22
Chinmay Patil

そのため、データをダウンロードして標準化することは、私が想像していたよりもはるかに大きなものになりました-約150行のコードです。問題は、Googleがすべての取引所で取引された株式について過去50日間のトレーニング日数のデータを提供している一方で、その日のタイムスタンプは標準化されていないことです。データセットの最初の取引日。さらに悪いことに、少量でしか取引されない株式には、取引が記録されたエントリしかありません。 APPLのような大量の在庫の場合は問題ありませんが、少量の小さなキャップの場合は、データの大部分ではないにしてもシリーズの多くが欠落することになります。私が行っている分析では、すべての株式シリーズが互いに適切に重なる必要があるため、これには問題がありました。

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

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

最後に株価表示を変更すると、過去50日間の取引日の1/2時間ごとの増分が表示されます。 @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であった日もありました。そこから、whileループを使用して、各株式相場のダウンロードデータを基本的に処理し、特定のトレーニング日内のタイムスタンプインデックスをAPPLタイムスタンプと比較しました。オーバーラップを維持し、欠けているデータをギャップで埋め、オーバーラップしていない部分を切り取りました。

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

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

考えや提案?

3
Aaron

Quandl からデータをロードしないのはなぜですか?例えば。

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

更新:申し訳ありませんが、dailyデータのみがQuandlでフェッチされることに気づきました-しかし、私は去ります私の答えはここです

1
daroczig

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

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

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

0
sempedocles