def start(self) -> None: """ Run backtesting end-to-end :return: None """ data: Dict[str, Any] = {} data, timerange = self.load_bt_data() min_date = None max_date = None for strat in self.strategylist: min_date, max_date = self.backtest_one_strategy( strat, data, timerange) stats = generate_backtest_stats(data, self.all_results, min_date=min_date, max_date=max_date) if self.config.get('export', False): store_backtest_stats(self.config['exportfilename'], stats) # Show backtest results show_backtest_results(self.config, stats)
def start(self) -> None: """ Run backtesting end-to-end :return: None """ data: Dict[str, Any] = {} data, timerange = self.load_bt_data() self.load_bt_data_detail() logger.info("Dataload complete. Calculating indicators") for strat in self.strategylist: min_date, max_date = self.backtest_one_strategy( strat, data, timerange) if len(self.strategylist) > 0: self.results = generate_backtest_stats(data, self.all_results, min_date=min_date, max_date=max_date) if self.config.get('export', 'none') == 'trades': store_backtest_stats(self.config['exportfilename'], self.results) # Show backtest results show_backtest_results(self.config, self.results)
def start(self) -> None: """ Run backtesting end-to-end :return: None """ data: Dict[str, Any] = {} logger.info('Using stake_currency: %s ...', self.config['stake_currency']) logger.info('Using stake_amount: %s ...', self.config['stake_amount']) # Use max_open_trades in backtesting, except --disable-max-market-positions is set if self.config.get('use_max_market_positions', True): max_open_trades = self.config['max_open_trades'] else: logger.info( 'Ignoring max_open_trades (--disable-max-market-positions was used) ...' ) max_open_trades = 0 position_stacking = self.config.get('position_stacking', False) data, timerange = self.load_bt_data() all_results = {} preprocessed_data = {} for strat in self.strategylist: logger.info("Running backtesting for Strategy %s", strat.get_strategy_name()) self._set_strategy(strat) # need to reprocess data every time to populate signals preprocessed = self.strategy.ohlcvdata_to_dataframe(data) # Trim startup period from analyzed dataframe for pair, df in preprocessed.items(): preprocessed[pair] = trim_dataframe(df, timerange) min_date, max_date = history.get_timerange(preprocessed) logger.info('Backtesting with data from %s up to %s (%s days)..', min_date.isoformat(), max_date.isoformat(), (max_date - min_date).days) # Store reprocessed data for later use in export preprocessed_data[self.strategy.get_strategy_name()] = preprocessed # Execute backtest and print results all_results[self.strategy.get_strategy_name()] = self.backtest( processed=preprocessed, stake_amount=self.config['stake_amount'], start_date=min_date, end_date=max_date, max_open_trades=max_open_trades, position_stacking=position_stacking, ) if self.config.get('export', False): store_backtest_result(self.config, preprocessed_data, all_results) # Show backtest results show_backtest_results(self.config, data, all_results)
def start(self) -> None: """ Run backtesting end-to-end :return: None """ data: Dict[str, Any] = {} data, timerange = self.load_bt_data() self.load_bt_data_detail() logger.info("Dataload complete. Calculating indicators") self.load_prior_backtest() for strat in self.strategylist: if self.results and strat.get_strategy_name( ) in self.results['strategy']: # When previous result hash matches - reuse that result and skip backtesting. logger.info( f'Reusing result of previous backtest for {strat.get_strategy_name()}' ) continue min_date, max_date = self.backtest_one_strategy( strat, data, timerange) # Update old results with new ones. if len(self.all_results) > 0: results = generate_backtest_stats(data, self.all_results, min_date=min_date, max_date=max_date) if self.results: self.results['metadata'].update(results['metadata']) self.results['strategy'].update(results['strategy']) self.results['strategy_comparison'].extend( results['strategy_comparison']) else: self.results = results if self.config.get('export', 'none') == 'trades': store_backtest_stats(self.config['exportfilename'], self.results) # Results may be mixed up now. Sort them so they follow --strategy-list order. if 'strategy_list' in self.config and len(self.results) > 0: self.results['strategy_comparison'] = sorted( self.results['strategy_comparison'], key=lambda c: self.config['strategy_list'].index(c['key'])) self.results['strategy'] = dict( sorted( self.results['strategy'].items(), key=lambda kv: self.config['strategy_list'].index(kv[0]))) if len(self.strategylist) > 0: # Show backtest results show_backtest_results(self.config, self.results)
def start_backtesting_show(args: Dict[str, Any]) -> None: """ Show previous backtest result """ config = setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE) from freqtrade.data.btanalysis import load_backtest_stats from freqtrade.optimize.optimize_reports import show_backtest_results, show_sorted_pairlist results = load_backtest_stats(config['exportfilename']) show_backtest_results(config, results) show_sorted_pairlist(config, results)
def start(self) -> None: """ Run backtesting end-to-end :return: None """ data: Dict[str, Any] = {} logger.info('Using stake_currency: %s ...', self.config['stake_currency']) logger.info('Using stake_amount: %s ...', self.config['stake_amount']) position_stacking = self.config.get('position_stacking', False) data, timerange = self.load_bt_data() all_results = {} for strat in self.strategylist: logger.info("Running backtesting for Strategy %s", strat.get_strategy_name()) self._set_strategy(strat) # Use max_open_trades in backtesting, except --disable-max-market-positions is set if self.config.get('use_max_market_positions', True): # Must come from strategy config, as the strategy may modify this setting. max_open_trades = self.strategy.config['max_open_trades'] else: logger.info( 'Ignoring max_open_trades (--disable-max-market-positions was used) ...' ) max_open_trades = 0 # need to reprocess data every time to populate signals preprocessed = self.strategy.ohlcvdata_to_dataframe(data) # Trim startup period from analyzed dataframe for pair, df in preprocessed.items(): preprocessed[pair] = trim_dataframe(df, timerange) min_date, max_date = history.get_timerange(preprocessed) logger.info( f'Backtesting with data from {min_date.strftime(DATETIME_PRINT_FORMAT)} ' f'up to {max_date.strftime(DATETIME_PRINT_FORMAT)} ' f'({(max_date - min_date).days} days)..') # Execute backtest and print results results = self.backtest( processed=preprocessed, stake_amount=self.config['stake_amount'], start_date=min_date.datetime, end_date=max_date.datetime, max_open_trades=max_open_trades, position_stacking=position_stacking, enable_protections=self.config.get('enable_protections', False), ) all_results[self.strategy.get_strategy_name()] = { 'results': results, 'config': self.strategy.config, 'locks': PairLocks.locks, } stats = generate_backtest_stats(data, all_results, min_date=min_date, max_date=max_date) if self.config.get('export', False): store_backtest_stats(self.config['exportfilename'], stats) # Show backtest results show_backtest_results(self.config, stats)