相場商売

トレーディングビジネスあれこれ

データ編ラスト

第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がパソコンに入っていないので飛ばす。
データ編終了、シミュレーション編に続く。