今日書いたのはこれ。
過去に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')
コメント
コメントを投稿