diff --git a/freqtrade/freqai/data_kitchen.py b/freqtrade/freqai/data_kitchen.py index 3e9a8fed2..3ddc0892f 100644 --- a/freqtrade/freqai/data_kitchen.py +++ b/freqtrade/freqai/data_kitchen.py @@ -1308,14 +1308,17 @@ class FreqaiDataKitchen: pairs: List[str] = self.freqai_config["feature_parameters"].get( "include_corr_pairlist", []) - if not prediction_dataframe.empty: - dataframe = prediction_dataframe.copy() - for tf in tfs: + for tf in tfs: + if tf not in base_dataframes: base_dataframes[tf] = pd.DataFrame() + if not corr_dataframes.keys(): for p in pairs: if p not in corr_dataframes: corr_dataframes[p] = {} corr_dataframes[p][tf] = pd.DataFrame() + + if not prediction_dataframe.empty: + dataframe = prediction_dataframe.copy() else: dataframe = base_dataframes[self.config["timeframe"]].copy() diff --git a/freqtrade/freqai/freqai_interface.py b/freqtrade/freqai/freqai_interface.py index accd3373f..df4317095 100644 --- a/freqtrade/freqai/freqai_interface.py +++ b/freqtrade/freqai/freqai_interface.py @@ -271,14 +271,19 @@ class IFreqaiModel(ABC): self.pair_it += 1 train_it = 0 + pair = metadata["pair"] + populate_indicators = True + timerange = TimeRange.parse_timerange(self.dk.full_timerange) + self.dd.load_all_pair_histories(timerange, self.dk) + corr_df, base_df = self.dd.get_base_and_corr_dataframes(timerange, pair, dk) + # Loop enforcing the sliding window training/backtesting paradigm # tr_train is the training time range e.g. 1 historical month # tr_backtest is the backtesting time range e.g. the week directly # following tr_train. Both of these windows slide through the # entire backtest for tr_train, tr_backtest in zip(dk.training_timeranges, dk.backtesting_timeranges): - pair = metadata["pair"] (_, _, _) = self.dd.get_pair_dict_info(pair) train_it += 1 total_trains = len(dk.backtesting_timeranges) @@ -308,7 +313,8 @@ class IFreqaiModel(ABC): else: if populate_indicators: dataframe = self.dk.use_strategy_to_populate_indicators( - strategy, prediction_dataframe=dataframe, pair=metadata["pair"] + strategy, prediction_dataframe=dataframe, pair=metadata["pair"], + corr_dataframes=corr_df, base_dataframes=base_df ) populate_indicators = False @@ -323,7 +329,14 @@ class IFreqaiModel(ABC): if not self.model_exists(dk): dk.find_features(dataframe_train) dk.find_labels(dataframe_train) - self.model = self.train(dataframe_train, pair, dk) + + try: + self.model = self.train(dataframe_train, pair, dk) + except Exception as msg: + logger.warning( + f"Training {pair} raised exception {msg.__class__.__name__}. " + f"Message: {msg}, skipping.") + self.dd.pair_dict[pair]["trained_timestamp"] = int( tr_train.stopts) if self.plot_features: diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index af104f3d2..ac155b1f6 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -232,15 +232,14 @@ def test_start_backtesting(mocker, freqai_conf, model, num_files, strat, caplog) timerange = TimeRange.parse_timerange("20180110-20180130") freqai.dd.load_all_pair_histories(timerange, freqai.dk) sub_timerange = TimeRange.parse_timerange("20180110-20180130") - corr_df, base_df = freqai.dd.get_base_and_corr_dataframes(sub_timerange, "LTC/BTC", freqai.dk) + _, base_df = freqai.dd.get_base_and_corr_dataframes(sub_timerange, "LTC/BTC", freqai.dk) + df = base_df[freqai_conf["timeframe"]] - df = freqai.dk.use_strategy_to_populate_indicators(strategy, corr_df, base_df, "LTC/BTC") - df = freqai.cache_corr_pairlist_dfs(df, freqai.dk) for i in range(5): df[f'%-constant_{i}'] = i metadata = {"pair": "LTC/BTC"} - freqai.start_backtesting(df, metadata, freqai.dk) + freqai.start_backtesting(df, metadata, freqai.dk, strategy) model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()] assert len(model_folders) == num_files @@ -271,12 +270,11 @@ def test_start_backtesting_subdaily_backtest_period(mocker, freqai_conf): timerange = TimeRange.parse_timerange("20180110-20180130") freqai.dd.load_all_pair_histories(timerange, freqai.dk) sub_timerange = TimeRange.parse_timerange("20180110-20180130") - corr_df, base_df = freqai.dd.get_base_and_corr_dataframes(sub_timerange, "LTC/BTC", freqai.dk) - - df = freqai.dk.use_strategy_to_populate_indicators(strategy, corr_df, base_df, "LTC/BTC") + _, base_df = freqai.dd.get_base_and_corr_dataframes(sub_timerange, "LTC/BTC", freqai.dk) + df = base_df[freqai_conf["timeframe"]] metadata = {"pair": "LTC/BTC"} - freqai.start_backtesting(df, metadata, freqai.dk) + freqai.start_backtesting(df, metadata, freqai.dk, strategy) model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()] assert len(model_folders) == 9 @@ -297,14 +295,13 @@ def test_start_backtesting_from_existing_folder(mocker, freqai_conf, caplog): timerange = TimeRange.parse_timerange("20180110-20180130") freqai.dd.load_all_pair_histories(timerange, freqai.dk) sub_timerange = TimeRange.parse_timerange("20180110-20180130") - corr_df, base_df = freqai.dd.get_base_and_corr_dataframes(sub_timerange, "LTC/BTC", freqai.dk) - - df = freqai.dk.use_strategy_to_populate_indicators(strategy, corr_df, base_df, "LTC/BTC") + _, base_df = freqai.dd.get_base_and_corr_dataframes(sub_timerange, "LTC/BTC", freqai.dk) + df = base_df[freqai_conf["timeframe"]] pair = "ADA/BTC" metadata = {"pair": pair} freqai.dk.pair = pair - freqai.start_backtesting(df, metadata, freqai.dk) + freqai.start_backtesting(df, metadata, freqai.dk, strategy) model_folders = [x for x in freqai.dd.full_path.iterdir() if x.is_dir()] assert len(model_folders) == 2 @@ -322,14 +319,13 @@ def test_start_backtesting_from_existing_folder(mocker, freqai_conf, caplog): timerange = TimeRange.parse_timerange("20180110-20180130") freqai.dd.load_all_pair_histories(timerange, freqai.dk) sub_timerange = TimeRange.parse_timerange("20180110-20180130") - corr_df, base_df = freqai.dd.get_base_and_corr_dataframes(sub_timerange, "LTC/BTC", freqai.dk) - - df = freqai.dk.use_strategy_to_populate_indicators(strategy, corr_df, base_df, "LTC/BTC") + _, base_df = freqai.dd.get_base_and_corr_dataframes(sub_timerange, "LTC/BTC", freqai.dk) + df = base_df[freqai_conf["timeframe"]] pair = "ADA/BTC" metadata = {"pair": pair} freqai.dk.pair = pair - freqai.start_backtesting(df, metadata, freqai.dk) + freqai.start_backtesting(df, metadata, freqai.dk, strategy) assert log_has_re( "Found backtesting prediction file ", @@ -339,7 +335,7 @@ def test_start_backtesting_from_existing_folder(mocker, freqai_conf, caplog): pair = "ETH/BTC" metadata = {"pair": pair} freqai.dk.pair = pair - freqai.start_backtesting(df, metadata, freqai.dk) + freqai.start_backtesting(df, metadata, freqai.dk, strategy) path = (freqai.dd.full_path / freqai.dk.backtest_predictions_folder) prediction_files = [x for x in path.iterdir() if x.is_file()]