2015年1月15日木曜日

rubyで株価データを取得する方法

最近株価データを取得し、注文も自動で行うトレーディングシステムを作ったので、その過程で発見したことなどを書く。

まず株価データを取得しないことには何もできないが、jpstockというgemがあるのでそれを利用すると簡単である。

以下はCSVデータを取得する。

----ここから----
require 'jpstock'
code = "1346"
filename = "./data.csv"

pre = JpStock.historical_prices(:code=>code, :all=>true)

file = File.open(filename,"w")

pre.each {|data|
    file.puts "#{data.date},#{data.open},#{data.high},#{data.low},#{data.close}"
}

file.close
----ここまで----

トレーディングシステムではMySQLを使っているので、全データを格納したいときは上記コードのファイル処理の所をruby-mysqlでinsertすればいい。

当日のみのデータが欲しかったら、こんな感じで書くと良いだろうという例も載せる。
ちなみに、ruby-mysqlはRubyのDate型に対応していないので、.to_sで文字列にしている。

さらに、jpstockはなぜか文字列の"YYYY-MM-DD"形式に対応しておらず、文字列の"YYYY/MM/DD"とDate型に対応しているので注意が必要。
ここで一瞬悩んだ。

----ここから----
code= #ここに証券コードを入れる
today = #ここに当日日付を入れる
pre = JpStock.historical_prices(:code=>code, :start_date=> today, :end_date=> today)

date = 0
open = 0
high =0
low = 0
close = 0

pre.each{ |data|
   
    date = data.date
    open = data.open
    high = data.high
    low = data.low
    close = data.close
}

ins = client.prepare('insert into stockdata values(?,?,?,?,?)')
ins.execute date.to_s, open, high, low, close
client.close
----ここまで----

ひょっとしたらもっと良い方法があるかもしれないが、今のところこの方法を使っている。
個人的には上の処理の仕方だと、当日の四本値がないときはdateの型が変だと落ちるので重宝している(もちろんカレンダーテーブルを作って平日しか回らないようになっているので、そういうエラーはありえないが、ひょっとしたら休日に回ってしまってデータを壊す恐れがあるので)。

 株価テーブルの設計だが、1銘柄のみ扱っているのでプライマリキーを日付にして、あとは四本値を格納しているだけである。
複数銘柄を回すなら、日付と銘柄コードをプライマリキーにしておけばいいだろう。

0 件のコメント:

コメントを投稿