今日書いたのはこれ。
過去にGoogle Financeから時系列データを取得するプログラムは書いた。
大きく異なる点を挙げておく。
過去にGoogle Financeから時系列データを取得するプログラムは書いた。
大きく異なる点を挙げておく。
- 海外株式の取得可能件数: Google > Yahoo!
- Yahoo!は日本株式のみ
- 日本株式の取得可能件数: Yahoo! > Google
- Googleは東証一部(?=正確には未確認)銘柄のみ時系列データを提供
- 銘柄指定方法: Yahoo!=証券コードのみ / Google=市場コード+証券コード
- 取得可能項目: Yahoo!=4本値+出来高+修正終値 / Google=4本値+出来高
- 取得可能期間: Yahoo!=上場~前日分 / Google=直近200日分
- この違いは実装の違いによるものでありWEBへの提供はされている
日本株式のみで運用する場合には今回作成したYahoo!の時系列データががおススメ。
海外の株式やETFを含むポートフォリオを運用する場合にはGoogleの時系列データがおススメ。
証券コードの指定方法が異なるので、それぞれコマンドラインは以下のようになる。
※xxxxが証券コード
>python googlefinance2csv.py TYO:xxxx
>python yahoofinance2csv.py xxxx
#!/usr/local/bin/python
# -*- coding:utf-8 -*-
from BeautifulSoup import BeautifulSoup
import urllib2,re,datetime,sys
FROM_DATE = {'YEAR':1900,'MONTH':'01','DAY':'01'}
URL_FORMAT='http://table.yahoo.co.jp/t?a=%(a)s&b=%(b)s&c=%(c)s&d=%(d)s&e=%(e)s&f=%(f)s&g=%(g)s&s=%(s)s&y=%(y)s&z=%(z)s'
class yahooFinance2CSV(object):
def __init__(self,ticker):
'''
引数で渡されたticker(=証券コード)の日足時系列データを
Google Financeから取得してCSV形式で保持する
CSVの列は'Date','Open','High','Low','Close','Volume'
'''
today = datetime.datetime.today()
self.ticker = ticker
self.from_date = FROM_DATE
self.to_date = {'YEAR':datetime.datetime.strftime(today,'%Y')
,'MONTH':datetime.datetime.strftime(today,'%m')
,'DAY':datetime.datetime.strftime(today,'%d')}
'''
リクエストのパラメータ'g'はそれぞれ'd':日足、'w':週足、'm':月足を表す
Googleに合わせるため今回は日足に固定
'''
urlparam = {'a':self.from_date['MONTH']
,'b':self.from_date['DAY']
,'c':self.from_date['YEAR']
,'d':self.to_date['MONTH']
,'e':self.to_date['DAY']
,'f':self.to_date['YEAR']
,'g':'d'
,'s':self.ticker
,'y':0
,'z':self.ticker}
self.csv = 'Date,Open,High,Low,Close,Volume,Adjusted close'
date = str('0000/00/00')
while True:
url = URL_FORMAT % urlparam
html = str()
for line in urllib2.urlopen(url).readlines():
'''HTMLのコメント行を破棄'''
if '!' not in line:
html += line.decode('euc_jp')
soup = BeautifulSoup(html)
tablesoup = soup.findAll('table',{'border':'0','cellpadding':'5','cellspacing':'1','width':'100%'})[1]
rows = tablesoup.findAll('tr',{'bgcolor':'#ffffff'})
if len(rows) == 0:
print u'%s以前のデータはYahoo!ファイナンスに存在しません。' % date
break
for row in rows:
#print row
date = row.findAll('td',text=True)[1]
csv_date = '/'.join([s.zfill(2) for s in re.sub(u'年|月|日',',',date).split(',')[0:3]])
self.csv += '\n' + csv_date + ',' + ','.join([re.sub(r',','',cell) for cell in row.findAll('td',text=True)[2:] if cell <> '\n'])
urlparam['y'] = urlparam['y'] + 50
def savefile(self,filepath):
'''
引数で渡されたfilepath(=保存先ファイル名のフルパス)に
CSV形式で保存する
'''
f = open(filepath,'w')
f.write(self.csv.encode('sjis'))
f.close()
if __name__ == '__main__':
'''
コマンドラインで以下のように実行する
"python yahoofinance2csv.py xxxx"のxxxxに証券コードを入れる
Cドライブの直下に'xxxx.csv'というファイルができる
'''
yf2csv = yahooFinance2CSV(sys.argv[1])
yf2csv.savefile('C:\\'+sys.argv[1]+'.csv')
コメント
コメントを投稿