Refactor methods in backtesting

This commit is contained in:
Matthias
2023-04-28 16:09:09 +02:00
parent 0753f427b1
commit 6e395ad7c9
2 changed files with 15 additions and 13 deletions

View File

@@ -1,6 +1,6 @@
import logging import logging
from pathlib import Path from pathlib import Path
from typing import List, Optional from typing import List
import joblib import joblib
import pandas as pd import pandas as pd

View File

@@ -1252,8 +1252,8 @@ class Backtesting:
def backtest_one_strategy(self, strat: IStrategy, data: Dict[str, DataFrame], def backtest_one_strategy(self, strat: IStrategy, data: Dict[str, DataFrame],
timerange: TimeRange): timerange: TimeRange):
self.progress.init_step(BacktestState.ANALYZE, 0) self.progress.init_step(BacktestState.ANALYZE, 0)
strategy_name = strat.get_strategy_name()
logger.info(f"Running backtesting for Strategy {strat.get_strategy_name()}") logger.info(f"Running backtesting for Strategy {strategy_name}")
backtest_start_time = datetime.now(timezone.utc) backtest_start_time = datetime.now(timezone.utc)
self._set_strategy(strat) self._set_strategy(strat)
@@ -1288,20 +1288,23 @@ class Backtesting:
) )
backtest_end_time = datetime.now(timezone.utc) backtest_end_time = datetime.now(timezone.utc)
results.update({ results.update({
'run_id': self.run_ids.get(strat.get_strategy_name(), ''), 'run_id': self.run_ids.get(strategy_name, ''),
'backtest_start_time': int(backtest_start_time.timestamp()), 'backtest_start_time': int(backtest_start_time.timestamp()),
'backtest_end_time': int(backtest_end_time.timestamp()), 'backtest_end_time': int(backtest_end_time.timestamp()),
}) })
self.all_results[self.strategy.get_strategy_name()] = results self.all_results[strategy_name] = results
if (self.config.get('export', 'none') == 'signals' and if (self.config.get('export', 'none') == 'signals' and
self.dataprovider.runmode == RunMode.BACKTEST): self.dataprovider.runmode == RunMode.BACKTEST):
self._generate_trade_signal_candles(preprocessed_tmp, results) self.processed_dfs[strategy_name] = self._generate_trade_signal_candles(
self._generate_rejected_signals(preprocessed_tmp, self.rejected_dict) preprocessed_tmp, results)
self.rejected_df[strategy_name] = self._generate_rejected_signals(
preprocessed_tmp, self.rejected_dict)
return min_date, max_date return min_date, max_date
def _generate_trade_signal_candles(self, preprocessed_df, bt_results): def _generate_trade_signal_candles(self, preprocessed_df: Dict[str, pd.DataFrame],
bt_results: Dict[str, Any]) -> pd.DataFrame:
signal_candles_only = {} signal_candles_only = {}
for pair in preprocessed_df.keys(): for pair in preprocessed_df.keys():
signal_candles_only_df = DataFrame() signal_candles_only_df = DataFrame()
@@ -1319,10 +1322,10 @@ class Backtesting:
signal_inds.infer_objects()]) signal_inds.infer_objects()])
signal_candles_only[pair] = signal_candles_only_df signal_candles_only[pair] = signal_candles_only_df
return signal_candles_only
self.processed_dfs[self.strategy.get_strategy_name()] = signal_candles_only def _generate_rejected_signals(self, preprocessed_df: Dict[str, DataFrame],
rejected_dict: Dict[str, DataFrame]) -> Dict[str, DataFrame]:
def _generate_rejected_signals(self, preprocessed_df, rejected_dict):
rejected_candles_only = {} rejected_candles_only = {}
for pair, signals in rejected_dict.items(): for pair, signals in rejected_dict.items():
rejected_signals_only_df = DataFrame() rejected_signals_only_df = DataFrame()
@@ -1338,8 +1341,7 @@ class Backtesting:
data_df_row.infer_objects()]) data_df_row.infer_objects()])
rejected_candles_only[pair] = rejected_signals_only_df rejected_candles_only[pair] = rejected_signals_only_df
return rejected_candles_only
self.rejected_df[self.strategy.get_strategy_name()] = rejected_candles_only
def _get_min_cached_backtest_date(self): def _get_min_cached_backtest_date(self):
min_backtest_date = None min_backtest_date = None