Google Finance APIを使って株価チャートを作成
株を買うかどうか判断するために株価チャートに補助線を書いたりする手法があるらしい。 手軽に補助線(トレンドラインと呼ぶらしい)を引いてくれるスクリプトでも作ろうかと思い、 まずは普通の株価チャートを描いてみた。
そのへんに落ちてるアプリでもできそうだけど、最終的に買いかどうか判断させたり、 色々自由にカスタマイズするには自分で作ったほうがいいかなと。
2017.9.16追記
これを公開した直後にAPIのURLが変わった模様。
元はhttps://www.google.com/finance/getprices?
だったが、今はhttps://finance.google.com/finance/getprices?
になっている。
この記事のコードも修正したので、そのまま使えるはず。
Google Finance API
国内で株価を取得するためのAPIは(正規には)ないらしい。 ただ、Google Finance APIという非公式のAPIがあり、使ってる人は使っているとか。
google financeのAPIのメモという記事が参考になる。 今回やりたいことのほとんどはここに書いてある。 違いは、
- Rubyを使う (Pythonのが需要ありそうだけど)
- チャートを描く
くらい。
まずは適当な銘柄の株価を以下のように取得する。 ここではトヨタにした(丸パクリ)。
require 'net/http'
class GoogleFinance
BASE_URL = 'https://finance.google.com/finance/getprices?'
def initialize(issue)
@issue = issue
end
def stock(period = '1Y', interval_sec = 86400)
raw_data = Net::HTTP.get(URI.parse(BASE_URL + "p=#{period}&i=#{interval_sec}&x=TYO&q=#{@issue}"))
data = []
raw_data.lines do |line|
data << line[/^[0-9]*,([0-9]*)/, 1]
end
data.compact
end
end
google_finance = GoogleFinance.new(7203)
stock_data = google_finance.stock
取得したデータを1行ずつ取ってきて、/^[0-9]*,([0-9]*)/, 1
という正規表現で終値を抜き出している。
先頭に数値があり、カンマ挟んで次の数値を取得するという意味。
これを配列に突っ込んで、先頭の方にあるゴミ(抽出条件などが書かれている)をcompactで取り除くことで、 この1年間のトヨタ株の終値の配列が完成。
チャート描画
これはgnuplotを使う。 Numo::Gnuplotというgemが便利そうだったので、これを使った。
gem install numo-gnuplot
してから、 (当然、gnuplotも入れる)
require 'net/http'
require 'numo/gnuplot'
class GoogleFinance
# 省略
end
google_finance = GoogleFinance.new(7203)
stock_data = google_finance.stock
Numo.gnuplot do
set title:'TOYOTA'
plot stock_data, w:'lines'
end
これだけ。GoogleFinanceクラスは変わらないので省略した。 得られたチャートを貼って終わり。