refactor: use 1 structure to save analysis signals
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user