相場商売

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

Pythonではじめるシステムトレード

タイトルをRubyの本の真似してみた。

第4章のコードから始める。
で、いきなりだがPythonのコードはこうなった。

libフォルダのstock.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 株を表すクラス
class Stock:
    def __init__(self, code, market, unit):
        self.code         = code
        self.market       = market
        self.unit         = unit
        self.prices       = []
        self.price_hash   = {'date':[], 'open':[], 'high':[],
                             'low':[], 'close':[], 'volume':[]}

    # 1日分の株価を加える
    def add_price(self, date, open, high, low, close, volume):
        d = {'date':date, 'open':open, 'high':high, 'low':low, 
             'close':close, 'volume':volume} 
        self.prices.append(d)

    # 株価データのうち、特定の種類
    # (日付、4本値のどれか、出来高)の配列を得る
    def map_prices(self, price_name):
        self.price_hash[price_name] = self.price_hash[price_name] or []
        if self.price_hash[price_name] == []:
            for x in self.prices:
                self.price_hash[price_name].append(x[price_name])
            return self.price_hash[price_name]

    # 日付の配列
    def dates(self):
        self.map_prices('date')
        return self.price_hash['date']

    # 始値の配列
    def open_prices(self):
        self.map_prices('open')
        return self.price_hash['open']

    # 高値の配列
    def high_prices(self):
        self.map_prices('high')
        return self.price_hash['high']

    # 安値の配列
    def low_prices(self):
        self.map_prices('low')
        return self.price_hash['low']

    # 終値の配列
    def close_prices(self):
        self.map_prices('close')
        return self.price_hash['close']

    # 出来高の配列
    def volumes(self):
        self.map_prices('volume')
        return self.price_hash['volume']

それからcheckフォルダのstock_check.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from lib.stock import Stock

stock = Stock(8604, 't', 100)
print(stock.code)
print(stock.market)
print(stock.unit)

stock.add_price('2011-07-01', 402, 402, 395, 397, 17495700)
stock.add_price('2011-07-04', 402, 404, 400, 403, 18819300)
stock.add_price('2011-07-05', 402, 408, 399, 401, 20678000)

print(stock.prices[0]['date']) #=> "2011-07-01"
print(stock.prices[1]['open']) #=> 402
print(stock.prices[2]['high']) #=> 408
print(stock.prices)

dates = stock.map_prices('date')       # 日付の配列を取り出す
print(dates[1])                        #=> "2011-07-04"
open_prices = stock.map_prices('open') # 始値の配列を取り出す
print(open_prices[0])                  #=> 402
print(dates)                           #=> ["2011-07-01", "2011-07-04", "2011-07-05"]

print(stock.dates()[0])          #=> "2011-07-01"
print(stock.open_prices()[1])    #=> 402
print(stock.high_prices()[2])    #=> 408
print(stock.low_prices()[0])     #=> 395
print(stock.close_prices()[1])   #=> 403
print(stock.volumes()[2])        #=> 20678000

input()

price_hashの並びがバラバラなのが気になるが、
辞書には順序の概念がないのでこうなるらしい。

OrderedDictを使えば順序も決められるので
もし必要なときはそちらに変更する予定。

4章終わり、5章に続く。

Rubyではじめるシステムトレード (現代の錬金術師シリーズ)

Rubyではじめるシステムトレード (現代の錬金術師シリーズ)