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