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

[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')

コメント

このブログの人気の投稿

[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 # => チャネ

[OS]VirtualBoxでCentOS6.5(x86_64)がKernel panicを起こした

完全に対処療法。 恥ずかしながら自分では原因がわかっていない。 忘れないようにメモしておく。 いろいろ設定したあと、何度目かの再起動のタイミングでKernel panicが発生して起動しないという事象が発生。 こちらの方法でなんとか起動させて。 [CentOS] SELinux 無効化後のカーネルパニック http://kuni255.blogspot.jp/2013/04/centos-selinux.html こちらの通り、/boot/grub/grub.confに設定を追加。 Kernel panic – not syncing: Attempted to kill init! http://h2np.net/mynotebook/post/130 設定変更後、以下の操作をそれぞれ10回ほど試した限りでは再発していません。  (1)halt+起動 (2)reboot 追記:と思ったらまた発生した。なんかもう解決できる気がしない。

[Python]システムトレード環境

最近、システムトレードをしている。 日本株は、自動売買までは実現できていないが、トレンド分析くらいはできるようになっている。 とりあえず、現時点の環境を整理しておきたい。 ■日本株 H/W:さくらVPS(2GBだったかな?) OS:CentOS6.4(x86_64) 言語:Python DB:SQLite3 データソース: http://www.data-get.com/main/ (有料) データ種別:株価データ、銘柄情報データ、分割併合データ ■FX H/W:DELL T100(6年前のもの)+CPU4コアに換装済+メモリ8GB化済 OS:Windows 7 64bit プラットフォーム:MetatTrader 4 言語:MQL4 取引業者:Alpari Japan ■クライアント H/W:MacBook Pro 13インチ(2010-Mid) 特に不満はないけど、さくらVPSが高い。 自宅のT100は古いけど重い処理をさせるわけじゃない。 そのうちさくらVPSから自宅PCのVirtualBoxかなんかの仮想環境に引っ越す可能性もある。 こんなところ。