データ編ラスト
第8章
libフォルダのtext_to_stock.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from lib.stock import Stock from lib.stock_list_loader import StockListLoader import os, re, codecs, datetime # テキストデータからStcokクラスのオブジェクトを生成するクラス class TextToStock: def __init__(self, params): self.data_dir = params['data_dir'] or 'data' if params['stock_list'] == None: raise IOError('銘柄リストを指定してください') else: self.stock_list = params['stock_list'] self.market_section = params['market_section'] self.list_loader = StockListLoader('{0}\{1}'.format(self.data_dir, self.stock_list)) self.frm = None self.to = None self.formatted_from = None self.formatted_to = None # 株オブジェクトを生成する def generate_stock(self, code): index = self.list_loader.codes().index(code) stock = Stock(code, self.market(index), self.list_loader.units()[index]) self.add_prices_from_data_file(stock) return stock # 銘柄リストにある銘柄について、 # データディレクトリ内にある株価データから # 順番に株オブジェクトを返すイテレータ def each_stock(self): for d in self.list_loader.filter_by_market_section(self.market_section): if os.path.exists('{0}\{1}.txt'.format(self.data_dir, d['code'])): yield self.generate_stock(d['code']) def market(self, index): section = self.list_loader.market_sections()[index] if re.search('東証|マザーズ', section) != None: return 't' elif re.search('名', section) != None: return 'n' elif re.search('福', section) != None: return 'f' elif re.search('札', section) != None: return 's' def add_prices_from_data_file(self, stock): f = codecs.open('{0}/{1}.txt'.format(self.data_dir, stock.code), 'r', 'utf-8') lines = f.readlines() fi = self.from_index(lines) ti = self.to_index(lines) if fi == None or ti == None: return for line in lines[fi: ti+1]: data = line.split(',') date = data[0] prices_and_volume = [] for i in range(1, 6): prices_and_volume.append(int(data[i])) stock.add_price(date, *prices_and_volume) def from_index(self, lines): if self.frm == None: return 0 if self.formatted_from == None: self.formatted_from = datetime.datetime.strptime(re.sub('-', '/', str(self.frm)), '%Y/%m/%d') for line in lines: if datetime.datetime.strptime(line[0:10], '%Y/%m/%d') >= self.formatted_from: return lines.index(line) break def to_index(self, lines): if self.to == None: return len(lines) if self.formatted_to == None: self.formatted_to = datetime.datetime.strptime(re.sub('-', '/', str(self.to)), '%Y/%m/%d') for line in reversed(lines): if datetime.datetime.strptime(line[0:10], '%Y/%m/%d') <= self.formatted_to: return lines.index(line) break
そしてチェックフォルダのtext_to_stock_check.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from lib.text_to_stock import TextToStock tts = TextToStock({'data_dir':'data', 'stock_list':'tosho_list.txt', 'market_section':'東証1部'}) #print(tts.frm) #print(tts.list_loader.codes().index(1301)) stock = tts.generate_stock(1301) print(stock.code) print(stock.dates()[0]) print(stock.open_prices()[0]) for stock in tts.each_stock(): print(stock.code) # 開始日と終了日を指定 tts.frm = '2011/01/04' tts.to = '2011/06/30' for stock in tts.each_stock(): try: print(' '.join([str(stock.code), str(stock.dates()[0]), str(stock.dates()[-1])])) except: pass input()
9章はPanActiveDatabeaseがパソコンに入っていないので飛ばす。
データ編終了、シミュレーション編に続く。