スキップしてメイン コンテンツに移動

[Python]個別銘柄の時系列データをYahoo!ファイナンスから取得するプログラム

今日書いたのはこれ。

過去に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')

コメント

このブログの人気の投稿

[Mac]Time Machineのバックアップ先をWindows共有フォルダに設定する

こんばんは。もっくんです。 2台あったWindowsのデスクトップを1台にまとめるついでに、ずっと放置していたMacのバックアップ環境を構築してみました。Finderでコピペするだけでいいんですが、どうせなら「Mac全体を自動的にバックアップします。」という謳い文句のTime Machineを使いたい。 Apple純正のTime CapsuleやUSBの外付けHDDという手もあったんですが、ノートの機動性を落としたくなかったし、なによりタダでできそうなWindows共有フォルダにネットワーク越しにバックアップする方法を取ることにしました。 実際の流れは下記のようになります。 ネットワーク共有フォルダを作成する 空のディスクイメージを作成する ネットワーク共有フォルダにディスクイメージをコピーする ネットワーク共有フォルダのディスクイメージをマウントする マウントしたディスクイメージをTime Machineのバックアップ先に指定する 1.ネットワーク共有フォルダを作成する この手順はそこまで面倒ではないので、簡単な手順だけ。 Windows全体の設定でファイル共有を有効にする(Windowsで作業) Macと共有(Macから見えるように)したいフォルダを作成する(Windowsで作業) 共有したいフォルダに共有設定をする(Windowsで作業) 共有フォルダに接続(Macで作業) 詳細はこちらの記事が画像付きでわかりやすい。 http://blog.goo.ne.jp/beosound/e/7d6d0d0a8f76035f880001eda06c4247 2.空のディスクイメージを作成する いわばこのディスクイメージがバックアップ先のHDDの代わりとなる。 アプリケーション > ユーティリティ > ディスクユーティリティを起動 画面上部の ファイル > 新規 > 空のディスクイメージをクリック 設定画面の各欄は以下のように設定 名前: TimeMachineVolume(なんでもよい) 保存先: デスクトップ(ローカルのわかりやすい場所) ボリューム名: TimeMachineVolume(なんでもよい) ボリュームサイズ: カスタム

[Python]個別銘柄の時系列データをGoogle Financeから取得するプログラム

今日書いたのはこれ。 Google Finance から証券コードを指定して日別の価格情報を取得するプログラムです。 米国市場に上場している銘柄であればCSVでダウンロードでますが、日本の銘柄はできなかったので作りました。 多くの人はYahoo!Japanから取得しているようなので、あえてGoogle Financeから取得してみました。 ちなみに使えるのは東証に上場している銘柄のみです。(おそらく) このプログラムと 日経225構成銘柄一覧取得プログラム を組み合わせれば、日経225構成銘柄の時系列データが取得できてしまいます。 #!/usr/local/bin/python # -*- coding:utf-8 -*- from BeautifulSoup import BeautifulSoup import urllib2,re,datetime,sys class googleFinance2CSV(object): def __init__(self,ticker): ''' 引数で渡されたticker(=証券コード)の時系列データを Google Financeから取得してCSV形式で保持する CSVの列は'Date','Open','High','Low','Close','Volume' ''' self.ticker = ticker self.url = 'http://www.google.com/finance/historical?q=%s&num=200' % str(self.ticker) self.csv = str() soup = BeautifulSoup(urllib2.urlopen(self.url)) tablesoup = soup.find("table", {"class":"gf-table historical_price"}) for trsoup in tablesoup.findAll("tr&qu

[Python]redis-pyでRedis Pub/Sub実装

前から面白そうと思っていたRedisのPub/Sub機能。 redis-pyでどう実装すれば使えるか確認してみた。 ■Pub/Subについて http://ja.wikipedia.org/wiki/出版-購読型モデル ■pub.py from redis import StrictRedis def publish(channel,msg): """ redis-pyにはPUBLISHするためのメソッドがないので、 Redisのコマンドをそのまま実行する為のクラスを使う。 """ sr=StrictRedis() """ 第1引数にRedisのコマンド、第2引数以降は そのコマンドの引数をそのままセット """ sr.execute_command("PUBLISH",channel,msg) if __name__=="__main__": # チャネル"hoge"に"Hello"というメッセージを出版(Publish) publish("hoge","Hello") ■sub.py from redis import Redis def listen(channel): r=Redis() ps=r.pubsub() ps.subscribe(channel) while True: for i in ps.listen(): print i["data"] if __name__=="__main__": # チャネル"hoge"を購読(Subscribe) listen("hoge") ■実行方法・実行結果 (ターミナル1-準備) [user@localhost ~]# python sub.py 1 # => チャネ