diff --git a/config_examples/config_freqai.example.json b/config_examples/config_freqai.example.json index 6751002e4..d48e63dc1 100644 --- a/config_examples/config_freqai.example.json +++ b/config_examples/config_freqai.example.json @@ -54,6 +54,7 @@ "backtest_period_days": 7, "live_retrain_hours": 0, "identifier": "unique-id", + "warn_exceptions_on_backtest_only": true, "feature_parameters": { "include_timeframes": [ "3m", diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index 1ba58d3e8..1c8d47152 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -70,7 +70,7 @@ class IFreqaiModel(ABC): self.retrain = False self.first = True self.set_full_path() - self.save_backtest_models: bool = self.freqai_info.get("save_backtest_models", True) + self.save_backtest_models: bool = self.freqai_info.get("save_backtest_models", False) if self.save_backtest_models: logger.info("Backtesting module configured to save all models.") @@ -270,6 +270,26 @@ class IFreqaiModel(ABC): if self.freqai_info.get("write_metrics_to_disk", False): self.dd.save_metric_tracker_to_disk() + def _train_model(self, dataframe_train, pair, dk, tr_backtest): + try: + self.tb_logger = get_tb_logger( + self.dd.model_type, dk.data_path, self.activate_tensorboard + ) + model = self.train(dataframe_train, pair, dk) + self.tb_logger.close() + return model + except Exception as msg: + if self.freqai_info.get("warn_exceptions_on_backtest_only", False): + logger.warning( + f"Training {pair} raised exception {msg.__class__.__name__}. " + f"from {tr_backtest.start_fmt} to {tr_backtest.stop_fmt}." + f"Message: {msg}, skipping.", + exc_info=True, + ) + else: + raise + return None + def start_backtesting( self, dataframe: DataFrame, metadata: dict, dk: FreqaiDataKitchen, strategy: IStrategy ) -> FreqaiDataKitchen: @@ -366,37 +386,26 @@ class IFreqaiModel(ABC): if not self.model_exists(dk): dk.find_features(dataframe_train) dk.find_labels(dataframe_train) - - try: - self.tb_logger = get_tb_logger( - self.dd.model_type, dk.data_path, self.activate_tensorboard - ) - self.model = self.train(dataframe_train, pair, dk) - self.tb_logger.close() - except Exception as msg: - logger.warning( - f"Training {pair} raised exception {msg.__class__.__name__}. " - f"Message: {msg}, skipping.", - exc_info=True, - ) - self.model = None - - self.dd.pair_dict[pair]["trained_timestamp"] = int(tr_train.stopts) - if self.plot_features and self.model is not None: - plot_feature_importance(self.model, pair, dk, self.plot_features) - if self.save_backtest_models and self.model is not None: - logger.info("Saving backtest model to disk.") - self.dd.save_data(self.model, pair, dk) - else: - logger.info("Saving metadata to disk.") - self.dd.save_metadata(dk) + self.model = self._train_model(dataframe_train, pair, dk, tr_backtest) + + if self.model: + self.dd.pair_dict[pair]["trained_timestamp"] = int(tr_train.stopts) + if self.plot_features and self.model is not None: + plot_feature_importance(self.model, pair, dk, self.plot_features) + if self.save_backtest_models and self.model is not None: + logger.info("Saving backtest model to disk.") + self.dd.save_data(self.model, pair, dk) + else: + logger.info("Saving metadata to disk.") + self.dd.save_metadata(dk) else: self.model = self.dd.load_data(pair, dk) - pred_df, do_preds = self.predict(dataframe_backtest, dk) - append_df = dk.get_predictions_to_append(pred_df, do_preds, dataframe_backtest) - dk.append_predictions(append_df) - dk.save_backtesting_prediction(append_df) + if self.model and len(dataframe_backtest): + pred_df, do_preds = self.predict(dataframe_backtest, dk) + append_df = dk.get_predictions_to_append(pred_df, do_preds, dataframe_backtest) + dk.append_predictions(append_df) + dk.save_backtesting_prediction(append_df) self.backtesting_fit_live_predictions(dk) dk.fill_predictions(dataframe) @@ -840,7 +849,7 @@ class IFreqaiModel(ABC): :param pair: current pair :return: if the data exists or not """ - if self.config.get("freqai_backtest_live_models", False) and len_dataframe_backtest == 0: + if len_dataframe_backtest == 0: logger.info( f"No data found for pair {pair} from " f"from {tr_backtest.start_fmt} to {tr_backtest.stop_fmt}. "