ruby で yahoo の株価情報からグラフ、msn 財務情報からグラフ
yahoo の株価情報や、msn 財務情報から google chart をつかってグラフを作成してみた。
ruby でのコードは最後に示す。
まずはいくつかの実行例を。(企業指定は、ソースコード中にハードディングしてある)
http:// ... のリンクをクリックすると、グラフが表示される。
$ ruby finance.rb
"日経平均株価 2009年8月17日 - 2009年9月11日"
http://chart.apis.google.com/chart?chxr=1,10142.11,10639.71&chco=0000ff&chtt=%E6%97%A5%E7%B5%8C%E5%B9%B3%E5%9D%87%E6%A0%AA%E4%BE%A1+2009%E5%B9%B48%E6%9C%8817%E6%97%A5+-+2009%E5%B9%B49%E6%9C%8811%E6%97%A5&chd=s:PRHdL1r9owqvQIFVeUtl&chxs=0,ff00ff|1,ff00ff&chf=bg,lg,0,76A4FB,1,ffffff,0&chxt=x,y&chxl=0:|2009/8/17|18|19|20|21|24|25|26|27|28|31|9/1|2|3|4|7|8|9|10|11&cht=lc&chs=650x400
$ ruby finance05.rb
"トヨタ自動車 - 売上高合計 営業利益"
http://chart.apis.google.com/chart?chs=440x400&chdl=%E5%A3%B2%E4%B8%8A%E9%AB%98%E5%90%88%E8%A8%88|%E5%A3%B2%E4%B8%8A%E9%AB%98%E5%90%88%E8%A8%88&chxr=1,0,26289240.0&chco=0000ff,00ff00&chtt=%E3%83%88%E3%83%A8%E3%82%BF%E8%87%AA%E5%8B%95%E8%BB%8A+-+%E5%A3%B2%E4%B8%8A%E9%AB%98%E5%90%88%E8%A8%88+%E5%96%B6%E6%A5%AD%E5%88%A9%E7%9B%8A&chd=s:rw39v,DEFF_&chxs=0,ff00ff|1,ff00ff&chf=bg,lg,0,76A4FB,1,ffffff,0&chxt=x,y&chxl=0:|2005|2006|2007|2008|2009&cht=bvg
["18,551,526", "21,036,909", "23,948,091", "26,289,240", "20,529,570"]
["1,672,187", "1,878,342", "2,238,683", "2,270,375", "-461,011"]
$ ruby finance05.rb
"任天堂 - 売上高合計 営業利益"
http://chart.apis.google.com/chart?chs=440x400&chdl=%E5%A3%B2%E4%B8%8A%E9%AB%98%E5%90%88%E8%A8%88|%E5%A3%B2%E4%B8%8A%E9%AB%98%E5%90%88%E8%A8%88&chxr=1,0,1838622.0&chco=0000ff,00ff00&chtt=%E4%BB%BB%E5%A4%A9%E5%A0%82+-+%E5%A3%B2%E4%B8%8A%E9%AB%98%E5%90%88%E8%A8%88+%E5%96%B6%E6%A5%AD%E5%88%A9%E7%9B%8A&chd=s:RQg39,DDHPS&chxs=0,ff00ff|1,ff00ff&chf=bg,lg,0,76A4FB,1,ffffff,0&chxt=x,y&chxl=0:|2005|2006|2007|2008|2009&cht=bvg
9,DDHPS&chxs=0,ff00ff|1,ff00ff&chf=bg,lg,0,76A4FB,1,ffffff,0&chxt=x,y&chxl=0:|2005|2006|2007|2008|2009&cht=bvg
["515,292", "509,249", "966,534", "1,672,423", "1,838,622"]
["111,650", "92,581", "226,031", "476,483", "554,678"]
まずは株価情報ページの html からデータを拾ってきて グラフをつくる例だ。
(日経平均の1500 日分のデータで不景気ぶりが 実によくわかる!)
雑誌や新聞で こういうグラフをよく目にするけど、個人でも簡単にこういうグラフが簡単に生成できる時代なのだ)
$ cat finance.rb
# yahoo ファイナンスの株価データページから株価を得る。
# 今日から過去 count_day 日分のデータを取得して、グラフをつくる。(省略した場合は 20日)
# usage: ruby finance.rb [count_day]
#
# 2009-09-12 katoy
require 'rubygems'
require 'open-uri'
require 'nokogiri'
require 'google_chart'
require 'kconv'
require 'date'
require 'pp'
$KCODE = "utf8"
TITLE = '日経平均株価'
COMPANY = '998407.o'
#TITLE = 'トヨタ自動車(株)'
#COMPANY = '7203.t'
#TITLE = '任天堂(株)'
#COMPANY = '7974.O'
ROW = ('998407.o' == COMPANY)? 5: 7 # 表の列数が 日経平均は少ない。
TODAY = DateTime.now
YEAR0, MONTH0, DAY0 = 1990, 1, 1
YEAR1, MONTH1, DAY1 = TODAY.year, TODAY.month, TODAY.day
def get_data(start, day_count)
data = []
read_count = 0
while(read_count < day_count) do
path = sprintf("http://table.yahoo.co.jp/t?c=%d&a=%d&b=%d&f=%d&d=%d&e=%d&g=d&y=%d&s=%s&z=%s",
YEAR0, MONTH0, DAY0, YEAR1, MONTH1, DAY1,
read_count, COMPANY, COMPANY)
url = URI(path)
doc = Nokogiri::XML(url.read.toutf8)
xpath = "//small"
vals = []
day = ''
doc.xpath(xpath).each_with_index do |entry, i|
next if i < ROW # 列名データは無視する
vals << entry.text
if i % ROW == ROW - 1
data << vals
read_count += 1
vals = []
break if read_count >= day_count
end
end
end
data
end
def make_graph(data, options = { })
days = []
vals =[]
year = ''
manth = ''
data.each do |entry|
vals << entry[4].gsub(",", "").to_f # 終値
# 年/月の変わり目で ラベルを変える
d = entry[0].scan(/(\d*)年(\d*)月(\d*)日/)
if year != d[0][0]
year = d[0][0]
manth = d[0][1]
days << "#{d[0][0]}/#{d[0][1]}/#{d[0][2]}"
elsif manth != d[0][1]
manth = d[0][1]
days << "#{d[0][1]}/#{d[0][2]}"
else
days << "#{d[0][2]}"
end
end
lo = vals.min
hi = vals.max
min = lo - ((hi - lo) * 0.1).to_i
max = hi
# max = (hi.to_i/ 10 * 10) + 10
vals.map! { |v| v - min } # データ範囲を狭くする
flc = GoogleChart::LineChart.new(options[:size], options[:title]) do |chart|
chart.show_legend = false
chart.axis(:x, :color => 'ff00ff', :labels => days) if options[:show_label]
chart.axis(:y, :color => 'ff00ff', :range => [min, max])
chart.fill(:background, :gradient, :angle => 0, :color => [['76A4FB', 1], ['ffffff', 0]])
chart.data nil, vals , '0000ff'
end
flc
end
day_count = (ARGV.size > 0) ? ARGV[0].to_i: 20
data = get_data(0, day_count)
data.reverse!
start_day, end_day = data[0][0], data[data.size() -1][0]
title = "#{TITLE} #{start_day} - #{end_day}"
flc = make_graph(data, {:title => title, :size => "650x400", :show_label => day_count <= 30})
pp title
puts flc.to_url
次は財務データ。最初 これも nokogiri で処理しようとしたのだが、データパース
時にエラーがでるので、hpricot で処理した。
現状では マイナス値の表示ができていない。
$ cat finance05.rb
# MSN ファイナンスの株価データページから財務諸表の情報を得る。
# 今日から過去 count_day 日分のデータを取得して、グラフをつくる。(省略した場合は 20日)
# usage: ruby finance.rb [count_day]
#
# 2009-09-12 katoy
require 'rubygems'
require 'open-uri'
require 'hpricot'
require 'google_chart'
require 'kconv'
require 'date'
require 'pp'
$KCODE = "utf8"
def get_data(company)
data = []
path = "http://jp.moneycentral.msn.com/investor/invsub/results/statemnt.aspx?Symbol=#{company}&lstStatement=Income&stmtView=Ann"
doc = Hpricot(open(path).read)
doc.search("table.ftable").each do |t|
t.search("tr").each do |r|
rs = r.search("td")
data << { rs[0].inner_text => [ rs[1].inner_text,
rs[2].inner_text,
rs[3].inner_text,
rs[4].inner_text,
rs[5].inner_text,
].reverse
}
end
end
data
end
def make_graph(datas, min, max, options = { })
flc = GoogleChart::BarChart.new(options[:size], options[:title], :vertical, false) do |chart|
chart.axis(:x, :color => 'ff00ff', :labels => options[:labels])
chart.axis(:y, :color => 'ff00ff', :range => [min, max])
chart.fill(:background, :gradient, :angle => 0, :color => [['76A4FB', 1], ['ffffff', 0]])
datas.each do |p|
pp p
chart.data p[:label], p[:plot] , p[:color]
end
end
flc
end
name = "任天堂"
company = 'JP:7974'
# name = "トヨタ自動車"
# company = 'JP:7203'
data = get_data(company)
# 8: "売上高合計" 19 : "営業利益"
KIDS = [8, 19]
plots = []
d0 = data[KIDS[0]][data[KIDS[0]].keys[0]]
d1 = data[KIDS[1]][data[KIDS[1]].keys[0]]
p0 = d0.map { |v| v.gsub(',', '').to_f }
p1 = d1.map { |v| v.gsub(',', '').to_f }
max = p0.max
max1 = p1.max
max = max1 if max1 > max
min = 0
p0.map! { |v| 100.0 * v / max}
p1.map! { |v| 100.0 * v / max}
pp plots
#
labels = data[0][data[0].keys[0]]
#
title = "#{name} - #{data[KIDS[0]].keys[0]} #{data[KIDS[1]].keys[0]}"
plots = []
plots << { :label => data[KIDS[0]].keys[0], :color =>'0000ff' , :plot => p0 }
plots << { :label => data[KIDS[0]].keys[0], :color =>'00ff00' , :plot => p1 }
flc = make_graph(plots, min, max, {:title => title, :size => "440x400", :labels => labels})
pp title
puts flc.to_url
#data.each_with_index { |v, i| p "#{i}: #{v.keys}" }
pp d0
pp d1
pp p0
pp p1
« ピックアップ:フォローしている数が2000人を超えるとどんな感じになるか, 2,000行のJavaソースコードを読むのに何分? etc... | トップページ | ピックアップ:映画『TAJOMARU』がスゴ過ぎる, HTML5でどのくらいのアプリが実装できるのか実験, etc... »
この記事へのコメントは終了しました。
トラックバック
この記事へのトラックバック一覧です: ruby で yahoo の株価情報からグラフ、msn 財務情報からグラフ:
» 初心者でもわかるFXテクニックのコツ [初心者でもわかるFXテクニックのコツ]
最近はやりのFX。やはり儲けている人は、そうでない人に比べてFXに関する知識が豊富です。このサイトで、色々なFXにかんする必勝法をお伝えしていきたいと思います。初心者の方々でも分かりやすいものになるよう目指しています。 [続きを読む]
« ピックアップ:フォローしている数が2000人を超えるとどんな感じになるか, 2,000行のJavaソースコードを読むのに何分? etc... | トップページ | ピックアップ:映画『TAJOMARU』がスゴ過ぎる, HTML5でどのくらいのアプリが実装できるのか実験, etc... »
コメント