refactor: use 1 structure to save analysis signals

This commit is contained in:
Matthias
2024-12-14 19:50:59 +01:00
parent 11f0a59031
commit 5744e16a07
3 changed files with 32 additions and 25 deletions
+13 -15
View File
@@ -121,10 +121,12 @@ class Backtesting:
self.run_ids: dict[str, str] = {} self.run_ids: dict[str, str] = {}
self.strategylist: list[IStrategy] = [] self.strategylist: list[IStrategy] = []
self.all_results: dict[str, dict] = {} self.all_results: dict[str, dict] = {}
self.processed_dfs: dict[str, dict] = {} self.analysis_results: dict[str, dict[str, DataFrame]] = {
"signals": {},
"rejected": {},
"exited": {},
}
self.rejected_dict: dict[str, list] = {} self.rejected_dict: dict[str, list] = {}
self.rejected_df: dict[str, dict] = {}
self.exited_dfs: dict[str, dict] = {}
self._exchange_name = self.config["exchange"]["name"] self._exchange_name = self.config["exchange"]["name"]
if not exchange: if not exchange:
@@ -1590,15 +1592,13 @@ class Backtesting:
self.config.get("export", "none") == "signals" self.config.get("export", "none") == "signals"
and self.dataprovider.runmode == RunMode.BACKTEST and self.dataprovider.runmode == RunMode.BACKTEST
): ):
self.processed_dfs[strategy_name] = generate_trade_signal_candles( signals = generate_trade_signal_candles(preprocessed_tmp, results, "open_date")
preprocessed_tmp, results, "open_date" rejected = generate_rejected_signals(preprocessed_tmp, self.rejected_dict)
) exited = generate_trade_signal_candles(preprocessed_tmp, results, "close_date")
self.rejected_df[strategy_name] = generate_rejected_signals(
preprocessed_tmp, self.rejected_dict self.analysis_results["signals"][strategy_name] = signals
) self.analysis_results["rejected"][strategy_name] = rejected
self.exited_dfs[strategy_name] = generate_trade_signal_candles( self.analysis_results["exited"][strategy_name] = exited
preprocessed_tmp, results, "close_date"
)
return min_date, max_date return min_date, max_date
@@ -1675,9 +1675,7 @@ class Backtesting:
): ):
store_backtest_analysis_results( store_backtest_analysis_results(
self.config["exportfilename"], self.config["exportfilename"],
self.processed_dfs, self.analysis_results,
self.rejected_df,
self.exited_dfs,
dt_appendix, dt_appendix,
) )
@@ -90,11 +90,9 @@ def _store_backtest_analysis_data(
def store_backtest_analysis_results( def store_backtest_analysis_results(
recordfilename: Path, recordfilename: Path,
candles: dict[str, dict], candles: dict[str, dict[str, DataFrame]],
trades: dict[str, dict],
exited: dict[str, dict],
dtappendix: str, dtappendix: str,
) -> None: ) -> None:
_store_backtest_analysis_data(recordfilename, candles, dtappendix, "signals") _store_backtest_analysis_data(recordfilename, candles["signals"], dtappendix, "signals")
_store_backtest_analysis_data(recordfilename, trades, dtappendix, "rejected") _store_backtest_analysis_data(recordfilename, candles["rejected"], dtappendix, "rejected")
_store_backtest_analysis_data(recordfilename, exited, dtappendix, "exited") _store_backtest_analysis_data(recordfilename, candles["exited"], dtappendix, "exited")
+15 -4
View File
@@ -293,7 +293,13 @@ def test_store_backtest_candles(testdatadir, mocker):
candle_dict = {"DefStrat": {"UNITTEST/BTC": pd.DataFrame()}} candle_dict = {"DefStrat": {"UNITTEST/BTC": pd.DataFrame()}}
# mock directory exporting # mock directory exporting
store_backtest_analysis_results(testdatadir, candle_dict, {}, {}, "2022_01_01_15_05_13") data = {
"signals": candle_dict,
"rejected": {},
"exited": {},
}
store_backtest_analysis_results(testdatadir, data, "2022_01_01_15_05_13")
assert dump_mock.call_count == 3 assert dump_mock.call_count == 3
assert isinstance(dump_mock.call_args_list[0][0][0], Path) assert isinstance(dump_mock.call_args_list[0][0][0], Path)
@@ -304,7 +310,7 @@ def test_store_backtest_candles(testdatadir, mocker):
dump_mock.reset_mock() dump_mock.reset_mock()
# mock file exporting # mock file exporting
filename = Path(testdatadir / "testresult") filename = Path(testdatadir / "testresult")
store_backtest_analysis_results(filename, candle_dict, {}, {}, "2022_01_01_15_05_13") store_backtest_analysis_results(filename, data, "2022_01_01_15_05_13")
assert dump_mock.call_count == 3 assert dump_mock.call_count == 3
assert isinstance(dump_mock.call_args_list[0][0][0], Path) assert isinstance(dump_mock.call_args_list[0][0][0], Path)
# result will be testdatadir / testresult-<timestamp>_signals.pkl # result will be testdatadir / testresult-<timestamp>_signals.pkl
@@ -320,7 +326,12 @@ def test_write_read_backtest_candles(tmp_path):
# test directory exporting # test directory exporting
sample_date = "2022_01_01_15_05_13" sample_date = "2022_01_01_15_05_13"
store_backtest_analysis_results(tmp_path, candle_dict, {}, {}, sample_date) data = {
"signals": candle_dict,
"rejected": {},
"exited": {},
}
store_backtest_analysis_results(tmp_path, data, sample_date)
stored_file = tmp_path / f"backtest-result-{sample_date}_signals.pkl" stored_file = tmp_path / f"backtest-result-{sample_date}_signals.pkl"
with stored_file.open("rb") as scp: with stored_file.open("rb") as scp:
pickled_signal_candles = joblib.load(scp) pickled_signal_candles = joblib.load(scp)
@@ -335,7 +346,7 @@ def test_write_read_backtest_candles(tmp_path):
# test file exporting # test file exporting
filename = tmp_path / "testresult" filename = tmp_path / "testresult"
store_backtest_analysis_results(filename, candle_dict, {}, {}, sample_date) store_backtest_analysis_results(filename, data, sample_date)
stored_file = tmp_path / f"testresult-{sample_date}_signals.pkl" stored_file = tmp_path / f"testresult-{sample_date}_signals.pkl"
with stored_file.open("rb") as scp: with stored_file.open("rb") as scp:
pickled_signal_candles = joblib.load(scp) pickled_signal_candles = joblib.load(scp)