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()