相場商売

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

20章

すべてをまとめる部分。
チェック段階でやっと気づいたが、TextToStockクラスで、
'market_section'を指定しないとうまく動かなかった。
以前の作り方がまずかったらしい。

仕方なく今回は'market_section':'東証1部'と指定している。
さかのぼっての大幅な修正よりもとりあえずの完成を目指したい。

libフォルダのsimulation.py

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

from trading_system import TradingSystem
from recorder import Recorder

# 売買シミュレーションを行うクラス
class Simulation:
    
    def __init__(self, params = {}):
        self.trading_system     = params['trading_system']
        self.data_loader        = params['data_loader']
        self.recorder           = params['recorder']
        self.frm                = params['from']
        self.to                 = params['to']
        self.record_every_stock = False if params['record_every_stock'] == False else True
                
    # 1銘柄のシミュレーションを行う
    def simulate_a_stock(self, code):
        self._set_dates_to_data_loader()
        stock = self.data_loader.generate_stock(code)
        print(stock.code)
        self._simulate(stock)
        if len(self.trades) != 0:
            self.recorder.record_a_stock(self.trades)
            
    # すべての銘柄のシミュレーションを行う
    def simulate_all_stocks(self):
        results = []
        self._set_dates_to_data_loader()
        for stock in self.data_loader.each_stock():
            self._simulate(stock)
            print(stock.code)
            if len(self.trades) == 0:
                continue
            if self.record_every_stock:
                self.recorder.record_a_stock(self.trades)
            results.append(self.trades)
        self.recorder.record_stats_for_each_stock(results)
        self.recorder.record_stats(results)
        
    def _set_dates_to_data_loader(self):
        self.data_loader.frm = self.frm
        self.data_loader.to  = self.to
        
    def _simulate(self, stock):
        self.trading_system.set_stock(stock)
        self.trading_system.calculate_indicators()
        self.trades   = []
        self.position = None
        self.unit     = stock.unit
        for index in range(0, len(stock.prices)):
            self.index = index
            self._before_open()
            self._at_open()
            self._in_session()
            self._at_close()
    
    def _before_open(self):
        self.signal = None
        if self.position is not None:
            self.position.exit_date  = None
            self.position.exit_price = None
            self.trading_system.set_stop(self.position, self.index)
            self.position.length += 1
    
    def _at_open(self):
        self._take_position('open')
        self._close_position('open')
        
    def _in_session(self):
        self._take_position('in_session')
        self._close_position('in_session')
        
    def _at_close(self):
        self._take_position('close')
        self._close_position('close')
        
    def _take_position(self, entry_time):
        if self.position is None:
            if self.signal is None:
                self.signal = self.trading_system.check_entry(self.index)
            if self.signal is not None:
                if self.signal.entry_time == entry_time:
                    self.position        = self.signal
                    self.position.volume = self.unit
                    self.signal          = None
                    
    def _close_position(self, exit_time):  
        if self.position is not None:
            if self.position.closed_check() == False:
                self.trading_system.check_exit(self.position, self.index)
            if self.position.closed_check() == True:
                if self.position.exit_time == exit_time:
                    self.trades.append(self.position)
                    self.position = None

checkフォルダのsimulation_check.py

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

import sys, os
sys.path.append(os.pardir + "\lib")

from simulation import Simulation
from text_to_stock import TextToStock
from trading_system import TradingSystem
from recorder import Recorder
from rule.entry.estrangement_entry import EstrangementEntry
from rule.exit.stop_out_exit import StopOutExit
from rule.exit.estrangement_exit import EstrangementExit
from rule.stop.average_true_range_stop import AverageTrueRangeStop
from rule.filter.moving_average_direction_filter import MovingAverageDirectionFilter

text_to_stock = TextToStock({'data_dir': os.pardir + '\\data', 'stock_list':'tosho_list.txt', 'market_section':'東証1部'})
estrangement_system = TradingSystem({'entries': [EstrangementEntry({'span': 20, 'rate': 5})],
                                     'exits'  : [StopOutExit(),
                                                 EstrangementExit({'span': 20, 'rate': 3})],
                                     'stops'  : [AverageTrueRangeStop({'span': 20, 'ratio': None})],
                                     'filters': [MovingAverageDirectionFilter({'span': 30})]})

recorder = Recorder()
recorder.record_dir = os.pardir + r'\result\estrangement\test_simulation'

simulation = Simulation({'trading_system'    : estrangement_system,
                         'data_loader'       : text_to_stock,
                         'recorder'          : recorder,
                         'from'              : None,
                         'to'                : None,
                         'record_every_stock': False})

recorder.create_record_folder()

simulation.simulate_a_stock(8604)
simulation.simulate_all_stocks()