Yahooファイナンスの株価を取得してみる その2

前回、株価のヒストリカルデータを銘柄コード別にファイルに落とすところまでできました。このままでは使いづらいのでリレーショナルDBに入れることにします。

ただ、この動作しているマシンがRaspberryPIなので、データベースを入れるというような暴挙はできません。そこで、組み込みきらしくSQLiteを使うことにします。

  • schema
$ sqlite3 stock.db 
SQLite version 3.7.13 2012-07-17 17:46:21
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema
CREATE TABLE histDaily(
				date text,
				open real,
				high real,
				low	real,
				close real,
				volume real,
				adj_close real,
				code text
);
CREATE UNIQUE INDEX idx_histDaily on histDaily(code,date);
sqlite> 
  • hist_import.py
#!/bin/env python
# coding:utf-8
import sqlite3
import sys

def import_data(file):
	con=sqlite3.connect("stock.db",isolation_level=None)
	sql=u"insert into histDaily values(?,?,?,?,?,?,?,?)"
	for line in open(file,'r'):
		ay=line.split('\t')
		con.execute(sql,(ay[0],ay[1],ay[2],ay[3],ay[4],ay[5],ay[6],ay[7]))
	con.close()


if __name__ == '__main__':
	print sys.argv[1]
	import_data(sys.argv[1])
  • hist_imprt.sh
#!/bin/sh

codes=`ls data/*.txt|grep -v master`
for code in $codes;do
	echo $code
	python hist_import.py $code
done

これで動かしてみたのですがちょっとおそいです。というか丸一日動かして1000銘柄も取り込めていない。。。

後ほどチューニングすることにします

Yahooファイナンスの株価を取得してみる

RでYahooファイナンスを取得するモジュール、RFinanceYJを改造し使っていたのですが、あまりの遅さに閉口してしまいました。丸一日掛けても14年分の日次株価は1000銘柄程度しか撮れていません。やり方はこの辺りにまとめています。

http://d.hatena.ne.jp/anagotan/searchdiary?word=%2A%5BR%5D

RaspberryPiを手に入れたこともあり、pythonで書き直してみました。pythonは2.7です

master.py

マスターを取得します 

#!/bin/env python
# coding:utf-8

import urllib
import urllib2
from lxml import etree
import time


def get_stockmaster(hira):
	p=1
	ret="dummy"
	ss=""
	while(ret!=""):
		ret,plen=get_stockmaster_page(hira,p)
		#print ret
		if ret != "":
			ss=ss+ret
		p=p+1
	return ss

def get_stockmaster_page(hira,p):
	hira=hira.encode('utf-8')
	url="http://stocks.finance.yahoo.co.jp/stocks/qi/?%s"
	params={"js":hira,"p":p}
	data=urllib.urlencode(params)
	#print data
	res=urllib.urlopen(url % data)
	page=res.read()
	root=etree.fromstring(page,etree.HTMLParser())
	elem=root.xpath("//a[contains(@href,'/stocks/detail')]")
	i=0
	ret=""
	for ele in elem:
		if ele.text != None:
			if i%3==0:
				ret=ret+ele.text+"\t"
			if i%3==1:
				ret=ret+ele.text.encode('utf-8')+"\n"
		i=i+1
	time.sleep(1)
	return ret,len(elem)

def get_stockmasterall():
	hira=u"あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよわ"
	size=len(hira)
	ss=""
	for i in range(0,size):
		print hira[i:i+1]
		#print i
		ss=ss+get_stockmaster(hira[i:i+1])
	f=open("data/master.txt","w")
	f.write(ss)
	f.close()

if __name__ == '__main__':
	get_stockmasterall()

hist.py

時系列データを取得します 

#!/bin/env python
# coding:utf-8

import urllib
import urllib2
from lxml import etree
import time


def get_stockdata(code,sy,sm,sd,ey,em,ed,tm):
	p=1
	plen=53
	ss=""
	while(plen>=53):
		ret,plen=get_stockdata_page(code,sy,sm,sd,ey,em,ed,tm,p)
		ss=ss+ret
		p=p+1
	f=open("data/"+code+".txt","w")
	f.write(ss)
	f.close()

def get_stockdata_page(code,sy,sm,sd,ey,em,ed,tm,p):
	url="http://info.finance.yahoo.co.jp/history/?%s"
	params={"code":code,"sy":sy,"sm":sm,"sd":sd,"ey":ey,"em":em,"ed":ed,"tm":tm,"p":p}
	data=urllib.urlencode(params)
	#print data
	res=urllib.urlopen(url % data)
	page=res.read()
	root=etree.fromstring(page,etree.HTMLParser())
	elem=root.xpath("//table")
	
	ret=""
	plen=len(elem[1].xpath("//tr"))
	for tr in elem[1].xpath("//tr"):
		if len(tr.findall("td"))==7:
			str=""
			for td in tr.findall("td"):
				s=td.text.encode('utf-8').replace(',','').replace('年','-').replace('月','-').replace('日','')
				str=str+s+"\t"
			str=str+code
			ret=ret+str+"\n"
	time.sleep(1)
	return ret,plen

def get_stockdata_all(sy,sm,sd,ey,em,ed,tm):
	f=open("data/master.txt")
	lines=f.readlines()
	f.close()
	for line in lines:
		ay=line.split("\t")
		print ay[0]
		get_stockdata(ay[0],sy,sm,sd,ey,em,ed,tm)

if __name__ == '__main__':
	get_stockdata_all("2000","01","01","2014","08","27","d")

やっつけで作成しましたがとりあえずファイルに落とすところまでは確認できました。

ちなみに動作環境はRapberryPITypeB+のRASPBIANVersion:June 2014で動いています