image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

« ピックアップ:フォローしている数が2000人を超えるとどんな感じになるか, 2,000行のJavaソースコードを読むのに何分? etc... | トップページ | ピックアップ:映画『TAJOMARU』がスゴ過ぎる, HTML5でどのくらいのアプリが実装できるのか実験, etc... »

2009-09-12

ruby で yahoo の株価情報からグラフ、msn 財務情報からグラフ

yahoo の株価情報や、msn 財務情報から google chart をつかってグラフを作成してみた。
ruby でのコードは最後に示す。
まずはいくつかの実行例を。(企業指定は、ソースコード中にハードディングしてある)
http:// ... のリンクをクリックすると、グラフが表示される。

$ ruby finance.rb 1500
"トヨタ自動車(株) 2003年8月6日 - 2009年9月11日"
http://chart.apis.google.com/chart?chxr=0,2081.0,8340.0&chco=0000ff&chtt=%E3%83%88%E3%83%A8%E3%82%BF%E8%87%AA%E5%8B%95%E8%BB%8A(%E6%A0%AA)+2003%E5%B9%B48%E6%9C%886%E6%97%A5+-+2009%E5%B9%B49%E6%9C%8811%E6%97%A5&chd=s:JJJJJKLLLLLMLLLLLLLLMNNNNOOPRRQPNNMMMLMMMNOMMMNMNMNMMLLLKLKKNMMNNMMMMMLKLKKLLLMNMNNMNNOOOONOPPPPOOOQQPOPPPOPPQPPPOOOONOOMNONONOOPPPPQPPPQRRRRRSSRRRRQQQQPQQQRRRRQQRRRRRRRRRRRSSTTTTTSRRQQSRRQRRRRRRRSSSSSSTUUTUUUUVVVWWWWVWWWXWWWVUVWXWWVVVVVVVWWXWWVVUUTVUUTTTTTUUVWWWVWWUVVVUUVVUUUUUUTTTUUVVVVVUUTTTUTTTSSSTTTTTUTTTTTUUTSSRRRRRRQRRRQRRRRSSSTSTTTUTTUUUUUUUTUTTTTTTSTSSSTTTTTTTUUUUTUTTTTTTTTTTTTTTTTTTSSSSSSSSSSSSTTUTTSSSSRRRRRRRRRQSRRRRRQRQRRRSSRRSRRRRRRRQRRRRRSSRSSSRRRSSTTTTTTTTUUUUUUUUUVVVVVVUUUWWWVVWWWWXXXXXYXXXXYYYYZZZaabaaccdfeffeddeeeeffedccdeeefgfgfffffffhilklkkmlkkllkkkkklkijjklmllmnnnnnlmmllkklmllkllmmmnnnnmnmnoopqppoppoononooooppppppqppppppqqrqrttuutstssstutssssstttsrpononnmlnmnnnlmnmmljjjhiikkkjkkkkjjmlmlllmmlkjiikjkllmmmmlnmmoppopoqqqpqqpoopppppppoonnooooopopopqqqqrttuvvuutttuvwwwwvvvvwwyyxwyyyyvvwuuuvwvvvvwwxyyzz0012333445644223545555575556555355567777777778954202344431212334331110010z100zxyyzyzzzyyzyyyyxwxzzzzzzyyzyyzyy0111101001233322221133444343222101100zzyyxwwwxyyywwwusoqrrsstsrrtttsssqqqprptsrssstuuuuutssrqqoponnmloqqrtqqpqnnlmoonnnlkmnmooonnopppponmmllmnnnmkjjkiihfhgebdeifhhkklkklllkmmopnmlmlmljhhghfefgedabdeffedecceeccbbababbcdgeddffffgihfeffgfhgeedcdceghgiiigghghiiihgfeeedccbbbcbbcbaZYZZbbdbbaaZYXXYYacccbcdbaaabbaabaaababbbaaYYXZbaZZYWXVTRPLMLPPLNOQONKIKNRQRVQNNLLJKKJJIJKIIIIHHGFGGIJGJJJIHHGHHIIJJKKJHIHJJJIHHGIIJIHHJJJKKJJJJJKJJJLKKJJIIHHHIHIIJJIJKKLLKKLNPQQQRRSQQPQRPQRQQPRRTSQQPNOOPPPOOOPQQQRRQRRRRRRRPPPPPOOPPOPPOPOONMNMNNNNOOPQQQQSSTSSTTUTSTTSTTTSTTTTTSSRRRRRQRR&chxs=0,ff00ff&chf=bg,lg,0,76A4FB,1,ffffff,0&chxt=y&cht=lc&chs=650x400

$ ruby finance.rb 1500
"日経平均株価 2003年8月6日 - 2009年9月11日"
http://chart.apis.google.com/chart?chxr=0,5934.98,18261.98&chco=0000ff&chtt=%E6%97%A5%E7%B5%8C%E5%B9%B3%E5%9D%87%E6%A0%AA%E4%BE%A1+2003%E5%B9%B48%E6%9C%886%E6%97%A5+-+2009%E5%B9%B49%E6%9C%8811%E6%97%A5&chd=s:QQQRRSTTUUVVVVVVVVXXXXXXYYWXYZZYWWVVVVVXXXYWWYYYZZZZYVVWWXXWYYWXWVVVUTTSTTTUUUWWVWVUUTUUWVUUVVVVWWXYYXYYYYXYZZZZZYYYXXXXWWWWVWWWXXXXYXXYZaaabbbbbaZaabbbaaabcccccddeeedeeeddcdddeeeecbbYYZYYWXYYZZYZZaaaaZZbbbbbbaccacbbccddddcbbaabbcabbabaZZZaZaaZZZYYYZZXXXXYYYYZZaZZZZZaaaZZaaZZZZZYYYYYYaaaaaaaZYYZYYYXXXYXXYYZYYZYZaZZZZYYYYYYXYZYYYXXYYYYZZZaaababbbbbbbabbbbaaaaaaaaabaabbbbcccbcccbbcccdddddddddddcddcccccbccccdddcccbaYZZYZZZZZZaZZZZZYYYZZZZZZaaaaaaaaaZaaabbbbbbbbbbbbccccbbcccccccccccdddddddccdefffffffgggggfgggghghghiiiiijjjkklmllmmkkllllkkjjjjkklklnnooooooooopqrrrrssstuvuvtuwwvutuwxxyxyzyzzzyz00zwuwwuwwx00101111zzzxyxywvxwyyyyxxwxwvxyzyzyz0000112234435554333234442233223432200yzyyxvxwxxxvvwwutrrsopqssrrttttstvvwvuuvvutsqqsrrsstuvvvvvtvwvvxwyxyxyyxxwxxyyzzzxywwwxxxwwvvvxxyzzy0z0zz01010111111zzzzzzyyyxzzyywwxwxxyzzzzz0z001122122333333433213334444455455455444455677777888854301133431212345544442355566654556445434444666656555456665565777777666667888888867888888987788788777644322222231110yuwxxzzzzxy00zyzywxwwywzzzzz1112333335443231z0zz011120zzywvttvutttsstttvwvvvxxxyxvvutttuvwvurqqqponlmnkgijmjlkllnmjjjjjmmmmkmlnnonliiikhghigfcdfgghhhighjkklkjikiijklmlllnnnmoonmmnopoponnnmnmopqoqpqooonnppqonnnnnlllkkkkjjjjjhhihjklkkjkkjiikjjlkjijjiihhihhhjihhgfhffefccbdeeedcaaZYWUQPLRRMNPQNMIGILPNPRONPONLMMLLIJLLMMMJKJJLMNNLNNNNNNMNNNOPPQOOMMKLLKJKIIKKLKJJKJKKJIJIIHIHHGHHIGGGHGFFHGIIJKJLMMNNLKLNNOONOOOONNOONNONNMOPRRRQQPQPQQQQQQRRRSSSSSTTUUUUSTSTTRSTTTTTTTSSRQQPQQQRSSTTUUUUVVVVWWWXWWXVVVWVWWXWWWWVVVVWVWW&chxs=0,ff00ff&chf=bg,lg,0,76A4FB,1,ffffff,0&chxt=y&cht=lc&chs=650x400

$ 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... »

mokuji

2013年12月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク