Home > Ruby > RubyでSBIランキングの売り越し額を調べる

RubyでSBIランキングの売り越し額を調べる

  • 2010-05-05 (水) 18:35
  • Ruby

SBI証券は個人投資家が多く使っている証券会社です。通常は個人投資家は機関投資家に搾取されるようにできています。株価が暴落すると個人投資家は飛びつき、下げ止まらないとどんどんナンピン買いをして損を膨らませていきます。投資のスタイルは人それぞれですが、個人が買い越している間は手を出さずに売り越しに転じた辺りで買うというのもよいと思っています。

これを毎日、前場と後場にランキングを見て、買い代金と売り代金を比較してソートするのは面倒ですので、これを自動でやらせます。

方針

いつものようにMechanizeで該当のページを読み、xpathで必要な部分だけ取り出して解析します。

売りと買いを配列に入れて1つずつ照合、同じコードを持つもので買い代金と売り代金の差を取って新しい配列に入れます。これをソートして出力すればOK。

実装例

#!/usr/bin/ruby -Ku
require 'rubygems'
require 'nokogiri'
require 'mechanize'
require 'logger'
require 'kconv'

SBI_RANKING = "https://trading1.sbisec.co.jp/ETGate/?_ControlID=WPLETmgR001Control&_DataStoreID=DSWPLETmgR001Control&burl=search_market&dir=ranking%2F&file=et_trading_value.html&cat1=market&cat2=ranking&getFlg=on"

BUY_XPATH = "/html/body/div[@id='middleArea']/div[@id='middleAreaM']/table/tr/td[1]/div[@id='main']/table[2]/tr/td[2]/table[4]/tr/td[1]/table"
SELL_XPATH = "/html/body/div[@id='middleArea']/div[@id='middleAreaM']/table/tr/td[1]/div[@id='main']/table[2]/tr[1]/td[2]/table[4]/tr/td[3]/table"
DATE_XPATH = "/html/body/div[@id='middleArea']/div[@id='middleAreaM']/table/tr/td[1]/div[@id='main']/table[2]/tr[1]/td[2]/table[3]/tr/td[1]/b"
TIME_XPATH = "/html/body/div[@id='middleArea']/div[@id='middleAreaM']/table/tr/td[1]/div[@id='main']/table[2]/tr[1]/td[2]/table[3]/tr/td[2]"

#---------------------------------------------------------------------------
# main
#---------------------------------------------------------------------------
def main

	agent = Mechanize.new
	log = Logger.new(STDOUT)
#	log = Logger.new("sbi_ranking.log")
	log.level = Logger::INFO
	agent.get(SBI_RANKING)
	agent.page.encoding = "Shift_JIS"

	html = agent.page.body
	parser = Nokogiri::HTML.parse(html, nil)

	# 時刻
	ranking_time = parser.xpath(TIME_XPATH)
	/(\d{2,2}):(\d{2,2})<\/td>$/ =~ ranking_time.to_html.toutf8
	sbi_hour = $1
	sbi_min = $2

	# 日付
	ranking_date = parser.xpath(DATE_XPATH)
	/.*?(\d{1,2})\/(\d{1,2})/ =~ ranking_date.to_html.toutf8
	sbi_month = $1
	sbi_day = $2

	buy_code = []
	buy_name = []
	buy_trading_value = []

	sell_code = []
	sell_name = []
	sell_trading_value = []

	for i in 3..22 do
		buy = parser.xpath(BUY_XPATH + "/tr[#{i}]")
		e = buy.to_html.toutf8.gsub("\n", "")
		/stock_sec_code_mul=(\d{4,4}).*?exchange_code.*?>(.*?)<.*?([\d,]+?)<\/div>/ =~ e
		buy_code << $1
		buy_name << $2
		buy_trading_value << $3.gsub(",", "")
	end

	for i in 3..22 do
		sell = parser.xpath(SELL_XPATH + "/tr[#{i}]")
		e = sell.to_html.toutf8.gsub("\n", "")
		/stock_sec_code_mul=(\d{4,4}).*?exchange_code.*?>(.*?)<.*?([\d,]+?)<\/div>/ =~ e
		sell_code << $1
		sell_name << $2
		sell_trading_value << $3.gsub(",", "")
	end

	result = []
	for i in 0..buy_code.size - 1 do
		for j in 0..sell_code.size - 1 do
			if buy_code[i] == sell_code[j] then
				result.push( [buy_code[i], buy_name[i], ( buy_trading_value[i].to_i - sell_trading_value[j].to_i )] )
			end
		end
	end

	result = result.sort{ |a, b| a[2] <=> b[2] }

	for i in 0..result.size - 1 do
		puts "#{result[i][0]}, #{result[i][1]}, #{result[i][2]}"
	end
end

#---------------------------------------------------------------------------
# エントリポイント
# 単にmainを呼ぶだけ
#---------------------------------------------------------------------------
main

Comments:0

Comment Form
Remember personal info

Trackback+Pingback:0

TrackBack URL for this entry
http://blog.neoneet.jp/2010/05/05/ruby%e3%81%a7sbi%e3%83%a9%e3%83%b3%e3%82%ad%e3%83%b3%e3%82%b0%e3%81%ae%e5%a3%b2%e3%82%8a%e8%b6%8a%e3%81%97%e9%a1%8d%e3%82%92%e8%aa%bf%e3%81%b9%e3%82%8b/trackback/
Listed below are links to weblogs that reference
RubyでSBIランキングの売り越し額を調べる from 週刊(月刊?)プレカリアート

Home > Ruby > RubyでSBIランキングの売り越し額を調べる

Search
Feeds
Meta

Page Top