def __init__(self, engine, code, parent=None): """Constructor""" super().__init__() LoggerInterface.__init__(self, parent=parent) APIInterface.__init__(self) Runnable.__init__(self) ConfigInterface.__init__(self, parent=parent) self.__id = self.next_auto_inc() self.user = self.config.user self.user_dir = UserDirectory(User(self.config.user)) self.__strategy_code = StrategyCode(self.config.name, code) self.__code_parser = None self.engine = proxy(engine) self.time_frame = self.config.time_frame self.symbols = self.config.symbols self.start_time = self.config.start_time self.end_time = self.config.end_time self.capital_base = self.config.capital_base self.handlers = {} self.signal_factory = SignalFactory() self.signals = {} self.system_functions = {} self.series_storage = {} self.printer = FilePrinter(self.config.user, self.config.name, self.engine) self.__context = {} self._setting() self.logger_name = "Strategy"
def __init__(self, user, name, engine): self.__user = user self.__name = name self.__engine = engine self.__file_path = os.path.join( UserDirectory(User(user)).get_temp_dir(), name + '.log') self.__file = None
def set_handle(logger, user=config.get("user", "non-existent user")): path = os.path.join( UserDirectory(User(user)).get_temp_dir(), "runtime.log") rt_handler = RotatingFileHandler(path, maxBytes=10 * 1024 * 1024, backupCount=5) rt_handler.setLevel(logging.DEBUG) formatter = logging.Formatter( '%(asctime)s %(filename)-20s[line:%(lineno)-3d] %(levelname)-8s %(message)s' ) rt_handler.setFormatter(formatter) logger.addHandler(rt_handler)
def test(detail): def get_first_n_lines(string, n): lines = string.splitlines() n = min(n, len(lines)) return '\n'.join(lines[:n]) #gc.set_debug(gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_SAVEALL) start_time = time.time() with codecs.open('../test/testcode7.py', 'r', 'utf-8') as f: code = f.read() user = User('10032') backtest = Backtesting(user, 'test', code, ['EURUSD'], 'M30', '2015-01-01', '2016-01-01') print(backtest.progress) for _ in range(4): backtest.start() print(backtest.get_performance().trade_summary) if detail: translator = DataframeTranslator() user_dir = UserDirectory(user) print(user_dir.get_sys_func_list()) print(backtest.get_profit_records()) # 获取浮动收益曲线 print(backtest.get_parameters()) # 获取策略中的参数(用于优化) performance = backtest.get_performance() # 获取策略的各项指标 print('trade_info:\n%s' % performance._manager.trade_info) print('trade_summary:\n%s' % performance.trade_summary) print('trade_details:\n%s' % performance.trade_details) print(translator.dumps(performance._manager.trade_info)) print(translator.dumps(performance.trade_details)) print('strategy_summary:\n%s' % performance.strategy_summary) print('optimize_info:\n%s' % performance.optimize_info) print('info_on_home_page\n%s' % performance.get_info_on_home_page()) print(performance.get_factor_list()) # print(performance.yield_curve) print('ar:\n%s' % performance.ar) # 年化收益率 print('risk_free_rate:\n%s' % performance._manager.risk_free_rate) # 无风险收益率 print('volatility:\n%s' % performance.volatility) # 波动率 print('sharpe_ratio:\n%s' % performance.sharpe_ratio) # sharpe比率 print('max_drawdown:\n%s' % performance.max_drawdown) # 最大回测 print('trade_position\n%s' % performance.trade_positions) # 交易仓位 print(time.time() - start_time) # print('output:\n%s' % get_first_n_lines(backtest.get_output(), 100)) print(time.time() - start_time) print(backtest.progress) paras = {'handle': {'times': {'start': 10, 'end': 10, 'step': 1}}} optimize = backtest.optimize(paras, None, None) print('optimize\n%s' % optimize) print(time.time() - start_time) del backtest performance = None optimize = None
def __init__(self, engine, user, name, code, symbols=None, time_frame=None, start_time=None, end_time=None): """Constructor""" self.__id = self.next_auto_inc() self.user = user self.user_dir = UserDirectory(user) self.name = name self.code = code self.engine = engine self.time_frame = time_frame self.symbols = symbols self.start_time = start_time self.end_time = end_time self.max_length = 0 self.capital_base = 100000 self.handlers = {} self.listeners = {} self.system_functions = {} self.series_storage = {} self.__printer = FilePrinter(user, name, self.engine) self.__context = {} # 是否完成了初始化 self.trading = False # 在字典中保存Open,High,Low,Close,Volumn,CurrentBar,MarketPosition, # 手动为exec语句提供local命名空间 self.__locals_ = dict( sell=partial(self.engine.sell, strategy=self.__id), short=partial(self.engine.short, strategy=self.__id), buy=partial(self.engine.buy, strategy=self.__id), cover=partial(self.engine.cover, strategy=self.__id), marketposition=self.engine.get_current_positions(), currentcontracts=self.engine.get_current_contracts(), data=self.engine.get_data, context=self.__context, export=partial(export, strategy=self), put=self.put_context, get=self.get_context, print=self.__printer.print, listeners=self.listeners, system_functions=self.system_functions, ) # 将策略容器与对应代码文件关联 self.bind_code_to_strategy(self.code)
def get_first_n_lines(string, n): lines = string.splitlines() n = min(n, len(lines)) return '\n'.join(lines[:n]) start_time = time.time() with codecs.open('../test/testcode9.py', 'r', 'utf-8') as f: code = f.read() user = User('10032') backtest = Backtesting(user, 'test', code, ['EURUSD'], 'M15', '2015-01-02', '2015-03-01') print(backtest.progress) backtest.start() translator = DataframeTranslator() user_dir = UserDirectory(user) print(user_dir.get_sys_func_list()) print(backtest.get_profit_records()) # 获取浮动收益曲线 print(backtest.get_parameters()) # 获取策略中的参数(用于优化) performance = backtest.get_performance() # 获取策略的各项指标 print('trade_info:\n%s' % performance._manager.trade_info) print('trade_summary:\n%s' % performance.trade_summary) print('trade_details:\n%s' % performance.trade_details) print(translator.dumps(performance._manager.trade_info)) print(translator.dumps(performance.trade_details)) print('strategy_summary:\n%s' % performance.strategy_summary) print('optimize_info:\n%s' % performance.optimize_info) print('info_on_home_page\n%s' % performance.get_info_on_home_page()) print(performance.get_factor_list()) print(performance.yield_curve) print('ar:\n%s' % performance.ar) # 年化收益率
def __init__(self, engine, user, name, code, symbols=None, time_frame=None, start_time=None, end_time=None): """Constructor""" self.__id = self.next_auto_inc() self.user = user self.user_dir = UserDirectory(user) self.name = name self.code = code self.engine = proxy(engine) self.time_frame = time_frame self.symbols = symbols self.start_time = start_time self.end_time = end_time self.max_length = 0 self.capital_base = 100000 self.handlers = {} self.signal_factory = SignalFactory() self.signals = {} self.system_functions = {} self.series_storage = {} self.__printer = FilePrinter(user, name, self.engine) self.__context = {} self.__points = {} # 是否完成了初始化 self.trading = False # 在字典中保存Open,High,Low,Close,Volumn,CurrentBar,MarketPosition, # 手动为exec语句提供globals命名空间 self.__glb = { 'Buy': partial(self.engine.open_position, strategy=self.__id, direction=1), 'Sell': partial(self.engine.close_position, strategy=self.__id, direction=1), 'SellShort': partial(self.engine.open_position, strategy=self.__id, direction=-1), 'BuyToCover': partial(self.engine.close_position, strategy=self.__id, direction=-1), 'Positions': self.engine.current_positions, 'Data': self.engine.data, 'Context': self.__context, 'Export': partial(export, strategy=self), 'Put': self.put_context, 'Get': self.get_context, 'print': self.__printer.print, 'Points': self.__points, 'signals': self.signals, 'system_functions': self.system_functions } # 将策略容器与对应代码文件关联 self.bind_code_to_strategy(self.code)