LoginSignup
10
9

More than 5 years have passed since last update.

はじめてのHadoop[激動の期間(2014年10月)の株価の相関を求める]

Posted at

HadoopをVagrant上に構築して、株価の相関を求める

「Hadoopなんて、クラスタ環境を用意しないと使えない」と思っていたが、1PCでHadoopを動かせると知ったので、Vagrantの中で動かしてみた。

目次

  1. Hadoop環境構築
  2. Job作成
  3. 低スペックによる悲劇

Hadoop環境構築

Vagrant(CentOS6.5)を使用。
Hadoop のシングルノード作成方法を見ながら作成。

基本的に
JDK本体と、Hadoopをインストールして、SSHを使えるようにすれば完成。
この環境でコンパイルして、Hadoopコマンドで、実行できる。

Job作成

身近な題材として、株価の相関を求めることに決定。暴落と暴騰による阿鼻叫喚を引き起こした2014年10月の3週間(10/5~10/27)の変動で、似た動きの株があるかどうかを確かめてみる。

対象は、日本に上場している株式約4000と、SBI証券で公開されている投資信託約2000。

普段はpythonで一瞬相関を出しているが、今回はHadoopの分散を意識し、分散共分散行列から相関行列を自力で出している。詳細はGithub
基本的に日数のオーダーのデータ量は1リデュースで処理できると想定している。

フローとしては、ステップを分け、それぞれでMRを実行する。
(runjob.shが実行順序)

1.時系列データから行列を作成する
マップでは株をキーとして分割し、リデュースで日付と株価のMapを作成
1.時系列→行列.png

2.株価の行番号を求める(行列として計算したいが、株データがばらばらに来るせいで行番号がわからないため)

3.各株の平均から正規化する
マップでは、株をキーとして分割するだけ。
リデュースで平均をだし、各値を平均で引く。

4.分散共分散行列を出す
株Aと株Bのデータを求めるためには、両株のデータが全てがそろっている必要があるので、株数x株数にキーを分けてマップする。
リデュースでは共分散(分散)を求めるのに必要なデータがそろっているので計算する。

5.相関行列を出す。
分散共分散行列からそれぞれの相関を出すために必要なデータをキーに分けてマップする。(今回は対角をキーとしてマップしている。(2,1)のデータは(2,2)をキーとする)
リデュースで、各相関を計算する。

6.各相関は行列の番号になっているので、銘柄名に置き換える。

以上でコードが完成したので、実行する。

低スペックによる悲劇

実行したら、データが得られると思ったのだが、スペックが低すぎたため完全なデータが得られなかった。

1.ディスク容量不足

Hadoopでは、全マップ計算後にリデュースを行うためにマップで作成したデータを一時ファイルにする。その合計量がVagrantのデフォルト設定である40GBを超えて、クラッシュした。対象データから投資信託の一部を外して再開。

2.スワップによる遅延

データ量が多く、メモリに乗り切らず大量のスワップが発生。計算に4時間を要した。

実行完了

データ量を少なくして放置してやっと結果取得に成功。
結果としては、日経とTOPIXが最も相関が高いという、当たり前の結論等を得た。

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9